// NewPipe singleton — mirrors NPE NewPipe.java. // // Holds the process-global Downloader + preferred Localization + // preferred ContentCountry. init() once at startup, then call sites read // the globals through these getters. // // Concrete service registration lands in Phase 3+ once YoutubeService // exists. Phase 1 only wires the globals. use std::sync::Arc; use parking_lot::RwLock; use crate::downloader::Downloader; use crate::localization::{ContentCountry, Localization}; pub struct NewPipe { downloader: RwLock>>, preferred_localization: RwLock, preferred_content_country: RwLock, } impl NewPipe { pub fn instance() -> &'static NewPipe { use once_cell::sync::Lazy; static INSTANCE: Lazy = Lazy::new(|| NewPipe { downloader: RwLock::new(None), preferred_localization: RwLock::new(Localization::default()), preferred_content_country: RwLock::new(ContentCountry::default()), }); &INSTANCE } pub fn init(downloader: Arc) { *Self::instance().downloader.write() = Some(downloader); } pub fn init_full( downloader: Arc, localization: Localization, content_country: ContentCountry, ) { let np = Self::instance(); *np.downloader.write() = Some(downloader); *np.preferred_localization.write() = localization; *np.preferred_content_country.write() = content_country; } pub fn downloader() -> Option> { Self::instance().downloader.read().clone() } pub fn preferred_localization() -> Localization { Self::instance().preferred_localization.read().clone() } pub fn preferred_content_country() -> ContentCountry { Self::instance().preferred_content_country.read().clone() } pub fn set_preferred_localization(localization: Localization) { *Self::instance().preferred_localization.write() = localization; } pub fn set_preferred_content_country(content_country: ContentCountry) { *Self::instance().preferred_content_country.write() = content_country; } }