refactor: 引入 clap 处理环境变量和命令行参数 (#119)

This commit is contained in:
ᴀᴍᴛᴏᴀᴇʀ
2024-06-08 10:57:08 +08:00
committed by GitHub
parent 1744f8647b
commit 4818e62414
7 changed files with 77 additions and 59 deletions
+1
View File
@@ -15,6 +15,7 @@ async-stream = { workspace = true }
bili_sync_entity = { workspace = true }
bili_sync_migration = { workspace = true }
chrono = { workspace = true }
clap = { workspace = true }
cookie = { workspace = true }
dirs = { workspace = true }
filenamify = { workspace = true }
+14
View File
@@ -30,6 +30,8 @@ pub static CONFIG: Lazy<Config> = Lazy::new(|| {
config
});
pub static ARGS: Lazy<Args> = Lazy::new(Args::parse);
pub static CONFIG_DIR: Lazy<PathBuf> =
Lazy::new(|| dirs::config_dir().expect("No config path found").join("bili-sync"));
@@ -138,3 +140,15 @@ impl Config {
Ok(())
}
}
use clap::Parser;
#[derive(Parser)]
#[command(version, about, long_about = None)]
pub struct Args {
#[arg(short, long, env = "SCAN_ONLY")]
pub scan_only: bool,
#[arg(short, long, default_value = "None,bili_sync=info", env = "RUST_LOG")]
pub log_level: String,
}
+2 -6
View File
@@ -1,5 +1,4 @@
use std::collections::HashMap;
use std::env::{args, var};
use std::path::{Path, PathBuf};
use std::pin::Pin;
@@ -8,7 +7,6 @@ use bili_sync_entity::{favorite, page, video};
use filenamify::filenamify;
use futures::stream::{FuturesOrdered, FuturesUnordered};
use futures::{pin_mut, Future, StreamExt};
use once_cell::sync::Lazy;
use sea_orm::entity::prelude::*;
use sea_orm::ActiveValue::Set;
use sea_orm::TransactionTrait;
@@ -17,7 +15,7 @@ use tokio::fs;
use tokio::sync::{Mutex, Semaphore};
use crate::bilibili::{BestStream, BiliClient, BiliError, Dimension, FavoriteList, PageInfo, Video};
use crate::config::CONFIG;
use crate::config::{ARGS, CONFIG};
use crate::core::status::{PageStatus, VideoStatus};
use crate::core::utils::{
create_video_pages, create_videos, exist_labels, filter_unfilled_videos, handle_favorite_info, total_video_count,
@@ -26,8 +24,6 @@ use crate::core::utils::{
use crate::downloader::Downloader;
use crate::error::{DownloadAbortError, ProcessPageError};
pub static SCAN_ONLY: Lazy<bool> = Lazy::new(|| var("SCAN_ONLY").is_ok() || args().any(|arg| arg == "--scan-only"));
/// 处理某个收藏夹,首先刷新收藏夹信息,然后下载收藏夹中未下载成功的视频
pub async fn process_favorite_list(
bili_client: &BiliClient,
@@ -37,7 +33,7 @@ pub async fn process_favorite_list(
) -> Result<()> {
let favorite_model = refresh_favorite_list(bili_client, fid, path, connection).await?;
let favorite_model = fetch_video_details(bili_client, favorite_model, connection).await?;
if *SCAN_ONLY {
if ARGS.scan_only {
warn!("已开启仅扫描模式,跳过视频下载...");
return Ok(());
}
+12
View File
@@ -15,6 +15,7 @@ use sea_orm::ActiveValue::Set;
use sea_orm::QuerySelect;
use serde_json::json;
use tokio::io::AsyncWriteExt;
use tracing_subscriber::util::SubscriberInitExt;
use crate::bilibili::{FavoriteListInfo, PageInfo, VideoInfo};
use crate::config::{NFOTimeType, CONFIG};
@@ -482,6 +483,17 @@ impl<'a> NFOSerializer<'a> {
}
}
pub fn init_logger(log_level: &str) {
tracing_subscriber::fmt::Subscriber::builder()
.with_env_filter(tracing_subscriber::EnvFilter::builder().parse_lossy(log_level))
.with_timer(tracing_subscriber::fmt::time::ChronoLocal::new(
"%Y-%m-%d %H:%M:%S%.3f".to_owned(),
))
.finish()
.try_init()
.expect("初始化日志失败");
}
#[cfg(test)]
mod tests {
use super::*;
+6 -13
View File
@@ -10,27 +10,20 @@ mod error;
use std::time::Duration;
use config::ARGS;
use once_cell::sync::Lazy;
use tokio::time;
use tracing_subscriber::util::SubscriberInitExt;
use crate::bilibili::BiliClient;
use crate::config::CONFIG;
use crate::core::command::{process_favorite_list, SCAN_ONLY};
use crate::core::command::process_favorite_list;
use crate::core::utils::init_logger;
use crate::database::{database_connection, migrate_database};
#[tokio::main]
async fn main() -> ! {
let default_log_level = std::env::var("RUST_LOG").unwrap_or("None,bili_sync=info".to_owned());
tracing_subscriber::fmt::Subscriber::builder()
.with_env_filter(tracing_subscriber::EnvFilter::builder().parse_lossy(default_log_level))
.with_timer(tracing_subscriber::fmt::time::ChronoLocal::new(
"%Y-%m-%d %H:%M:%S%.3f".to_owned(),
))
.finish()
.try_init()
.expect("初始化日志失败");
Lazy::force(&SCAN_ONLY);
async fn main() {
Lazy::force(&ARGS);
init_logger(&ARGS.log_level);
Lazy::force(&CONFIG);
let mut anchor = chrono::Local::now().date_naive();
let bili_client = BiliClient::new();