Impl fetching album art that isn't embedded

This commit is contained in:
Stephen Seo 2021-09-17 18:23:55 +09:00
parent cc746fa11c
commit f9ff594437
2 changed files with 45 additions and 10 deletions

View file

@ -34,7 +34,7 @@ program.
([macroquad](https://crates.io/crates/macroquad) is being used to display a ([macroquad](https://crates.io/crates/macroquad) is being used to display a
window, text, and album art, but doesn't seem to have support for ".ttc" fonts window, text, and album art, but doesn't seem to have support for ".ttc" fonts
that could render CJK text) that could render CJK text)
- [ ] Support for album art not embedded but in the same directory - [x] Support for album art not embedded but in the same directory
# Legal stuff # Legal stuff

View file

@ -42,6 +42,7 @@ struct Shared {
dirty: bool, dirty: bool,
can_authenticate: bool, can_authenticate: bool,
can_get_album_art: bool, can_get_album_art: bool,
can_get_album_art_in_dir: bool,
can_get_status: bool, can_get_status: bool,
} }
@ -60,6 +61,7 @@ impl Shared {
dirty: true, dirty: true,
can_authenticate: true, can_authenticate: true,
can_get_album_art: true, can_get_album_art: true,
can_get_album_art_in_dir: true,
can_get_status: true, can_get_status: true,
} }
} }
@ -72,6 +74,7 @@ enum PollState {
CurrentSong, CurrentSong,
Status, Status,
ReadPicture, ReadPicture,
ReadPictureInDir,
} }
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
@ -320,6 +323,20 @@ fn info_loop(shared_data: Arc<Mutex<Shared>>) -> Result<(), String> {
if line.starts_with("OK") { if line.starts_with("OK") {
match poll_state { match poll_state {
PollState::Password => authenticated = true, PollState::Password => authenticated = true,
PollState::ReadPicture => {
if lock.art_data.is_empty() {
lock.can_get_album_art = false;
lock.dirty = true;
println!("No embedded album art");
}
}
PollState::ReadPictureInDir => {
if lock.art_data.is_empty() {
lock.can_get_album_art_in_dir = false;
lock.dirty = true;
println!("No album art in dir");
}
}
_ => (), _ => (),
} }
poll_state = PollState::None; poll_state = PollState::None;
@ -338,6 +355,12 @@ fn info_loop(shared_data: Arc<Mutex<Shared>>) -> Result<(), String> {
PollState::ReadPicture => { PollState::ReadPicture => {
lock.can_get_album_art = false; lock.can_get_album_art = false;
lock.dirty = true; lock.dirty = true;
println!("Failed to get readpicture");
}
PollState::ReadPictureInDir => {
lock.can_get_album_art_in_dir = false;
lock.dirty = true;
println!("Failed to get albumart");
} }
_ => (), _ => (),
} }
@ -348,6 +371,8 @@ fn info_loop(shared_data: Arc<Mutex<Shared>>) -> Result<(), String> {
lock.current_song = song_file; lock.current_song = song_file;
lock.art_data.clear(); lock.art_data.clear();
lock.art_data_size = 0; lock.art_data_size = 0;
lock.can_get_album_art = true;
lock.can_get_album_art_in_dir = true;
//println!("Got different song file, clearing art_data..."); //println!("Got different song file, clearing art_data...");
} }
lock.dirty = true; lock.dirty = true;
@ -428,10 +453,10 @@ fn info_loop(shared_data: Arc<Mutex<Shared>>) -> Result<(), String> {
} }
} else if (lock.art_data.is_empty() || lock.art_data.len() != lock.art_data_size) } else if (lock.art_data.is_empty() || lock.art_data.len() != lock.art_data_size)
&& !lock.current_song.is_empty() && !lock.current_song.is_empty()
&& lock.can_get_album_art
{ {
let title = lock.current_song.clone(); let title = lock.current_song.clone();
let art_data_length = lock.art_data.len(); let art_data_length = lock.art_data.len();
if lock.can_get_album_art {
let write_result = lock.stream.write( let write_result = lock.stream.write(
format!("readpicture \"{}\" {}\n", title, art_data_length).as_bytes(), format!("readpicture \"{}\" {}\n", title, art_data_length).as_bytes(),
); );
@ -440,6 +465,16 @@ fn info_loop(shared_data: Arc<Mutex<Shared>>) -> Result<(), String> {
} else { } else {
poll_state = PollState::ReadPicture; poll_state = PollState::ReadPicture;
} }
} else if lock.can_get_album_art_in_dir {
let write_result = lock.stream.write(
format!("albumart \"{}\" {}\n", title, art_data_length).as_bytes(),
);
if let Err(e) = write_result {
println!("Got error requesting albumart in dir: {}", e);
} else {
poll_state = PollState::ReadPictureInDir;
}
}
} }
} else { } else {
println!("Failed to acquire lock for writing to stream"); println!("Failed to acquire lock for writing to stream");
@ -476,7 +511,7 @@ fn get_info_from_shared(
error_text = String::from("Failed to authenticate to mpd"); error_text = String::from("Failed to authenticate to mpd");
} else if !lock.can_get_status { } else if !lock.can_get_status {
error_text = String::from("Failed to get status from mpd"); error_text = String::from("Failed to get status from mpd");
} else if !lock.can_get_album_art { } else if !lock.can_get_album_art && !lock.can_get_album_art_in_dir {
error_text = String::from("Failed to get albumart from mpd"); error_text = String::from("Failed to get albumart from mpd");
} }
lock.dirty = false; lock.dirty = false;