mirror of
https://github.com/Dangoware/dango-music-player.git
synced 2025-04-19 10:02:53 -05:00
103 lines
3.1 KiB
Rust
103 lines
3.1 KiB
Rust
use std::{
|
|
sync::{Arc, RwLock},
|
|
error::Error,
|
|
};
|
|
|
|
use discord_rpc_client::Client;
|
|
use listenbrainz::ListenBrainz;
|
|
use uuid::Uuid;
|
|
|
|
use crate::{
|
|
config::config::Config, music_controller::controller::{Controller, QueueCmd, QueueResponse}, music_storage::library::{MusicLibrary, Song, Tag}
|
|
};
|
|
|
|
use super::controller::DatabaseResponse;
|
|
|
|
|
|
|
|
impl Controller {
|
|
pub fn listenbrainz_authenticate(&mut self) -> Result<ListenBrainz, Box<dyn Error>> {
|
|
let config = &self.config.read().unwrap();
|
|
let mut client = ListenBrainz::new();
|
|
|
|
let lbz_token = match &config.connections.listenbrainz_token {
|
|
Some(token) => token,
|
|
None => todo!("No ListenBrainz token in config")
|
|
};
|
|
|
|
if !client.is_authenticated() {
|
|
client.authenticate(lbz_token)?;
|
|
}
|
|
|
|
Ok(client)
|
|
}
|
|
pub fn lbz_scrobble(&self, client: ListenBrainz, uuid: Uuid) -> Result<(), Box<dyn Error>> {
|
|
let config = &self.config.read().unwrap();
|
|
|
|
&self.db_mail.send(super::controller::DatabaseCmd::QueryUuid(uuid));
|
|
let res = &self.db_mail.recv()?;
|
|
let song = match res {
|
|
DatabaseResponse::Song(song) => song,
|
|
_ => todo!()
|
|
};
|
|
let unknown = &"unknown".to_string();
|
|
let artist = song.get_tag(&Tag::Artist).unwrap_or(unknown);
|
|
let track = song.get_tag(&Tag::Title).unwrap_or(unknown);
|
|
let release = song.get_tag(&Tag::Album).map(|rel| rel.as_str());
|
|
|
|
client.listen(artist, track, release)?;
|
|
Ok(())
|
|
}
|
|
|
|
pub fn lbz_now_playing(&self, client: ListenBrainz, uuid: Uuid) -> Result<(), Box<dyn Error>> {
|
|
let config = &self.config.read().unwrap();
|
|
|
|
&self.db_mail.send(super::controller::DatabaseCmd::QueryUuid(uuid));
|
|
let res = &self.db_mail.recv()?;
|
|
let song = match res {
|
|
DatabaseResponse::Song(song) => song,
|
|
_ => todo!()
|
|
};
|
|
let unknown = &"unknown".to_string();
|
|
let artist = song.get_tag(&Tag::Artist).unwrap_or(unknown);
|
|
let track = song.get_tag(&Tag::Title).unwrap_or(unknown);
|
|
let release = song.get_tag(&Tag::Album).map(|rel| rel.as_str());
|
|
|
|
client.listen(artist, track, release)?;
|
|
Ok(())
|
|
}
|
|
|
|
pub fn discord_song_change(client: &mut Client,song: Song) {
|
|
client.set_activity(|a| {
|
|
a.state(format!("Listening to {}", song.get_tag(&Tag::Title).unwrap()))
|
|
.into()
|
|
});
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod test_super {
|
|
use std::{thread::sleep, time::Duration};
|
|
|
|
use super::*;
|
|
use crate::config::config::tests::read_config_lib;
|
|
|
|
#[test]
|
|
fn listenbrainz() {
|
|
let mut c = Controller::start(".\\test-config\\config_test.json").unwrap();
|
|
|
|
let client = c.listenbrainz_authenticate().unwrap();
|
|
|
|
c.q_new().unwrap();
|
|
c.queue_mail[0].send(QueueCmd::SetVolume(0.04)).unwrap();
|
|
|
|
let songs = c.lib_get_songs();
|
|
|
|
c.q_enqueue(0, songs[1].location.to_owned()).unwrap();
|
|
c.q_play(0).unwrap();
|
|
|
|
|
|
sleep(Duration::from_secs(100));
|
|
c.lbz_scrobble(client, songs[1].uuid).unwrap();
|
|
}
|
|
}
|