diff --git a/crates/qbzd/src/config.rs b/crates/qbzd/src/config.rs index 3e5153fa8..dfd702331 100644 --- a/crates/qbzd/src/config.rs +++ b/crates/qbzd/src/config.rs @@ -257,3 +257,21 @@ pub fn generate_token() -> String { .as_nanos(); format!("{:032x}", seed) } + +/// Save config to the default config path (creates dir if needed). +pub fn save_default_config(config: &DaemonConfig) -> Result<(), String> { + let config_dir = dirs::config_dir() + .ok_or("Could not determine config directory")? + .join("qbz"); + std::fs::create_dir_all(&config_dir) + .map_err(|e| format!("Failed to create config dir: {}", e))?; + + let path = config_dir.join("qbzd.toml"); + let content = toml::to_string_pretty(config) + .map_err(|e| format!("Failed to serialize config: {}", e))?; + std::fs::write(&path, content) + .map_err(|e| format!("Failed to write config: {}", e))?; + + log::info!("[qbzd] Config saved to {}", path.display()); + Ok(()) +} diff --git a/crates/qbzd/src/main.rs b/crates/qbzd/src/main.rs index 57ac10629..49982e1f3 100644 --- a/crates/qbzd/src/main.rs +++ b/crates/qbzd/src/main.rs @@ -57,6 +57,12 @@ enum Commands { Status, /// Show or regenerate API token Token, + /// Interactive setup wizard (audio, playback, integrations) + Setup { + /// Run only a specific section (audio, playback, cache, integrations, qconnect) + #[arg(long)] + section: Option, + }, } #[tokio::main] @@ -124,6 +130,13 @@ async fn main() { } } } + Some(Commands::Setup { section }) => { + eprintln!("TUI setup wizard not yet implemented."); + if let Some(s) = section { + eprintln!("Requested section: {}", s); + } + eprintln!("Use the HTTP API or qbzd.toml to configure for now."); + } Some(Commands::Token) => { if cfg.server.token == "auto" { let token = config::generate_token();