@@ -13,13 +13,25 @@ use rodio::Source;
13
13
use utils:: parse_duration;
14
14
use utils:: play_audio_from_url;
15
15
16
- fn play_random_episode ( rss_feed : & Mfp , volume : u8 ) {
16
+ fn play_random_episodes ( rss_feed : & mut Mfp , volume : u8 ) {
17
17
let mut rng = thread_rng ( ) ;
18
18
19
- if let Some ( random_episode) = rss_feed. items . choose ( & mut rng) {
20
- play_episode ( random_episode, volume) ;
21
- } else {
19
+ if rss_feed. items . is_empty ( ) {
22
20
eprintln ! ( "No Tracks found" ) ;
21
+ return ;
22
+ }
23
+
24
+ loop {
25
+ if let Some ( random_episode) = rss_feed. items . choose_mut ( & mut rng) {
26
+ play_episode ( random_episode, volume) ;
27
+ let played_title = random_episode. title . clone ( ) ;
28
+ rss_feed
29
+ . items
30
+ . retain ( |episode| episode. title != played_title) ;
31
+ } else {
32
+ println ! ( "All tracks have been played 🎶" ) ;
33
+ return ;
34
+ }
23
35
}
24
36
}
25
37
@@ -43,7 +55,7 @@ fn main() {
43
55
return eprintln ! ( "Volume must be between 0 and 9" ) ;
44
56
}
45
57
46
- let rss_feed = Mfp :: new ( ) . expect ( "Failed to fetch RSS data" ) ;
58
+ let mut rss_feed = Mfp :: new ( ) . expect ( "Failed to fetch RSS data" ) ;
47
59
let total_tracks = rss_feed. items . len ( ) ;
48
60
49
61
if let Some ( requested_track_number) = args. track_number {
@@ -56,6 +68,6 @@ fn main() {
56
68
play_episode ( episode, args. volume ) ;
57
69
}
58
70
} else {
59
- play_random_episode ( & rss_feed, args. volume ) ;
71
+ play_random_episodes ( & mut rss_feed, args. volume ) ;
60
72
}
61
73
}
0 commit comments