connect then retry

This commit is contained in:
Julien Rabier 2025-12-01 22:28:02 +01:00
parent 18a56f4454
commit 1563e98985
3 changed files with 32 additions and 10 deletions

View File

@ -1,6 +1,6 @@
[package] [package]
name = "mpdyn" name = "mpdyn"
version = "0.1.3" version = "0.2.0"
authors = ["Julien Rabier <taziden@flexiden.org>"] authors = ["Julien Rabier <taziden@flexiden.org>"]
edition = "2024" edition = "2024"

9
justfile Normal file
View File

@ -0,0 +1,9 @@
alias b:= build
alias i:= install
build:
cargo build --release
install:
cargo install --path .
systemctl --user restart mpdyn

View File

@ -3,14 +3,15 @@ use mpdrs::{Client, Song};
use rand::{prelude::*, rng}; use rand::{prelude::*, rng};
use std::{error::Error, thread, time}; use std::{error::Error, thread, time};
const CON: &str = "127.0.0.1:6600";
fn main() -> Result<(), Box<dyn Error>> { fn main() -> Result<(), Box<dyn Error>> {
// We enable consume mode here // We enable consume mode here
Client::default().consume(true)?; connect_retry().consume(true)?;
// We launch an infinite loop // We launch an infinite loop
loop { loop {
//println!("{} checking playlist ", Local::now().format("%T")); let ql = connect_retry().status()?.queue_len;
let ql = Client::default().status()?.queue_len;
if ql < 10u32 { if ql < 10u32 {
populate_playlist(10u32 - ql)?; populate_playlist(10u32 - ql)?;
}; };
@ -19,6 +20,18 @@ fn main() -> Result<(), Box<dyn Error>> {
} }
} }
fn connect_retry() -> Client {
loop {
if let Ok(res) = Client::connect(CON) {
break res;
} else {
println!("Unable to connect to MPD, retrying in 5 seconds");
thread::sleep(time::Duration::from_secs(5));
connect_retry()
};
}
}
fn populate_playlist(a: u32) -> Result<(), Box<dyn Error>> { fn populate_playlist(a: u32) -> Result<(), Box<dyn Error>> {
if a == 1 { if a == 1 {
println!("need to add one song"); println!("need to add one song");
@ -27,11 +40,11 @@ fn populate_playlist(a: u32) -> Result<(), Box<dyn Error>> {
} }
for song in get_random_tracks(a)? { for song in get_random_tracks(a)? {
match Client::default().push(&song.file) { match connect_retry().push(&song.file) {
Ok(_) => println!( Ok(_) => println!(
"adding: {:} by {:}", "adding: \"{}\" by \"{}\"",
song.title.unwrap(), song.title.unwrap_or_default(),
song.artist.unwrap() song.artist.unwrap_or_default()
), ),
Err(_) => println!("unable to add {:?}", song.title), Err(_) => println!("unable to add {:?}", song.title),
} }
@ -42,7 +55,7 @@ fn populate_playlist(a: u32) -> Result<(), Box<dyn Error>> {
fn get_random_tracks(n: u32) -> Result<Vec<Song>, Box<dyn Error>> { fn get_random_tracks(n: u32) -> Result<Vec<Song>, Box<dyn Error>> {
let mut rng = rng(); let mut rng = rng();
let query_albums = Client::default().lsinfo("/")?; let query_albums = connect_retry().lsinfo("/").unwrap_or_default();
let tracks: Vec<Song> = Iterator::filter_map( let tracks: Vec<Song> = Iterator::filter_map(
query_albums query_albums
@ -69,7 +82,7 @@ fn match_directory(response: &LsInfoResponse) -> Result<i32, i32> {
fn get_random_track(path: &str) -> Option<Song> { fn get_random_track(path: &str) -> Option<Song> {
let mut rng = rng(); let mut rng = rng();
match Client::default().lsinfo(path) { match connect_retry().lsinfo(path) {
Ok(songs) => match songs.choose(&mut rng) { Ok(songs) => match songs.choose(&mut rng) {
Some(LsInfoResponse::Song(song)) => Some(song.clone()), Some(LsInfoResponse::Song(song)) => Some(song.clone()),
_ => None, _ => None,