use std::path::PathBuf; #[derive(Debug, Clone)] pub struct Settings { pub music_dir: PathBuf, pub search_size: usize, pub cache_ttl: u64, pub search_timeout: f64, pub meta_ttl: u64, pub match_threshold: f64, pub music_sources: Vec, pub port: u16, pub static_dir: PathBuf, } fn env_or(name: &str, default: &str) -> String { std::env::var(name) .ok() .map(|s| s.trim().to_string()) .filter(|s| !s.is_empty()) .unwrap_or_else(|| default.to_string()) } impl Settings { pub fn from_env() -> Self { let music_sources = env_or( "MUSIC_SOURCES", "MiguMusicClient,NeteaseMusicClient,QQMusicClient,KuwoMusicClient,QianqianMusicClient", ) .split(',') .map(|s| s.trim().to_string()) .filter(|s| !s.is_empty()) .collect(); Settings { music_dir: PathBuf::from(env_or("MUSIC_DIR", "./music")), search_size: env_or("SEARCH_SIZE", "10").parse().unwrap_or(10), cache_ttl: env_or("CACHE_TTL", "1800").parse().unwrap_or(1800), search_timeout: env_or("SEARCH_TIMEOUT", "30").parse().unwrap_or(30.0), meta_ttl: env_or("META_TTL", "3600").parse().unwrap_or(3600), match_threshold: env_or("MATCH_THRESHOLD", "0.45").parse().unwrap_or(0.45), music_sources, port: env_or("PORT", "8000").parse().unwrap_or(8000), static_dir: PathBuf::from(env_or("STATIC_DIR", "./static")), } } }