Skip to content

Commit 1cd6388

Browse files
committed
Started work on Musixmatch fetcher
1 parent d03ceca commit 1cd6388

File tree

4 files changed

+112
-36
lines changed

4 files changed

+112
-36
lines changed

Cargo.lock

Lines changed: 54 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/lyrics.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use log::trace;
1+
use log::debug;
22
use std::{cell::RefCell, collections::HashMap, sync::Arc};
33

44
use crate::{
@@ -7,15 +7,14 @@ use crate::{
77
queue::Queue,
88
};
99

10-
#[derive(Clone)]
1110
pub struct LyricsManager {
1211
queue: Arc<Queue>,
13-
fetcher: LyricsFetcher,
12+
fetcher: Box<dyn LyricsFetcher>,
1413
cache: RefCell<HashMap<String, String>>,
1514
}
1615

1716
impl LyricsManager {
18-
pub fn new(queue: Arc<Queue>, fetcher: LyricsFetcher) -> Self {
17+
pub fn new(queue: Arc<Queue>, fetcher: Box<dyn LyricsFetcher>) -> Self {
1918
LyricsManager {
2019
queue,
2120
fetcher,
@@ -43,8 +42,8 @@ impl LyricsManager {
4342
let cache = self.cache.borrow();
4443

4544
if cache.contains_key(track_id) {
46-
trace!("Retrieving cached lyrics for {}", track.title);
47-
return cache.get(track_id).unwrap().to_owned();
45+
debug!("Retrieving cached lyrics for {}", track.title);
46+
return cache.get(track_id).unwrap().into();
4847
}
4948
}
5049

src/lyrics_fetcher.rs

Lines changed: 49 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,58 @@
1-
use log::trace;
1+
use std::sync::Arc;
22

3-
use crate::model::track::Track;
3+
use log::debug;
44

5-
#[derive(Clone)]
6-
pub struct LyricsFetcher {}
5+
use crate::{config::Config, model::track::Track};
76

8-
impl LyricsFetcher {
9-
pub fn new() -> LyricsFetcher {
10-
Self {}
11-
}
7+
pub trait LyricsFetcher {
8+
fn fetch(&self, track: &Track) -> String;
9+
}
10+
11+
pub struct MusixMatchLyricsFetcher {
12+
api_key: String,
13+
}
14+
15+
impl LyricsFetcher for MusixMatchLyricsFetcher {
16+
fn fetch(&self, track: &Track) -> String {
17+
let track_title = track.title.clone();
18+
let track_authors = track.artists.join(", ");
19+
20+
debug!("Fetching lyrics for {} by {}", track_title, track_authors);
1221

13-
/// Fetches the lyrics of the given song using the specified lyrics source
14-
pub fn fetch(&self, track: &Track) -> String {
15-
// std::thread::sleep(std::time::Duration::from_secs(2));
16-
trace!("Fetching lyrics for {track}");
22+
let client = reqwest::blocking::Client::new();
1723

18-
format!("Sample Lyrics for {}\n", track.title)
24+
let response = client
25+
.get("https://api.musixmatch.com/ws/1.1/matcher.lyrics.get")
26+
.query(&[
27+
("q_track", track_title.clone()),
28+
("q_artist", track_authors),
29+
("apikey", self.api_key.clone()),
30+
])
31+
.send()
32+
.unwrap();
33+
34+
if response.status() != 200 {
35+
debug!("Error fetching lyrics for {}", track_title);
36+
return format!("Error fetching lyrics for {}", track_title);
37+
}
38+
39+
// Do this since we do not have a specific body type to parse into
40+
let text = response.text().unwrap();
41+
let json: serde_json::Value = serde_json::from_str(&text).unwrap();
42+
43+
debug!("Received {:?}", json);
44+
45+
if json["status_code"] != 200 {
46+
debug!("Error fetching lyrics for {}", track_title);
47+
return format!("Error fetching lyrics for {}", track_title);
48+
}
49+
50+
json["message"]["body"]["lyrics"]["lyrics_body"].to_string()
1951
}
2052
}
2153

22-
impl Default for LyricsFetcher {
23-
fn default() -> Self {
24-
LyricsFetcher::new() // TODO: check the prefered fetcher
25-
}
54+
pub fn default_fetcher(cfg: Arc<Config>) -> Box<dyn LyricsFetcher> {
55+
Box::new(MusixMatchLyricsFetcher {
56+
api_key: cfg.values().backend.clone().unwrap(),
57+
})
2658
}

src/ui/lyrics.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,14 +60,15 @@ impl LyricsView {
6060
lyrics_view
6161
}
6262

63-
// needs to be made public in order to be updated from main's event loop
64-
pub fn update_lyrics(&self) {
63+
fn update_lyrics(&self) {
64+
// TODO: this should be done in a separate thread and the UI should be updated when the lyrics are fetched (or an error occurs)
65+
6566
let current_track = self.manager.get_current_track();
6667

6768
if let Some(track) = current_track {
6869
let track_title_str = track.clone().title;
6970

70-
let track_authors_str = track.clone().artists.join(", ");
71+
let track_authors_str = track.artists.join(", ");
7172

7273
let track_album_str = match track.clone().album {
7374
None => String::default(),

0 commit comments

Comments
 (0)