diff --git a/src/colors.rs b/src/colors.rs index d0b1a5a..b946ea7 100644 --- a/src/colors.rs +++ b/src/colors.rs @@ -1,2 +1,20 @@ +#[allow(dead_code)] pub(crate) const BLURPLE: u32 = 0x58_65_F2; +#[allow(dead_code)] pub(crate) const YELLOW: u32 = 0xFE_E7_5C; +#[allow(dead_code)] +pub(crate) const WHITE: u32 = 0xFF_FF_FF; +#[allow(dead_code)] +pub(crate) const GREYPLE: u32 = 0x99_AA_B5; +#[allow(dead_code)] +pub(crate) const BLACK: u32 = 0x23_27_2A; +#[allow(dead_code)] +pub(crate) const DARK_BUT_NOT_BLACK: u32 = 0x2C_2F_33; +#[allow(dead_code)] +pub(crate) const NOT_QUITE_BLACK: u32 = 0x23_27_2A; +#[allow(dead_code)] +pub(crate) const GREEN: u32 = 0x57_F2_87; +#[allow(dead_code)] +pub(crate) const FUCHSIA: u32 = 0xEB_45_9E; +#[allow(dead_code)] +pub(crate) const RED: u32 = 0xED_42_45; diff --git a/src/commands/play.rs b/src/commands/play.rs index d97e9a6..9ef9c5e 100644 --- a/src/commands/play.rs +++ b/src/commands/play.rs @@ -47,6 +47,15 @@ async fn get_tracks( .map_while(Result::ok) .flat_map(|line| serde_json::from_str(&line)) .collect(); + + if tracks.is_empty() { + if let Ok(stderr) = String::from_utf8(output.stderr) { + if stderr.contains("This video is only available to Music Premium members") { + return Err("This video is only available to Music Premium members".into()); + } + } + return Err("No tracks found".into()); + } tracing::debug!("tracks: {:?}", tracks); Ok(tracks) } @@ -99,7 +108,23 @@ pub(crate) async fn play( debug!("query: {:?}", query); - let tracks = get_tracks(query).await?; + let tracks = match get_tracks(query).await { + Err(e) => { + let content = format!("{}", e); + let embeds = vec![EmbedBuilder::new() + .description(content) + .color(colors::RED) + .build()]; + state + .http + .interaction(interaction.application_id) + .update_response(&interaction.token) + .embeds(Some(&embeds))? + .await?; + return Ok(()); + } + Ok(tracks) => tracks, + }; if tracks.len() > 1 { let first_track = tracks.first().unwrap(); @@ -140,11 +165,6 @@ pub(crate) async fn play( let mut src = YoutubeDl::new(reqwest::Client::new(), url.clone()); let src_copy = src.clone(); let track: Track = src_copy.into(); - //state - // .tracks - // .entry(guild_id) - // .or_default() - // .insert(track.uuid, src); if let Ok(metadata) = src.aux_metadata().await { debug!("metadata: {:?}", metadata); @@ -239,4 +259,19 @@ mod tests { assert!(!tracks.is_empty()); } } + + #[tokio::test] + async fn test_premium_tracks() { + let urls = ["https://www.youtube.com/watch?v=QgMZRmxQ0Dc"]; + for url in urls.iter() { + println!("url: {:?}", url); + let tracks = get_tracks(url.to_string()).await; + assert!(tracks.is_err()); + assert!(tracks + .err() + .unwrap() + .to_string() + .contains("This video is only available to Music Premium members")); + } + } }