Skip to main content

lavende_core/
lib.rs

1pub mod audio;
2pub mod common;
3pub mod config;
4pub mod events;
5pub mod gateway;
6pub mod pipeline;
7pub mod player;
8pub mod protocol;
9pub mod routeplanner;
10pub mod sources;
11pub mod transport;
12pub mod utils;
13
14pub use player::Player;
15
16use config::AppConfig;
17use sources::manager::SourceManager;
18use std::fs;
19use std::path::Path;
20use std::sync::OnceLock;
21
22static SOURCE_MANAGER: OnceLock<SourceManager> = OnceLock::new();
23
24pub fn get_source_manager() -> &'static SourceManager {
25    SOURCE_MANAGER.get_or_init(|| {
26        let mut config = AppConfig::default();
27        let path = Path::new("source.json");
28        if path.exists() {
29            if let Ok(raw) = fs::read_to_string(path) {
30                if let Ok(json_val) = serde_json::from_str::<serde_json::Value>(&raw) {
31                    if let Some(sources_val) = json_val.get("sources") {
32                        if let Ok(sources_cfg) = serde_json::from_value(sources_val.clone()) {
33                            config.sources = sources_cfg;
34                        }
35                    }
36                    if let Some(rp_val) = json_val.get("route_planner") {
37                        if let Ok(rp_cfg) = serde_json::from_value(rp_val.clone()) {
38                            config.route_planner = rp_cfg;
39                        }
40                    }
41                    if let Some(player_val) = json_val.get("player") {
42                        if let Ok(player_cfg) = serde_json::from_value(player_val.clone()) {
43                            config.player = player_cfg;
44                        }
45                    }
46                }
47            }
48        } else {
49            println!("Warning: source.json not found in current directory. Using default source configuration.");
50        }
51        let logging_cfg = config.logging.clone().unwrap_or_default();
52        common::logger::init(&logging_cfg);
53        SourceManager::new(&config)
54    })
55}
56
57pub async fn resolve_jiosaavn(url_or_token: String) -> Result<String, String> {
58    Ok(url_or_token)
59}
60
61pub async fn resolve_youtube(url_or_id: String) -> Result<String, String> {
62    Ok(url_or_id)
63}
64
65pub async fn load(identifier: String) -> Result<String, String> {
66    let sm = get_source_manager();
67    let res = sm.load(&identifier, None).await;
68    serde_json::to_string(&res).map_err(|e| e.to_string())
69}