From 622d75c019e6fb5b9756ebd7507af843974658ce Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Sun, 9 Jul 2023 00:32:37 +0530 Subject: [PATCH] Keep playing available tracks if no specific track selected --- Cargo.lock | 2 +- Cargo.toml | 2 +- src/main.rs | 24 ++++++++++++++++++------ 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8def32b..715d398 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -989,7 +989,7 @@ checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "mfp" -version = "0.1.0" +version = "0.2.0" dependencies = [ "clap", "indicatif", diff --git a/Cargo.toml b/Cargo.toml index 65cdf3b..cff3d8e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "mfp" description = "A command-line utility for playing music mixes for programming & focus (from musicforprogramming.net), unlocking the flow state!" -version = "0.1.0" +version = "0.2.0" authors = ["Rohit Gupta"] edition = "2021" readme = "README.md" diff --git a/src/main.rs b/src/main.rs index 1c956c5..310fc29 100644 --- a/src/main.rs +++ b/src/main.rs @@ -13,13 +13,25 @@ use rodio::Source; use utils::parse_duration; use utils::play_audio_from_url; -fn play_random_episode(rss_feed: &Mfp, volume: u8) { +fn play_random_episodes(rss_feed: &mut Mfp, volume: u8) { let mut rng = thread_rng(); - if let Some(random_episode) = rss_feed.items.choose(&mut rng) { - play_episode(random_episode, volume); - } else { + if rss_feed.items.is_empty() { eprintln!("No Tracks found"); + return; + } + + loop { + if let Some(random_episode) = rss_feed.items.choose_mut(&mut rng) { + play_episode(random_episode, volume); + let played_title = random_episode.title.clone(); + rss_feed + .items + .retain(|episode| episode.title != played_title); + } else { + println!("All tracks have been played 🎶"); + return; + } } } @@ -43,7 +55,7 @@ fn main() { return eprintln!("Volume must be between 0 and 9"); } - let rss_feed = Mfp::new().expect("Failed to fetch RSS data"); + let mut rss_feed = Mfp::new().expect("Failed to fetch RSS data"); let total_tracks = rss_feed.items.len(); if let Some(requested_track_number) = args.track_number { @@ -56,6 +68,6 @@ fn main() { play_episode(episode, args.volume); } } else { - play_random_episode(&rss_feed, args.volume); + play_random_episodes(&mut rss_feed, args.volume); } }