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}