94 lines
2.2 KiB
Rust
94 lines
2.2 KiB
Rust
use chrono::Local;
|
|
use mpd::{Client, Query, Song};
|
|
use rand::prelude::*;
|
|
use rand::seq::SliceRandom;
|
|
use std::{thread, time};
|
|
|
|
fn main() {
|
|
// We enable consume mode here
|
|
let _ = Client::default().consume(true);
|
|
|
|
// We launch an infinite loop
|
|
loop {
|
|
let mut c = Client::default();
|
|
println!("{} checking playlist ", Local::now().format("%T"));
|
|
|
|
let s = match c.status() {
|
|
Ok(status) => status,
|
|
Err(_) => panic!("blah"),
|
|
};
|
|
|
|
let ql = s.queue_len;
|
|
|
|
if ql < 10u32 {
|
|
populate_playlist(10u32 - ql);
|
|
};
|
|
|
|
let refresh_delay = time::Duration::from_secs(20);
|
|
thread::sleep(refresh_delay);
|
|
|
|
let _ = c.close();
|
|
}
|
|
}
|
|
|
|
fn populate_playlist(a: u32) {
|
|
if a == 1 {
|
|
println!("need to add one song");
|
|
} else {
|
|
println!("need to add {} songs", a);
|
|
}
|
|
|
|
let mut x: u32 = 0;
|
|
while x < a {
|
|
add_track();
|
|
x += 1;
|
|
let remaining = a - x;
|
|
match remaining {
|
|
0 => println!("playlist refilled!"),
|
|
1 => println!("need to add 1 more song"),
|
|
_ => println!("need to add {} more songs", remaining),
|
|
}
|
|
}
|
|
}
|
|
|
|
fn add_track() {
|
|
let mut c = Client::default();
|
|
|
|
let res: Song = get_random_track();
|
|
println!("adding: {:?}", res.file);
|
|
|
|
let _ = c.push(res);
|
|
let _ = c.close();
|
|
}
|
|
|
|
fn get_random_track() -> Song {
|
|
let mut c = Client::default();
|
|
|
|
const CHARSET: &[u8] = b"abcdefghijklmnopqrstuvwxyz";
|
|
const CHARS_LEN: usize = 2;
|
|
let mut rng = rand::thread_rng();
|
|
|
|
let chars: String = (0..CHARS_LEN)
|
|
.map(|_| {
|
|
let idx = rng.gen_range(0, CHARSET.len());
|
|
CHARSET[idx] as char
|
|
})
|
|
.collect();
|
|
|
|
let mut query = Query::new();
|
|
let query = query.and(mpd::Term::Any, chars);
|
|
|
|
let songs = c.search(query, None).unwrap_or_default();
|
|
|
|
if songs.is_empty() {
|
|
return get_random_track();
|
|
} else {
|
|
let mut rng = rand::thread_rng();
|
|
let track = match songs.choose(&mut rng) {
|
|
Some(song) => song,
|
|
None => panic!("Impossible de choisir un morceau"),
|
|
};
|
|
track.clone()
|
|
}
|
|
}
|