From a5faefb533301fe450cfb7068b080fbc4589936c Mon Sep 17 00:00:00 2001 From: ForgQi <34411314+ForgQi@users.noreply.github.com> Date: Sat, 20 Sep 2025 21:43:51 +0800 Subject: [PATCH] Add QR code login and user management endpoints Introduces endpoints for QR code-based login and user management in the stream-gears server. Adds support for creating, deleting, and listing users, as well as endpoints for QR code generation and login via QR code. Refactors configuration management to use a global LazyLock, updates model serialization for streamer hooks, and improves context and service registration to support stateless clients. Also updates the frontend to handle new user and QR code flows, and adds an image resource for donation display in the README. --- .github/resource/Image.jpg | Bin 0 -> 191823 bytes Cargo.lock | 2 +- Cargo.toml | 2 +- README.md | 2 +- app/lib/use-streamers.ts | 1 + app/ui/QRcode.tsx | 11 +- app/ui/UserList.tsx | 12 +- crates/biliup-cli/src/downloader.rs | 2 +- crates/biliup-cli/src/server/api/endpoints.rs | 3 +- .../biliup-cli/src/server/config_manager.rs | 46 ++++---- crates/biliup-cli/src/server/event_manager.rs | 1 - .../upload_streamers_repository.rs | 1 - .../server/infrastructure/service_register.rs | 5 +- crates/biliup/src/downloader.rs | 3 - .../biliup/src/downloader/extractor/douyu.rs | 28 ++--- crates/biliup/src/downloader/httpflv.rs | 1 - crates/biliup/src/uploader/credential.rs | 2 +- crates/stream-gears/src/server.rs | 5 +- crates/stream-gears/src/server/api/auth.rs | 2 +- .../src/server/api/bilibili_endpoints.rs | 2 +- .../stream-gears/src/server/api/endpoints.rs | 108 ++++++++++++++++-- crates/stream-gears/src/server/app.rs | 5 +- crates/stream-gears/src/server/config.rs | 11 +- .../src/server/core/download_manager.rs | 9 +- .../server/infrastructure/connection_pool.rs | 2 +- .../src/server/infrastructure/context.rs | 35 +++--- .../src/server/infrastructure/models.rs | 37 +++--- .../src/server/infrastructure/repositories.rs | 26 +++-- .../server/infrastructure/service_register.rs | 39 ++++--- crates/stream-gears/src/server/router.rs | 16 ++- crates/stream-gears/src/server/util.rs | 7 +- 31 files changed, 265 insertions(+), 161 deletions(-) create mode 100644 .github/resource/Image.jpg diff --git a/.github/resource/Image.jpg b/.github/resource/Image.jpg new file mode 100644 index 0000000000000000000000000000000000000000..120b5d4b1d38452d37087e477b68723e27274c76 GIT binary patch literal 191823 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
= ({ onCancel, visible }) => { - const { trigger } = useSWRMutation('/v1/users', sendRequest) + const { trigger } = useSWRMutation('/v1/users', sendRequest) const { trigger: deleteUser } = useSWRMutation('/v1/users', requestDelete) const { biliUsers: list } = useBiliUsers() const [modalVisible, setVisible] = useState(false) @@ -55,10 +55,12 @@ const UserList: React.FC = ({ onCancel, visible }) => { throw new Error(ret.message) } await trigger({ - id: 0, - name: value, - value: value, - platform: 'bilibili-cookies', + // id: 0, + // name: value, + // value: value, + // platform: 'bilibili-cookies', + key: 'bilibili-cookies', + value: value }) setVisible(false) Toast.success('创建成功') diff --git a/crates/biliup-cli/src/downloader.rs b/crates/biliup-cli/src/downloader.rs index a5935fa..9fcddb6 100644 --- a/crates/biliup-cli/src/downloader.rs +++ b/crates/biliup-cli/src/downloader.rs @@ -137,7 +137,7 @@ pub fn generate_json(mut file_name: PathBuf) -> Result<()> { script_tag_count += 1; let (_, tag_data) = script_data(i).unwrap(); - + FlvTag { header: tag_header, data: TagDataHeader::Script(tag_data), diff --git a/crates/biliup-cli/src/server/api/endpoints.rs b/crates/biliup-cli/src/server/api/endpoints.rs index 841590e..36c8f1d 100644 --- a/crates/biliup-cli/src/server/api/endpoints.rs +++ b/crates/biliup-cli/src/server/api/endpoints.rs @@ -1,7 +1,6 @@ use crate::server::core::download_actor::DownloadActorHandle; use crate::server::core::live_streamers::{ - AddLiveStreamerDto, DynLiveStreamersService, LiveStreamerDto, - LiveStreamerEntity, + AddLiveStreamerDto, DynLiveStreamersService, LiveStreamerDto, LiveStreamerEntity, }; use crate::server::core::upload_streamers::{DynUploadStreamersRepository, StudioEntity}; use crate::server::core::users::User; diff --git a/crates/biliup-cli/src/server/config_manager.rs b/crates/biliup-cli/src/server/config_manager.rs index 5156929..5fc48d2 100644 --- a/crates/biliup-cli/src/server/config_manager.rs +++ b/crates/biliup-cli/src/server/config_manager.rs @@ -349,33 +349,35 @@ impl ConfigManager { let cookies_data: serde_json::Value = serde_json::from_str(&content)?; if let Some(cookie_info) = cookies_data.get("cookie_info") - && let Some(cookies) = cookie_info.get("cookies").and_then(|c| c.as_array()) { - let mut cookie_map = HashMap::new(); - for cookie in cookies { - if let (Some(name), Some(value)) = ( - cookie.get("name").and_then(|n| n.as_str()), - cookie.get("value").and_then(|v| v.as_str()), - ) { - cookie_map.insert(name.to_string(), value.to_string()); - } - } - - if self.config.user.is_none() { - self.config.user = Some(UserConfig { - cookies: None, - access_token: None, - }); - } - if let Some(ref mut user) = self.config.user { - user.cookies = Some(cookie_map); + && let Some(cookies) = cookie_info.get("cookies").and_then(|c| c.as_array()) + { + let mut cookie_map = HashMap::new(); + for cookie in cookies { + if let (Some(name), Some(value)) = ( + cookie.get("name").and_then(|n| n.as_str()), + cookie.get("value").and_then(|v| v.as_str()), + ) { + cookie_map.insert(name.to_string(), value.to_string()); } } + if self.config.user.is_none() { + self.config.user = Some(UserConfig { + cookies: None, + access_token: None, + }); + } + if let Some(ref mut user) = self.config.user { + user.cookies = Some(cookie_map); + } + } + if let Some(token_info) = cookies_data.get("token_info") && let Some(access_token) = token_info.get("access_token").and_then(|t| t.as_str()) - && let Some(ref mut user) = self.config.user { - user.access_token = Some(access_token.to_string()); - } + && let Some(ref mut user) = self.config.user + { + user.access_token = Some(access_token.to_string()); + } Ok(()) } diff --git a/crates/biliup-cli/src/server/event_manager.rs b/crates/biliup-cli/src/server/event_manager.rs index 05a252f..8b3901a 100644 --- a/crates/biliup-cli/src/server/event_manager.rs +++ b/crates/biliup-cli/src/server/event_manager.rs @@ -6,7 +6,6 @@ use std::sync::Arc; use tokio::sync::{RwLock, mpsc}; use tracing::{debug, error, info}; - /// 事件类型枚举,对应Python版本的事件 #[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)] pub enum EventType { diff --git a/crates/biliup-cli/src/server/infrastructure/repositories/upload_streamers_repository.rs b/crates/biliup-cli/src/server/infrastructure/repositories/upload_streamers_repository.rs index 1c22576..ab8afc0 100644 --- a/crates/biliup-cli/src/server/infrastructure/repositories/upload_streamers_repository.rs +++ b/crates/biliup-cli/src/server/infrastructure/repositories/upload_streamers_repository.rs @@ -1,6 +1,5 @@ use crate::server::infrastructure::connection_pool::ConnectionPool; - #[derive(Clone)] pub struct SqliteUploadStreamersRepository { pool: ConnectionPool, diff --git a/crates/biliup-cli/src/server/infrastructure/service_register.rs b/crates/biliup-cli/src/server/infrastructure/service_register.rs index 555e0f4..f73abe9 100644 --- a/crates/biliup-cli/src/server/infrastructure/service_register.rs +++ b/crates/biliup-cli/src/server/infrastructure/service_register.rs @@ -1,7 +1,4 @@ -use crate::server::core::live_streamers::{ - DynDownloadRecordsRepository, - DynVideosRepository, -}; +use crate::server::core::live_streamers::{DynDownloadRecordsRepository, DynVideosRepository}; use crate::server::core::upload_streamers::DynUploadRecordsRepository; use crate::server::infrastructure::connection_pool::ConnectionPool; use crate::server::infrastructure::repositories::download_records_repository::SqliteDownloadRecordsRepository; diff --git a/crates/biliup/src/downloader.rs b/crates/biliup/src/downloader.rs index 6f8a2b2..2af9d60 100644 --- a/crates/biliup/src/downloader.rs +++ b/crates/biliup/src/downloader.rs @@ -1,6 +1,3 @@ - - - pub mod error; pub mod extractor; pub mod flv_parser; diff --git a/crates/biliup/src/downloader/extractor/douyu.rs b/crates/biliup/src/downloader/extractor/douyu.rs index f89975a..93cbd60 100644 --- a/crates/biliup/src/downloader/extractor/douyu.rs +++ b/crates/biliup/src/downloader/extractor/douyu.rs @@ -76,20 +76,20 @@ impl SiteDefinition for DouyuLive { && let Some(key) = regex::Regex::new(r"(\d{1,8}[0-9a-zA-Z]+)_?\d{0,4}(/playlist|.m3u8)") .unwrap() .captures(&result["data"]["rtmp_live"].to_string()) - { - return Ok(Site { - name: "douyu", - title: room_info - .get("room") - .and_then(|room| room.get("room_name")) - .and_then(|name| name.as_str()) - .unwrap_or_default() - .to_string(), - direct_url: format!("https://hw-tct.douyucdn.cn/live/{}.flv?uuid=", &key[1]), - extension: Extension::Flv, - client, - }); - } + { + return Ok(Site { + name: "douyu", + title: room_info + .get("room") + .and_then(|room| room.get("room_name")) + .and_then(|name| name.as_str()) + .unwrap_or_default() + .to_string(), + direct_url: format!("https://hw-tct.douyucdn.cn/live/{}.flv?uuid=", &key[1]), + extension: Extension::Flv, + client, + }); + } Err(Error::Custom(result.to_string())) } diff --git a/crates/biliup/src/downloader/httpflv.rs b/crates/biliup/src/downloader/httpflv.rs index fc61c04..f355c5e 100644 --- a/crates/biliup/src/downloader/httpflv.rs +++ b/crates/biliup/src/downloader/httpflv.rs @@ -129,7 +129,6 @@ pub(crate) async fn parse_flv( } on_meta_data = Some((tag_header, bytes.clone(), previous_tag_size.clone())); - FlvTag { header: tag_header, data: TagDataHeader::Script(tag_data), diff --git a/crates/biliup/src/uploader/credential.rs b/crates/biliup/src/uploader/credential.rs index 8d62f45..9ae1f3e 100644 --- a/crates/biliup/src/uploader/credential.rs +++ b/crates/biliup/src/uploader/credential.rs @@ -113,7 +113,7 @@ pub struct LoginInfo { pub struct TokenInfo { pub access_token: String, expires_in: u32, - mid: u64, + pub mid: u64, refresh_token: String, } diff --git a/crates/stream-gears/src/server.rs b/crates/stream-gears/src/server.rs index 5556ae8..3a21859 100644 --- a/crates/stream-gears/src/server.rs +++ b/crates/stream-gears/src/server.rs @@ -56,9 +56,8 @@ async fn _main() -> AppResult<()> { let conn_pool = ConnectionManager::new_pool("data/data.sqlite3") .await .expect("could not initialize the database connection pool"); - - let configs = repositories::get_config(&conn_pool).await?; - let service_register = ServiceRegister::new(conn_pool, configs); + *config::CONFIG.write().unwrap() = repositories::get_config(&conn_pool).await?; + let service_register = ServiceRegister::new(conn_pool, config::CONFIG.clone()); let all_streamer = repositories::get_all_streamer(&service_register.pool).await?; let all_uploader = repositories::get_all_uploader(&service_register.pool).await?; diff --git a/crates/stream-gears/src/server/api/auth.rs b/crates/stream-gears/src/server/api/auth.rs index 1e543f2..840ac9a 100644 --- a/crates/stream-gears/src/server/api/auth.rs +++ b/crates/stream-gears/src/server/api/auth.rs @@ -92,7 +92,7 @@ mod post { mod get { use super::*; - + use tracing::error; // pub async fn login( diff --git a/crates/stream-gears/src/server/api/bilibili_endpoints.rs b/crates/stream-gears/src/server/api/bilibili_endpoints.rs index b5b8d18..25edb11 100644 --- a/crates/stream-gears/src/server/api/bilibili_endpoints.rs +++ b/crates/stream-gears/src/server/api/bilibili_endpoints.rs @@ -53,7 +53,7 @@ pub async fn get_myinfo_endpoint( } pub async fn get_proxy_endpoint( - Extension(client): Extension, + State(client): State, Query(params): Query>, ) -> Result { info!(params = ¶ms["url"]); diff --git a/crates/stream-gears/src/server/api/endpoints.rs b/crates/stream-gears/src/server/api/endpoints.rs index 9269b83..82c9907 100644 --- a/crates/stream-gears/src/server/api/endpoints.rs +++ b/crates/stream-gears/src/server/api/endpoints.rs @@ -1,23 +1,23 @@ -use crate::server::errors::{AppError, report_to_response}; -use std::sync::{Arc, RwLock}; - use crate::server::config::Config; +use crate::server::errors::{AppError, report_to_response, AppResult}; use crate::server::infrastructure::connection_pool::ConnectionPool; use crate::server::infrastructure::context::Worker; use crate::server::infrastructure::dto::LiveStreamerResponse; -use crate::server::infrastructure::models::{ - Configuration, FileItem, InsertLiveStreamer, InsertUploadStreamer, LiveStreamer, StreamerInfo, - UploadStreamer, -}; +use crate::server::infrastructure::models::{Configuration, FileItem, InsertConfiguration, InsertLiveStreamer, InsertUploadStreamer, LiveStreamer, StreamerInfo, UploadStreamer}; use crate::server::infrastructure::repositories::{del_streamer, get_all_streamer}; use crate::server::infrastructure::service_register::ServiceRegister; use axum::Json; use axum::extract::{Path, State}; use axum::http::StatusCode; use axum::response::{IntoResponse, Response}; +use biliup::credential::{Credential, LoginInfo}; use error_stack::ResultExt; use ormlite::{Insert, Model}; use serde_json::json; +use std::sync::{Arc, RwLock}; +use std::time::{Duration, UNIX_EPOCH}; +use tokio::fs; +use tokio::io::AsyncWriteExt; use tracing::info; pub async fn get_streamers_endpoint( @@ -244,6 +244,98 @@ pub async fn get_users_endpoint( Ok(Json(res)) } -pub async fn delete_user_endpoint(Path(id): Path) -> Result, Response> { +pub async fn add_user_endpoint( + State(pool): State, + Json(user): Json, +) -> Result, Response> { + let res = user.insert(&pool).await.change_context(AppError::Unknown).map_err(report_to_response)?; + Ok(Json(res)) +} + +pub async fn delete_user_endpoint(Path(id): Path, State(pool): State) -> Result, Response> { + let x = sqlx::query("DELETE FROM configuration WHERE id = ?") + .bind(id) + .execute(&pool).await.change_context(AppError::Unknown).map_err(report_to_response)?; + info!("{:?}", x); Ok(Json(())) } + +pub async fn get_qrcode() -> Result, Response> { + let qrcode = Credential::new(None) + .get_qrcode() + .await + .change_context(AppError::Unknown) + .map_err(report_to_response)?; + Ok(Json(qrcode)) +} + +pub async fn login_by_qrcode( + Json(value): Json, +) -> Result, Response> { + let info = tokio::time::timeout( + Duration::from_secs(300), + Credential::new(None).login_by_qrcode(value), + // std::future::pending::>(), + ) + .await + .change_context(AppError::Custom("deadline has elapsed".to_string())) + .map_err(report_to_response)? + .change_context(AppError::Unknown) + .map_err(report_to_response)?; + + // extract mid + let mid = info.token_info.mid; + let filename = format!("data/{}.json", mid); + + let mut file = fs::File::create(&filename) + .await + .change_context(AppError::Unknown) + .map_err(report_to_response)?; + file.write_all(&serde_json::to_vec_pretty(&info).unwrap()) + .await + .change_context(AppError::Unknown) + .map_err(report_to_response)?; + + Ok(Json(json!({ "filename": filename }))) +} + +pub async fn get_videos() -> Result>, Response> { + let media_extensions = [".mp4", ".flv", ".3gp", ".webm", ".mkv", ".ts"]; + let blacklist = ["next-env.d.ts"]; + + let mut file_list = Vec::new(); + let mut index = 1; + + // **use tokio::fs::read_dir** + if let Ok(mut entries) = fs::read_dir(".").await { + while let Ok(Some(entry)) = entries.next_entry().await { + let path = entry.path(); + let file_name = entry.file_name().to_string_lossy().into_owned(); + + if blacklist.contains(&file_name.as_str()) { + continue; + } + + if let Some(ext) = path.extension().and_then(|e| e.to_str()) { + if media_extensions.iter().any(|allowed| &ext == &allowed.trim_start_matches('.')) { + if let Ok(metadata) = entry.metadata().await { + let mtime = metadata.modified() + .ok() + .and_then(|time| time.duration_since(UNIX_EPOCH).ok()) + .map(|d| d.as_secs()) + .unwrap_or(0); + + file_list.push(serde_json::json!({ + "key": index, + "name": file_name, + "updateTime": mtime, + "size": metadata.len(), + })); + index += 1; + } + } + } + } + } + Ok(Json(file_list)) +} diff --git a/crates/stream-gears/src/server/app.rs b/crates/stream-gears/src/server/app.rs index dd14ae4..e33d37f 100644 --- a/crates/stream-gears/src/server/app.rs +++ b/crates/stream-gears/src/server/app.rs @@ -58,10 +58,9 @@ impl ApplicationController { // let app = protected::router() - let client = StatelessClient::default(); // let vec = service_register.streamers_service.get_streamers().await?; // build our application with a route - let enable_login_guard = true; + let enable_login_guard = false; let mut app = server::router::router(service_register); if enable_login_guard { app = app @@ -82,7 +81,7 @@ impl ApplicationController { .allow_origin("http://localhost:3000".parse::().unwrap()) .allow_methods(AllowMethods::any()), ) - .layer(Extension(client.clone())) + // .layer(Extension(client.clone())) .fallback(static_handler); // run our app with hyper // `axum::Server` is a re-export of `hyper::Server` diff --git a/crates/stream-gears/src/server/config.rs b/crates/stream-gears/src/server/config.rs index 436af3f..5e40d9f 100644 --- a/crates/stream-gears/src/server/config.rs +++ b/crates/stream-gears/src/server/config.rs @@ -7,8 +7,9 @@ use pyo3::types::{PyAnyMethods, PyDict}; use pyo3::{Bound, FromPyObject, PyAny, PyResult, Python, pyclass, pyfunction, pymethods}; use pythonize::pythonize; use serde::{Deserialize, Serialize}; +use std::cell::LazyCell; use std::ops::Deref; -use std::sync::{Arc, OnceLock, RwLock}; +use std::sync::{Arc, LazyLock, OnceLock, RwLock}; use std::{collections::HashMap, path::Path, path::PathBuf}; #[derive(bon::Builder, Debug, Clone, Serialize, Deserialize)] @@ -329,10 +330,14 @@ impl Config { } // 进程级全局单例(安全):OnceLock + Arc + RwLock -pub(crate) static CONFIG: OnceLock>> = OnceLock::new(); +pub(crate) static CONFIG: LazyLock>> = LazyLock::new(|| { + Arc::new(RwLock::new( + Config::builder().streamers(Default::default()).build(), + )) +}); fn cfg_arc() -> &'static Arc> { - CONFIG.get().expect("Config not initialized") + &*CONFIG } #[pyclass] diff --git a/crates/stream-gears/src/server/core/download_manager.rs b/crates/stream-gears/src/server/core/download_manager.rs index 54f1906..489838a 100644 --- a/crates/stream-gears/src/server/core/download_manager.rs +++ b/crates/stream-gears/src/server/core/download_manager.rs @@ -126,7 +126,7 @@ impl UActor { return; }; let config = worker.get_config().await.unwrap(); - let client = StatelessClient::default(); + let client = worker.context.client.clone(); let line = config.lines; let line = match line.as_str() { "bda2" => line::bda2(), @@ -199,9 +199,10 @@ impl UActor { if !studio.cover.is_empty() && let Ok(c) = &std::fs::read(&studio.cover).map_err(|e| error!(e=?e)) - && let Ok(url) = bilibili.cover_up(c).await.map_err(|e| error!(e=?e)) { - studio.cover = url; - }; + && let Ok(url) = bilibili.cover_up(c).await.map_err(|e| error!(e=?e)) + { + studio.cover = url; + }; let submit = match config.submit_api { Some(submit) => SubmitOption::from_str(&submit).unwrap_or(SubmitOption::App), diff --git a/crates/stream-gears/src/server/infrastructure/connection_pool.rs b/crates/stream-gears/src/server/infrastructure/connection_pool.rs index 7148d7d..a191015 100644 --- a/crates/stream-gears/src/server/infrastructure/connection_pool.rs +++ b/crates/stream-gears/src/server/infrastructure/connection_pool.rs @@ -1,7 +1,7 @@ -use std::path::Path; use anyhow::{Context, Result}; use sqlx::sqlite::SqlitePoolOptions; use sqlx::{Pool, Sqlite}; +use std::path::Path; use tracing::info; pub type ConnectionPool = Pool; diff --git a/crates/stream-gears/src/server/infrastructure/context.rs b/crates/stream-gears/src/server/infrastructure/context.rs index 2c0a08d..6e6bc8a 100644 --- a/crates/stream-gears/src/server/infrastructure/context.rs +++ b/crates/stream-gears/src/server/infrastructure/context.rs @@ -3,29 +3,26 @@ use crate::server::errors::{AppError, AppResult}; use crate::server::infrastructure::connection_pool::ConnectionPool; use crate::server::infrastructure::models::{Configuration, LiveStreamer, UploadStreamer}; use crate::server::infrastructure::repositories::{get_config, get_streamer}; +use biliup::client::StatelessClient; use error_stack::ResultExt; use ormlite::Model; use serde::{Deserialize, Serialize}; use std::sync::RwLock; use tracing::info; +#[derive(Debug)] pub struct Context { - uploads: Vec, - configuration: Configuration, - streamers: Vec, + pool: ConnectionPool, + pub client: StatelessClient, } impl Context { - pub fn new( - uploads: Vec, - configuration: Configuration, - streamers: Vec, - ) -> Self { - Self { - uploads, - configuration, - streamers, - } + pub fn new(pool: ConnectionPool, client: StatelessClient) -> Self { + Self { pool, client } + } + + pub async fn get_config(&self) -> AppResult { + get_config(&self.pool).await } } @@ -33,16 +30,16 @@ impl Context { pub struct Worker { pub(crate) id: i64, pub url: String, - pool: ConnectionPool, + pub context: Context, pub downloader_status: RwLock, pub uploader_status: RwLock, } impl Worker { - pub fn new(id: i64, url: &str, pool: ConnectionPool) -> Self { + pub fn new(id: i64, url: &str, context: Context) -> Self { Self { id, - pool, + context, downloader_status: RwLock::new(Default::default()), uploader_status: Default::default(), url: url.to_string(), @@ -50,11 +47,11 @@ impl Worker { } pub async fn get_streamer(&self) -> AppResult { - get_streamer(&self.pool, self.id).await + get_streamer(&self.context.pool, self.id).await } pub async fn get_config(&self) -> AppResult { - get_config(&self.pool).await + self.context.get_config().await } pub async fn get_upload_config(&self) -> AppResult> { @@ -65,7 +62,7 @@ impl Worker { UploadStreamer::select() .where_("id = ?") .bind(id) - .fetch_optional(&self.pool) + .fetch_optional(&self.context.pool) .await .change_context(AppError::Unknown) } diff --git a/crates/stream-gears/src/server/infrastructure/models.rs b/crates/stream-gears/src/server/infrastructure/models.rs index 7c9027a..93b8880 100644 --- a/crates/stream-gears/src/server/infrastructure/models.rs +++ b/crates/stream-gears/src/server/infrastructure/models.rs @@ -61,12 +61,14 @@ pub struct LiveStreamer { // #[ormlite(json)] 数据库空与json空有区别所以这里不能用 // pub preprocessor: Option>, // 只能使用 sqlx::types::Json - pub preprocessor: sqlx::types::Json>>, - - pub segment_processor: sqlx::types::Json>>, - - pub downloaded_processor: sqlx::types::Json>>, - pub postprocessor: sqlx::types::Json>>, + #[ormlite(json)] + pub preprocessor: Option>, + #[ormlite(json)] + pub segment_processor: Option>, + #[ormlite(json)] + pub downloaded_processor: Option>, + #[ormlite(json)] + pub postprocessor: Option>, pub opt_args: Option, pub excluded_keywords: Option, } @@ -80,7 +82,7 @@ pub struct FileItem { } #[derive(Model, Debug, Clone, Serialize, Deserialize)] -#[ormlite(table = "configuration", insert = "InsertConfiguration")] +#[ormlite(table = "configuration")] pub struct Configuration { pub id: i64, pub key: String, @@ -110,12 +112,14 @@ pub struct InsertLiveStreamer { // #[ormlite(json)] 数据库空与json空有区别所以这里不能用 // pub preprocessor: Option>, // 只能使用 sqlx::types::Json - pub preprocessor: sqlx::types::Json>>, - - pub segment_processor: sqlx::types::Json>>, - - pub downloaded_processor: sqlx::types::Json>>, - pub postprocessor: sqlx::types::Json>>, + #[ormlite(json)] + pub preprocessor: Option>, + #[ormlite(json)] + pub segment_processor: Option>, + #[ormlite(json)] + pub downloaded_processor: Option>, + #[ormlite(json)] + pub postprocessor: Option>, pub opt_args: Option, pub excluded_keywords: Option, } @@ -148,3 +152,10 @@ pub struct InsertUploadStreamer { pub extra_fields: Option, pub is_only_self: Option, } + +#[derive(Insert, Debug, Clone, Serialize, Deserialize)] +#[ormlite(returns = "Configuration")] +pub struct InsertConfiguration { + pub key: String, + pub value: String, // TEXT +} diff --git a/crates/stream-gears/src/server/infrastructure/repositories.rs b/crates/stream-gears/src/server/infrastructure/repositories.rs index f03bb80..832c9f9 100644 --- a/crates/stream-gears/src/server/infrastructure/repositories.rs +++ b/crates/stream-gears/src/server/infrastructure/repositories.rs @@ -1,7 +1,9 @@ use crate::server::config::Config; use crate::server::errors::{AppError, AppResult}; use crate::server::infrastructure::connection_pool::ConnectionPool; -use crate::server::infrastructure::models::{Configuration, InsertConfiguration, LiveStreamer, UploadStreamer}; +use crate::server::infrastructure::models::{ + Configuration, InsertConfiguration, LiveStreamer, UploadStreamer, +}; use error_stack::ResultExt; use ormlite::{Insert, Model}; @@ -41,18 +43,20 @@ pub async fn get_config(pool: &ConnectionPool) -> AppResult { serde_json::from_str(&configuration.value).change_context(AppError::Unknown)?; Ok(json) } else { - let config = Config::builder() - .streamers(Default::default()) - .build(); - let configuration = InsertConfiguration { - key: "config".to_string(), - value: serde_json::to_string(&config).unwrap(), - }.insert(pool).await.change_context(AppError::Unknown)?; - let json: Config = - serde_json::from_str(&configuration.value).change_context(AppError::Unknown)?; - Ok(json) + let config = Config::builder().streamers(Default::default()).build(); + Ok(config) } +} +pub async fn insert_config(pool: &ConnectionPool, config: &Config) -> AppResult { + let configuration = InsertConfiguration { + key: "config".to_string(), + value: serde_json::to_string(config).unwrap(), + } + .insert(pool) + .await + .change_context(AppError::Unknown)?; + Ok(configuration) } pub async fn get_all_uploader(pool: &ConnectionPool) -> AppResult> { diff --git a/crates/stream-gears/src/server/infrastructure/service_register.rs b/crates/stream-gears/src/server/infrastructure/service_register.rs index f8a4dfd..51e6f63 100644 --- a/crates/stream-gears/src/server/infrastructure/service_register.rs +++ b/crates/stream-gears/src/server/infrastructure/service_register.rs @@ -5,8 +5,11 @@ use crate::server::core::monitor::Monitor; use crate::server::core::plugin; use crate::server::errors::{AppError, AppResult}; use crate::server::infrastructure::connection_pool::ConnectionPool; -use crate::server::infrastructure::context::Worker; +use crate::server::infrastructure::context::{Context, Worker}; +use crate::server::infrastructure::repositories; use axum::extract::FromRef; +use biliup::client::StatelessClient; +use biliup::credential::Credential; use error_stack::bail; use ormlite::Model; use std::sync::{Arc, RwLock}; @@ -19,27 +22,19 @@ pub struct ServiceRegister { pub managers: Arc>, pub config: Arc>, pub actor_handle: Arc, + pub client: StatelessClient, } /// A simple service container responsible for managing the various services our API endpoints will pull from through axum extensions. impl ServiceRegister { - pub fn new(pool: ConnectionPool, config: Config) -> Self { + pub fn new(pool: ConnectionPool, config: Arc>) -> Self { info!("initializing utility services..."); + let client = StatelessClient::default(); - let cf = config::CONFIG.get_or_init(|| { - Arc::new(RwLock::new(config)) - // Arc::new(RwLock::new(Config::builder() - // // .user(UserConfig::default()) - // // .douyu_cdn("hw-h5".to_string()) - // // .douyu_rate(0) - // .streamers(HashMap::::new()) - // .build())) - }); - - info!(config=?cf); + info!(config=?config); let actor_handle = Arc::new(ActorHandle::new( - cf.read().unwrap().pool1_size, - cf.read().unwrap().pool2_size, + config.read().unwrap().pool1_size, + config.read().unwrap().pool2_size, )); info!("utility services initialized, building feature services..."); @@ -52,13 +47,17 @@ impl ServiceRegister { pool, workers: Arc::new(Default::default()), managers: Arc::new(vec), - config: cf.clone(), + config: config.clone(), actor_handle, + client, } } pub fn get_manager(&self, url: &str) -> Option<&DownloadManager> { - self.managers.iter().find(|&manager| manager.matches(url)).map(|v| v as _) + self.managers + .iter() + .find(|&manager| manager.matches(url)) + .map(|v| v as _) } pub async fn add_room( @@ -67,7 +66,11 @@ impl ServiceRegister { url: &str, monitor: Arc, ) -> AppResult> { - let worker = Arc::new(Worker::new(id, url, self.pool.clone())); + let worker = Arc::new(Worker::new( + id, + url, + Context::new(self.pool.clone(), self.client.clone()), + )); monitor.rooms_handle.add(worker.clone()).await; self.workers.write().unwrap().push(worker); info!("add {url} success"); diff --git a/crates/stream-gears/src/server/router.rs b/crates/stream-gears/src/server/router.rs index 35308c0..7b220fa 100644 --- a/crates/stream-gears/src/server/router.rs +++ b/crates/stream-gears/src/server/router.rs @@ -1,15 +1,10 @@ use crate::server::api::bilibili_endpoints::{ archive_pre_endpoint, get_myinfo_endpoint, get_proxy_endpoint, }; -use crate::server::api::endpoints::{ - add_upload_streamer_endpoint, delete_streamers_endpoint, delete_template_endpoint, - delete_user_endpoint, get_configuration, get_streamer_info, get_streamers_endpoint, - get_upload_streamer_endpoint, get_upload_streamers_endpoint, get_users_endpoint, - post_streamers_endpoint, put_streamers_endpoint, -}; +use crate::server::api::endpoints::{add_upload_streamer_endpoint, add_user_endpoint, delete_streamers_endpoint, delete_template_endpoint, delete_user_endpoint, get_configuration, get_qrcode, get_streamer_info, get_streamers_endpoint, get_upload_streamer_endpoint, get_upload_streamers_endpoint, get_users_endpoint, get_videos, login_by_qrcode, post_streamers_endpoint, put_streamers_endpoint}; use crate::server::infrastructure::service_register::ServiceRegister; -use axum::routing::{delete, get, post}; use axum::Router; +use axum::routing::{delete, get, post}; pub fn router(service_register: ServiceRegister) -> Router<()> { Router::new() @@ -42,13 +37,16 @@ pub fn router(service_register: ServiceRegister) -> Router<()> { .route("/v1/upload/streamers", post(add_upload_streamer_endpoint)) .route( "/v1/users", - get(get_users_endpoint), // .post(add_user_endpoint) + get(get_users_endpoint) + .post(add_user_endpoint), ) .route("/v1/users/{id}", delete(delete_user_endpoint)) .route("/bili/archive/pre", get(archive_pre_endpoint)) .route("/bili/space/myinfo", get(get_myinfo_endpoint)) .route("/bili/proxy", get(get_proxy_endpoint)) - // .route("/", get(root)) + .route("/v1/get_qrcode", get(get_qrcode)) + .route("/v1/login_by_qrcode", post(login_by_qrcode)) + .route("/v1/videos", get(get_videos)) // .layer(Extension(client.clone())) .with_state(service_register) } diff --git a/crates/stream-gears/src/server/util.rs b/crates/stream-gears/src/server/util.rs index 7a0929a..4fcf270 100644 --- a/crates/stream-gears/src/server/util.rs +++ b/crates/stream-gears/src/server/util.rs @@ -104,9 +104,10 @@ pub fn media_ext_from_url(input: &str) -> Option { // a) 从最后一个 path segment 取扩展名 if let Some(seg) = url.path_segments().and_then(|mut s| s.next_back()) && let Some((_, ext)) = seg.rsplit_once('.') - && let Some(ext) = clean_ext(ext) { - return Some(ext); - } + && let Some(ext) = clean_ext(ext) + { + return Some(ext); + } // b) 常见 query 参数中找一次(不重复多轮扫描),忽略大小写 let keys = ["format", "type", "ext", "filetype", "fmt"];

l1|`8b8aBvz{D1q8wSp@mxA)BKwj_Xrt}8;g)! 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 literal 0 HcmV?d00001 diff --git a/Cargo.lock b/Cargo.lock index da158fe..361d578 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3617,7 +3617,7 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "stream-gears" -version = "1.1.1" +version = "1.1.2" dependencies = [ "anyhow", "async-channel", diff --git a/Cargo.toml b/Cargo.toml index 29094d4..a98c51d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,7 +7,7 @@ members = [ resolver = "3" [workspace.package] -version = "1.1.1" +version = "1.1.2" [workspace.dependencies] serde = { version = "1.0", features = ["derive"] } diff --git a/README.md b/README.md index 9cd0cd9..ba35e24 100644 --- a/README.md +++ b/README.md @@ -74,8 +74,8 @@ ## 💴捐赠 +![支付宝](.github/resource/Image.jpg) [爱发电 »](https://afdian.com/a/biliup) - ## ⭐Stars [![Star History Chart](https://api.star-history.com/svg?repos=biliup/biliup&type=Date)](https://star-history.com/#biliup/biliup&Date) diff --git a/app/lib/use-streamers.ts b/app/lib/use-streamers.ts index 45c02b5..34cb438 100644 --- a/app/lib/use-streamers.ts +++ b/app/lib/use-streamers.ts @@ -23,6 +23,7 @@ export function useBiliUsers() { const [list, setList] = useState([]); useEffect(() => { if (!data || data.length === 0) { + setList([]) return; } const updateList = async (item: User) => { diff --git a/app/ui/QRcode.tsx b/app/ui/QRcode.tsx index a5e94c5..4329248 100644 --- a/app/ui/QRcode.tsx +++ b/app/ui/QRcode.tsx @@ -29,16 +29,11 @@ const Qrcode: React.FC = ({ onSuccess }) => { body: JSON.stringify(qrData), signal: signal, }) - if (!(res.status >= 200 && res.status < 300)) { - throw new Error(await res.text()) - } const data = await res.json() - if (!res.ok) { - throw new Error(data.message) - } onSuccess(data['filename']) })().catch(e => { console.log(e) + setUrl(e.message) Notification.error({ title: 'QRcode', content: {e.message}, @@ -53,6 +48,10 @@ const Qrcode: React.FC = ({ onSuccess }) => { if (url === '') { return } + + if (!url.startsWith("http")) { + return <> {url} + } return (