From 1563e98985918a009426e3c6b4aafe1d9a596623 Mon Sep 17 00:00:00 2001 From: Julien Rabier Date: Mon, 1 Dec 2025 22:28:02 +0100 Subject: [PATCH] connect then retry --- Cargo.toml | 2 +- justfile | 9 +++++++++ src/main.rs | 31 ++++++++++++++++++++++--------- 3 files changed, 32 insertions(+), 10 deletions(-) create mode 100644 justfile diff --git a/Cargo.toml b/Cargo.toml index cb075f0..2b9c567 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mpdyn" -version = "0.1.3" +version = "0.2.0" authors = ["Julien Rabier "] edition = "2024" diff --git a/justfile b/justfile new file mode 100644 index 0000000..b752940 --- /dev/null +++ b/justfile @@ -0,0 +1,9 @@ +alias b:= build +alias i:= install + +build: + cargo build --release + +install: + cargo install --path . + systemctl --user restart mpdyn diff --git a/src/main.rs b/src/main.rs index 06f9ac6..696a2f0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,14 +3,15 @@ use mpdrs::{Client, Song}; use rand::{prelude::*, rng}; use std::{error::Error, thread, time}; +const CON: &str = "127.0.0.1:6600"; + fn main() -> Result<(), Box> { // We enable consume mode here - Client::default().consume(true)?; + connect_retry().consume(true)?; // We launch an infinite loop loop { - //println!("{} checking playlist ", Local::now().format("%T")); - let ql = Client::default().status()?.queue_len; + let ql = connect_retry().status()?.queue_len; if ql < 10u32 { populate_playlist(10u32 - ql)?; }; @@ -19,6 +20,18 @@ fn main() -> Result<(), Box> { } } +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> { if a == 1 { println!("need to add one song"); @@ -27,11 +40,11 @@ fn populate_playlist(a: u32) -> Result<(), Box> { } for song in get_random_tracks(a)? { - match Client::default().push(&song.file) { + match connect_retry().push(&song.file) { Ok(_) => println!( - "adding: {:} by {:}", - song.title.unwrap(), - song.artist.unwrap() + "adding: \"{}\" by \"{}\"", + song.title.unwrap_or_default(), + song.artist.unwrap_or_default() ), Err(_) => println!("unable to add {:?}", song.title), } @@ -42,7 +55,7 @@ fn populate_playlist(a: u32) -> Result<(), Box> { fn get_random_tracks(n: u32) -> Result, Box> { let mut rng = rng(); - let query_albums = Client::default().lsinfo("/")?; + let query_albums = connect_retry().lsinfo("/").unwrap_or_default(); let tracks: Vec = Iterator::filter_map( query_albums @@ -69,7 +82,7 @@ fn match_directory(response: &LsInfoResponse) -> Result { fn get_random_track(path: &str) -> Option { let mut rng = rng(); - match Client::default().lsinfo(path) { + match connect_retry().lsinfo(path) { Ok(songs) => match songs.choose(&mut rng) { Some(LsInfoResponse::Song(song)) => Some(song.clone()), _ => None,