use std::sync::OnceLock;
use tokio::sync::{mpsc, oneshot};
pub struct MintRequest {
pub video_id: String,
pub reply: oneshot::Sender<Result<String, String>>,
}
static MINTER: OnceLock<mpsc::UnboundedSender<MintRequest>> = OnceLock::new();
pub fn set_minter(
tx: mpsc::UnboundedSender<MintRequest>,
) -> Result<(), mpsc::UnboundedSender<MintRequest>> {
MINTER.set(tx)
}
pub fn is_available() -> bool {
MINTER.get().is_some()
}
#[tracing::instrument(name = "yt.mint_pot", fields(video_id = %video_id))]
pub async fn mint_content_pot(video_id: &str) -> Result<String, String> {
let tx = MINTER
.get()
.ok_or_else(|| "PO token minter not running — select a YouTube Music server".to_string())?;
let (reply, rx) = oneshot::channel();
tx.send(MintRequest {
video_id: video_id.to_string(),
reply,
})
.map_err(|_| "PO token minter channel closed".to_string())?;
match tokio::time::timeout(std::time::Duration::from_secs(15), rx).await {
Ok(Ok(result)) => result,
Ok(Err(_)) => Err("PO token minter dropped the reply".to_string()),
Err(_) => Err("PO token mint timed out (webview not ready)".to_string()),
}
}