From 52455e43271be53c75af4e72c382325f8455b9f6 Mon Sep 17 00:00:00 2001 From: Nuno Pereira Date: Fri, 10 Mar 2023 01:59:40 +0000 Subject: [PATCH 1/7] Added Lyrics view --- src/application.rs | 3 ++ src/command.rs | 2 +- src/commands.rs | 1 + src/lyrics/mod.rs | 0 src/ui/lyrics.rs | 71 ++++++++++++++++++++++++++++++++++++++++++++++ src/ui/mod.rs | 1 + 6 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 src/lyrics/mod.rs create mode 100644 src/ui/lyrics.rs diff --git a/src/application.rs b/src/application.rs index 9c881066..4e9bfaec 100644 --- a/src/application.rs +++ b/src/application.rs @@ -176,6 +176,8 @@ impl Application { let queueview = ui::queue::QueueView::new(queue.clone(), library.clone()); + let lyricsview = ui::lyrics::LyricsView::new(queue.clone()); + #[cfg(feature = "cover")] let coverview = ui::cover::CoverView::new(queue.clone(), library.clone(), &configuration); @@ -185,6 +187,7 @@ impl Application { ui::layout::Layout::new(status, &event_manager, theme, Arc::clone(&configuration)) .screen("search", search.with_name("search")) .screen("library", libraryview.with_name("library")) + .screen("lyrics", lyricsview.with_name("lyrics")) .screen("queue", queueview); #[cfg(feature = "cover")] diff --git a/src/command.rs b/src/command.rs index fe286783..f50435f4 100644 --- a/src/command.rs +++ b/src/command.rs @@ -433,7 +433,7 @@ pub fn parse(input: &str) -> Result, CommandParseError> { "focus" => { let &target = args.first().ok_or(E::InsufficientArgs { cmd: command.into(), - hint: Some("queue|search|library".into()), + hint: Some("queue|search|library|lyrics".into()), // TODO: these names should come from a "central" registrar for views so that contributors don't need to always keep updating it })?; // TODO: this really should be strongly typed Command::Focus(target.into()) diff --git a/src/commands.rs b/src/commands.rs index 55b43e88..8e809fd6 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -473,6 +473,7 @@ impl CommandManager { kb.insert("F1".into(), vec![Command::Focus("queue".into())]); kb.insert("F2".into(), vec![Command::Focus("search".into())]); kb.insert("F3".into(), vec![Command::Focus("library".into())]); + kb.insert("F4".into(), vec![Command::Focus("lyrics".into())]); #[cfg(feature = "cover")] kb.insert("F8".into(), vec![Command::Focus("cover".into())]); kb.insert("?".into(), vec![Command::Help]); diff --git a/src/lyrics/mod.rs b/src/lyrics/mod.rs new file mode 100644 index 00000000..e69de29b diff --git a/src/ui/lyrics.rs b/src/ui/lyrics.rs new file mode 100644 index 00000000..94091943 --- /dev/null +++ b/src/ui/lyrics.rs @@ -0,0 +1,71 @@ +use std::sync::Arc; + +use cursive::{ + theme::Effect, + utils::markup::StyledString, + view::ViewWrapper, + views::{ScrollView, TextView}, +}; + +use crate::{commands::CommandResult, queue::Queue, traits::ViewExt, command::Command}; + +pub struct LyricsView { + queue: Arc, + view: ScrollView, +} + +impl LyricsView { + pub fn new(queue: Arc) -> LyricsView { + let mut text = StyledString::styled("Keybindings\n\n", Effect::Bold); + + let note = format!( + "Custom bindings can be set in the {} file within the [keybindings] section.\n\n", + "test" + ); + text.append(StyledString::styled(note, Effect::Italic)); + + LyricsView { + queue, + view: ScrollView::new(TextView::new(text)), + } + } + + pub fn save_lyrics(&mut self, lyrics: String) -> Result { + // println!("Saving Lyrics: {}", lyrics); + + self.view.get_inner_mut().set_content(lyrics); + + Ok(CommandResult::Consumed(None)) + } +} + +impl ViewWrapper for LyricsView { + wrap_impl!(self.view: ScrollView); +} + +impl ViewExt for LyricsView { + fn title(&self) -> String { + "Lyrics".to_string() + } + + fn title_sub(&self) -> String { + let current_track = self.queue.get_current().unwrap(); + + format!("{}", current_track) + } + + fn on_leave(&self) {} + + fn on_command( + &mut self, + _s: &mut cursive::Cursive, + cmd: &Command, + ) -> Result { + match cmd { + Command::Save => self.save_lyrics(format!("{}", cmd)), + Command::Quit => Ok(CommandResult::Ignored), + Command::Focus(_) => Ok(CommandResult::Ignored), + _ => Ok(CommandResult::Ignored) + } + } +} diff --git a/src/ui/mod.rs b/src/ui/mod.rs index 903fb2d8..06917511 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -9,6 +9,7 @@ pub mod help; pub mod layout; pub mod library; pub mod listview; +pub mod lyrics; pub mod modal; pub mod pagination; pub mod playlist; From fd8abd4fc00abfb910ceda274f2e12634672a6bb Mon Sep 17 00:00:00 2001 From: Nuno Pereira Date: Mon, 13 Mar 2023 17:17:27 +0000 Subject: [PATCH 2/7] Added lyrics fetcher --- Cargo.lock | 165 ++++++++++++++++++++++++++++++++++++++++-- Cargo.toml | 1 + src/lyrics.rs | 52 +++++++++++++ src/lyrics/mod.rs | 0 src/lyrics_fetcher.rs | 23 ++++++ src/main.rs | 2 + src/ui/lyrics.rs | 58 +++++++++------ 7 files changed, 274 insertions(+), 27 deletions(-) create mode 100644 src/lyrics.rs delete mode 100644 src/lyrics/mod.rs create mode 100644 src/lyrics_fetcher.rs diff --git a/Cargo.lock b/Cargo.lock index b3d295ed..0e513c1c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -755,8 +755,22 @@ dependencies = [ ] [[package]] -name = "crc32fast" -version = "1.4.0" +name = "crossbeam" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2801af0d36612ae591caa9568261fddce32ce6e08a7275ea334a06a4ad021a2c" +dependencies = [ + "cfg-if", + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-epoch", + "crossbeam-queue", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" dependencies = [ @@ -772,6 +786,40 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "crossbeam-deque" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" +dependencies = [ + "cfg-if", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46bd5f3f85273295a9d14aedfb86f6aadbff6d8f5295c4a9edb08e819dcf5695" +dependencies = [ + "autocfg", + "cfg-if", + "crossbeam-utils", + "memoffset 0.8.0", + "scopeguard", +] + +[[package]] +name = "crossbeam-queue" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + [[package]] name = "crossbeam-utils" version = "0.8.19" @@ -856,6 +904,22 @@ dependencies = [ "unicode-width", ] +[[package]] +name = "cursive-async-view" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "192c058a725c80d9759b3e8957d6ee9e169a0b46c9f11216ec8c8d7990644761" +dependencies = [ + "crossbeam", + "cursive_core", + "doc-comment", + "interpolation", + "lazy_static", + "log", + "num 0.4.0", + "send_wrapper", +] + [[package]] name = "cursive_buffered_backend" version = "0.6.1" @@ -1030,8 +1094,14 @@ dependencies = [ ] [[package]] -name = "dlib" -version = "0.5.2" +name = "doc-comment" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" + +[[package]] +name = "downcast-rs" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" dependencies = [ @@ -1788,6 +1858,23 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "interpolation" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3b7357d2bbc5ee92f8e899ab645233e43d21407573cceb37fed8bc3dede2c02" + +[[package]] +name = "io-lifetimes" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +dependencies = [ + "hermit-abi", + "libc", + "windows-sys", +] + [[package]] name = "ioctl-rs" version = "0.2.0" @@ -2170,7 +2257,16 @@ dependencies = [ [[package]] name = "memoffset" -version = "0.9.1" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mime" +version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" dependencies = [ @@ -2238,6 +2334,7 @@ dependencies = [ "clap", "crossbeam-channel", "cursive", + "cursive-async-view", "cursive_buffered_backend", "fern", "futures", @@ -2360,7 +2457,45 @@ dependencies = [ "cfg-if", "cfg_aliases", "libc", +<<<<<<< HEAD "memoffset 0.9.1", +||||||| parent of 53c07a7 (Added lyrics fetcher) + "memoffset 0.6.5", +] + +[[package]] +name = "nix" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfdda3d196821d6af13126e40375cdf7da646a96114af134d5f417a9a1dc8e1a" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", + "memoffset 0.7.1", + "static_assertions", +======= +<<<<<<< HEAD + "memoffset 0.6.5", +] + +[[package]] +name = "nix" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfdda3d196821d6af13126e40375cdf7da646a96114af134d5f417a9a1dc8e1a" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", + "memoffset 0.7.1", + "static_assertions", +||||||| parent of 1f462a4 (Added lyrics fetcher) + "memoffset", +======= + "memoffset 0.6.5", +>>>>>>> 1f462a4 (Added lyrics fetcher) +>>>>>>> 53c07a7 (Added lyrics fetcher) ] [[package]] @@ -2406,7 +2541,14 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" dependencies = [ +<<<<<<< HEAD "num-complex 0.4.6", +||||||| parent of 53c07a7 (Added lyrics fetcher) + "num-complex 0.4.3", +======= + "num-bigint 0.4.3", + "num-complex 0.4.3", +>>>>>>> 53c07a7 (Added lyrics fetcher) "num-integer", "num-iter", "num-rational 0.4.2", @@ -2509,6 +2651,13 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" dependencies = [ +<<<<<<< HEAD +||||||| parent of 53c07a7 (Added lyrics fetcher) + "autocfg", +======= + "autocfg", + "num-bigint 0.4.3", +>>>>>>> 53c07a7 (Added lyrics fetcher) "num-integer", "num-traits", ] @@ -3434,6 +3583,12 @@ version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +[[package]] +name = "send_wrapper" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "930c0acf610d3fdb5e2ab6213019aaa04e227ebe9547b0649ba599b16d788bd7" + [[package]] name = "serde" version = "1.0.203" diff --git a/Cargo.toml b/Cargo.toml index de662c52..32c10774 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -68,6 +68,7 @@ toml = "0.8" unicode-width = "0.1.13" url = "2.5" cursive_buffered_backend = "0.6.1" +cursive-async-view = "0.6.0" [target.'cfg(unix)'.dependencies] signal-hook = "0.3.0" diff --git a/src/lyrics.rs b/src/lyrics.rs new file mode 100644 index 00000000..a942819a --- /dev/null +++ b/src/lyrics.rs @@ -0,0 +1,52 @@ +use std::sync::Arc; + +use crate::{ + lyrics_fetcher::LyricsFetcher, + model::{playable::Playable, track::Track}, + queue::Queue, +}; + +#[derive(Clone)] +pub struct LyricsManager { + queue: Arc, + fetcher: LyricsFetcher, + // TODO: add a cache +} + +impl LyricsManager { + pub fn new(queue: Arc, fetcher: LyricsFetcher) -> Self { + LyricsManager { queue, fetcher } + } + + /// Saves the given lyrics to the user's filesystem. + /// + /// Returns an optional message indicating the outcome of this operation. + pub fn save_lyrics(&self, lyrics: String) -> Option { + Some("".to_string()) + } + + /// Fetches and returns the lyrics of the given track + pub fn get_lyrics(&self, track: Track) -> String { + // TODO: implement caching + + self.fetcher.fetch(&track) + } + + /// Fetches and returns the lyrics of the currently playing track + pub fn get_lyrics_for_current(&self) -> String { + match self.get_current_track() { + None => String::from("No track currently playing: could not get lyrics"), + Some(track) => self.get_lyrics(track), + } + } + + /// Returns the track being played currently, or nothing if the user is listening to a podcast episodes + fn get_current_track(&self) -> Option { + let playable = self.queue.get_current().unwrap(); + + match playable { + Playable::Track(track) => Some(track), + Playable::Episode(_) => None, + } + } +} diff --git a/src/lyrics/mod.rs b/src/lyrics/mod.rs deleted file mode 100644 index e69de29b..00000000 diff --git a/src/lyrics_fetcher.rs b/src/lyrics_fetcher.rs new file mode 100644 index 00000000..9761ef3b --- /dev/null +++ b/src/lyrics_fetcher.rs @@ -0,0 +1,23 @@ +use crate::model::track::Track; + +#[derive(Clone)] +pub struct LyricsFetcher {} + +impl LyricsFetcher { + pub fn new() -> LyricsFetcher { + Self {} + } + + /// Fetches the lyrics of the given song using the specified lyrics source + pub fn fetch(&self, track: &Track) -> String { + // std::thread::sleep(std::time::Duration::from_secs(2)); + + format!("Sample Lyrics for {}\n", track.title) + } +} + +impl Default for LyricsFetcher { + fn default() -> Self { + LyricsFetcher::new() // TODO: check the prefered fetcher + } +} diff --git a/src/main.rs b/src/main.rs index b8798fd5..40eb4ec6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -19,6 +19,8 @@ mod config; mod events; mod ext_traits; mod library; +mod lyrics; +mod lyrics_fetcher; mod model; mod panic; mod queue; diff --git a/src/ui/lyrics.rs b/src/ui/lyrics.rs index 94091943..bbd93ac5 100644 --- a/src/ui/lyrics.rs +++ b/src/ui/lyrics.rs @@ -4,43 +4,61 @@ use cursive::{ theme::Effect, utils::markup::StyledString, view::ViewWrapper, - views::{ScrollView, TextView}, + views::{DummyView, LinearLayout, ScrollView, TextView}, }; -use crate::{commands::CommandResult, queue::Queue, traits::ViewExt, command::Command}; +use crate::{commands::CommandResult, lyrics::LyricsManager, traits::ViewExt, command::Command}; pub struct LyricsView { - queue: Arc, - view: ScrollView, + manager: Arc, + view: LinearLayout, } impl LyricsView { - pub fn new(queue: Arc) -> LyricsView { + pub fn new(manager: Arc) -> LyricsView { let mut text = StyledString::styled("Keybindings\n\n", Effect::Bold); let note = format!( "Custom bindings can be set in the {} file within the [keybindings] section.\n\n", "test" ); + + // TODO: fixme + let content = String::from(""); + text.append(StyledString::styled(note, Effect::Italic)); + text.append(content); - LyricsView { - queue, - view: ScrollView::new(TextView::new(text)), - } - } + text.append("\n\n"); + text.append(StyledString::styled( + manager.get_lyrics_for_current(), + Effect::Simple, + )); - pub fn save_lyrics(&mut self, lyrics: String) -> Result { - // println!("Saving Lyrics: {}", lyrics); + let lyrics_view = ScrollView::new(TextView::new(text).center()); - self.view.get_inner_mut().set_content(lyrics); + let view = LinearLayout::vertical() + .child(TextView::new("Title").center()) + .child(TextView::new("Authors").center()) + .child(TextView::new("Album").center()) + .child(DummyView) + .child(lyrics_view); - Ok(CommandResult::Consumed(None)) + LyricsView { manager, view } + } + + /// Saves the lyrics of the current song + pub fn save_lyrics(&self) -> Result { + let result = self + .manager + .save_lyrics(self.manager.get_lyrics_for_current()); + + Ok(CommandResult::Consumed(result)) } } impl ViewWrapper for LyricsView { - wrap_impl!(self.view: ScrollView); + wrap_impl!(self.view: LinearLayout); } impl ViewExt for LyricsView { @@ -49,9 +67,7 @@ impl ViewExt for LyricsView { } fn title_sub(&self) -> String { - let current_track = self.queue.get_current().unwrap(); - - format!("{}", current_track) + "".to_string() } fn on_leave(&self) {} @@ -62,10 +78,8 @@ impl ViewExt for LyricsView { cmd: &Command, ) -> Result { match cmd { - Command::Save => self.save_lyrics(format!("{}", cmd)), - Command::Quit => Ok(CommandResult::Ignored), - Command::Focus(_) => Ok(CommandResult::Ignored), - _ => Ok(CommandResult::Ignored) + Command::Save => self.save_lyrics(), + _ => Ok(CommandResult::Ignored), } } } From d4c109bc93db97a6aa89dc24f91dc67cd01c1abf Mon Sep 17 00:00:00 2001 From: Nuno Pereira Date: Sat, 1 Apr 2023 10:52:50 +0100 Subject: [PATCH 3/7] Updated lyrics UI, added convenience method for when a view is entered --- src/lyrics.rs | 2 +- src/lyrics_fetcher.rs | 3 ++ src/traits.rs | 5 +++ src/ui/layout.rs | 14 ++++++- src/ui/lyrics.rs | 92 +++++++++++++++++++++++++++++++------------ 5 files changed, 89 insertions(+), 27 deletions(-) diff --git a/src/lyrics.rs b/src/lyrics.rs index a942819a..ef4e5ced 100644 --- a/src/lyrics.rs +++ b/src/lyrics.rs @@ -41,7 +41,7 @@ impl LyricsManager { } /// Returns the track being played currently, or nothing if the user is listening to a podcast episodes - fn get_current_track(&self) -> Option { + pub fn get_current_track(&self) -> Option { let playable = self.queue.get_current().unwrap(); match playable { diff --git a/src/lyrics_fetcher.rs b/src/lyrics_fetcher.rs index 9761ef3b..68f22eba 100644 --- a/src/lyrics_fetcher.rs +++ b/src/lyrics_fetcher.rs @@ -1,3 +1,5 @@ +use log::trace; + use crate::model::track::Track; #[derive(Clone)] @@ -11,6 +13,7 @@ impl LyricsFetcher { /// Fetches the lyrics of the given song using the specified lyrics source pub fn fetch(&self, track: &Track) -> String { // std::thread::sleep(std::time::Duration::from_secs(2)); + trace!("Fetching lyrics for {track}"); format!("Sample Lyrics for {}\n", track.title) } diff --git a/src/traits.rs b/src/traits.rs index 0578023a..61df4fa2 100644 --- a/src/traits.rs +++ b/src/traits.rs @@ -72,6 +72,7 @@ pub trait ViewExt: View { } fn on_leave(&self) {} + fn on_enter(&mut self) {} // TODO: see if there are args that should go here fn on_command(&mut self, _s: &mut Cursive, _cmd: &Command) -> Result { Ok(CommandResult::Ignored) @@ -91,6 +92,10 @@ impl ViewExt for NamedView { self.with_view(|v| v.on_leave()); } + fn on_enter(&mut self) { + self.with_view_mut(|v| v.on_enter()); + } + fn on_command(&mut self, s: &mut Cursive, cmd: &Command) -> Result { self.with_view_mut(move |v| v.on_command(s, cmd)).unwrap() } diff --git a/src/ui/layout.rs b/src/ui/layout.rs index 417c2f9b..de71a77f 100644 --- a/src/ui/layout.rs +++ b/src/ui/layout.rs @@ -148,6 +148,11 @@ impl Layout { self.focus = Some(s); self.cmdline_focus = false; + self.screens + .get_mut(self.focus.as_ref().unwrap()) + .unwrap() + .on_enter(); + // trigger a redraw self.ev.trigger(); } @@ -173,12 +178,13 @@ impl Layout { self.result.clone() } - pub fn push_view(&mut self, view: Box) { + pub fn push_view(&mut self, mut view: Box) { if let Some(view) = self.get_top_view() { view.on_leave(); } if let Some(stack) = self.get_focussed_stack_mut() { + view.on_enter(); stack.push(view) } } @@ -495,4 +501,10 @@ impl ViewExt for Layout { } } } + + fn on_enter(&mut self) { + if let Some(view) = self.get_current_view_mut() { + view.on_enter() + } + } } diff --git a/src/ui/lyrics.rs b/src/ui/lyrics.rs index bbd93ac5..b3755be3 100644 --- a/src/ui/lyrics.rs +++ b/src/ui/lyrics.rs @@ -2,9 +2,8 @@ use std::sync::Arc; use cursive::{ theme::Effect, - utils::markup::StyledString, view::ViewWrapper, - views::{DummyView, LinearLayout, ScrollView, TextView}, + views::{DummyView, LinearLayout, ResizedView, ScrollView, TextContent, TextView}, }; use crate::{commands::CommandResult, lyrics::LyricsManager, traits::ViewExt, command::Command}; @@ -12,39 +11,76 @@ use crate::{commands::CommandResult, lyrics::LyricsManager, traits::ViewExt, com pub struct LyricsView { manager: Arc, view: LinearLayout, + track_lyrics: TextContent, + track_title: TextContent, + track_authors: TextContent, + track_album: TextContent, } impl LyricsView { pub fn new(manager: Arc) -> LyricsView { - let mut text = StyledString::styled("Keybindings\n\n", Effect::Bold); + // INITIALIZE THESE WITH "TRASHY" VALUE THAT IS GOING TO BE REPLACED AFTER + let track_title = TextContent::new("No track being played"); + let track_authors = TextContent::new("No track being played"); + let track_album = TextContent::new("No track being played"); + let track_lyrics = TextContent::new("No track being played"); - let note = format!( - "Custom bindings can be set in the {} file within the [keybindings] section.\n\n", - "test" - ); + let lyrics_view = + ScrollView::new(TextView::new_with_content(track_lyrics.clone()).center()); - // TODO: fixme - let content = String::from(""); + let view = LinearLayout::vertical() + .child(ResizedView::with_full_width( + ResizedView::with_fixed_height(5, DummyView), + )) + .child( + TextView::new_with_content(track_title.clone()) + .center() + .style(Effect::Bold), + ) + .child(TextView::new_with_content(track_authors.clone()).center()) + .child( + TextView::new_with_content(track_album.clone()) + .center() + .style(Effect::Italic), + ) + .child(DummyView) + .child(lyrics_view); - text.append(StyledString::styled(note, Effect::Italic)); - text.append(content); + let lyrics_view = LyricsView { + manager, + view, + track_lyrics, + track_album, + track_authors, + track_title, + }; - text.append("\n\n"); - text.append(StyledString::styled( - manager.get_lyrics_for_current(), - Effect::Simple, - )); + lyrics_view.update_lyrics(); - let lyrics_view = ScrollView::new(TextView::new(text).center()); + lyrics_view + } - let view = LinearLayout::vertical() - .child(TextView::new("Title").center()) - .child(TextView::new("Authors").center()) - .child(TextView::new("Album").center()) - .child(DummyView) - .child(lyrics_view); + // needs to be made public in order to be updated from main's event loop + pub fn update_lyrics(&self) { + let current_track = self.manager.get_current_track(); - LyricsView { manager, view } + if let Some(track) = current_track { + let track_title_str = track.clone().title; + + let track_authors_str = track.clone().artists.join(", "); + + let track_album_str = match track.clone().album { + None => String::default(), + Some(album_name) => album_name, + }; + + let track_lyrics_str = self.manager.get_lyrics(track); + + self.track_title.set_content(track_title_str); + self.track_authors.set_content(track_authors_str); + self.track_album.set_content(track_album_str); + self.track_lyrics.set_content(track_lyrics_str); + } } /// Saves the lyrics of the current song @@ -70,7 +106,9 @@ impl ViewExt for LyricsView { "".to_string() } - fn on_leave(&self) {} + fn on_enter(&mut self) { + self.update_lyrics(); + } fn on_command( &mut self, @@ -79,6 +117,10 @@ impl ViewExt for LyricsView { ) -> Result { match cmd { Command::Save => self.save_lyrics(), + Command::Next | Command::Previous => { + // still does not work + Ok(CommandResult::Ignored) // return ignored so it is processed by the default command handler + } _ => Ok(CommandResult::Ignored), } } From d03ceca131f51264da24c66d93acb2e10620b796 Mon Sep 17 00:00:00 2001 From: Nuno Pereira Date: Sat, 15 Apr 2023 12:42:35 +0100 Subject: [PATCH 4/7] Added lyrics cache to LyricsManager --- src/lyrics.rs | 43 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 35 insertions(+), 8 deletions(-) diff --git a/src/lyrics.rs b/src/lyrics.rs index ef4e5ced..294f21cd 100644 --- a/src/lyrics.rs +++ b/src/lyrics.rs @@ -1,4 +1,5 @@ -use std::sync::Arc; +use log::trace; +use std::{cell::RefCell, collections::HashMap, sync::Arc}; use crate::{ lyrics_fetcher::LyricsFetcher, @@ -10,26 +11,52 @@ use crate::{ pub struct LyricsManager { queue: Arc, fetcher: LyricsFetcher, - // TODO: add a cache + cache: RefCell>, } impl LyricsManager { pub fn new(queue: Arc, fetcher: LyricsFetcher) -> Self { - LyricsManager { queue, fetcher } + LyricsManager { + queue, + fetcher, + cache: RefCell::new(HashMap::new()), + } } /// Saves the given lyrics to the user's filesystem. /// /// Returns an optional message indicating the outcome of this operation. pub fn save_lyrics(&self, lyrics: String) -> Option { - Some("".to_string()) + Some(lyrics) } /// Fetches and returns the lyrics of the given track pub fn get_lyrics(&self, track: Track) -> String { - // TODO: implement caching + // TODO: see if this panics later on + let track_id = track.id.as_ref().unwrap(); + + { + // insert new scope so that we can perform both borrows from the RefCell + // the immutable borrow present in this scope is dropped, + // so it is safe to do another borrow after + + let cache = self.cache.borrow(); + + if cache.contains_key(track_id) { + trace!("Retrieving cached lyrics for {}", track.title); + return cache.get(track_id).unwrap().to_owned(); + } + } + + // if we reach this point it means that the cache does not contain this entry yet, update it + let mut cache = self.cache.borrow_mut(); + + // make network request to fetch track's lyrics + let lyrics = self.fetcher.fetch(&track); + + cache.insert(track_id.to_owned(), lyrics.clone()); - self.fetcher.fetch(&track) + lyrics } /// Fetches and returns the lyrics of the currently playing track @@ -40,13 +67,13 @@ impl LyricsManager { } } - /// Returns the track being played currently, or nothing if the user is listening to a podcast episodes + /// Returns the track being played currently, or nothing if the user is listening to a podcast episode pub fn get_current_track(&self) -> Option { let playable = self.queue.get_current().unwrap(); match playable { Playable::Track(track) => Some(track), - Playable::Episode(_) => None, + _ => None, } } } From 1cd6388b6b286b9fd7fd4f57fd160355d9313092 Mon Sep 17 00:00:00 2001 From: Nuno Pereira Date: Tue, 25 Jul 2023 21:00:26 +0100 Subject: [PATCH 5/7] Started work on Musixmatch fetcher --- Cargo.lock | 64 ++++++++++++++++++++++++++++++++++------- src/lyrics.rs | 11 ++++---- src/lyrics_fetcher.rs | 66 ++++++++++++++++++++++++++++++++----------- src/ui/lyrics.rs | 7 +++-- 4 files changed, 112 insertions(+), 36 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0e513c1c..c33af749 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -138,11 +138,7 @@ dependencies = [ name = "anstyle" version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" - -[[package]] -name = "anstyle-parse" -version = "0.2.4" +checksum = "3a30da5c5f2d5e72842e00bcb57657162cdabef0931f40e2deb9b4140440cecd" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" dependencies = [ @@ -614,6 +610,12 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" +[[package]] +name = "colorchoice" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" + [[package]] name = "combine" version = "4.6.7" @@ -2257,18 +2259,18 @@ dependencies = [ [[package]] name = "memoffset" -version = "0.8.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" dependencies = [ "autocfg", ] [[package]] -name = "mime" -version = "0.3.16" +name = "memoffset" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" dependencies = [ "autocfg", ] @@ -2472,10 +2474,15 @@ dependencies = [ "bitflags 1.3.2", "cfg-if", "libc", +<<<<<<< HEAD "memoffset 0.7.1", "static_assertions", ======= <<<<<<< HEAD +||||||| parent of 50c84d3 (Started work on Musixmatch fetcher) +<<<<<<< HEAD +======= +>>>>>>> 50c84d3 (Started work on Musixmatch fetcher) "memoffset 0.6.5", ] @@ -2490,12 +2497,21 @@ dependencies = [ "libc", "memoffset 0.7.1", "static_assertions", +<<<<<<< HEAD ||||||| parent of 1f462a4 (Added lyrics fetcher) "memoffset", ======= "memoffset 0.6.5", >>>>>>> 1f462a4 (Added lyrics fetcher) >>>>>>> 53c07a7 (Added lyrics fetcher) +||||||| parent of 50c84d3 (Started work on Musixmatch fetcher) +||||||| parent of 1f462a4 (Added lyrics fetcher) + "memoffset", +======= + "memoffset 0.6.5", +>>>>>>> 1f462a4 (Added lyrics fetcher) +======= +>>>>>>> 50c84d3 (Started work on Musixmatch fetcher) ] [[package]] @@ -3485,11 +3501,39 @@ dependencies = [ [[package]] name = "rustix" +<<<<<<< HEAD version = "0.38.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" dependencies = [ "bitflags 2.5.0", +||||||| parent of 50c84d3 (Started work on Musixmatch fetcher) +version = "0.37.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d69718bf81c6127a49dc64e44a742e8bb9213c0ff8869a22c308f84c1d4ab06" +dependencies = [ + "bitflags 1.3.2", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys 0.3.8", + "windows-sys", +] + +[[package]] +name = "rustix" +version = "0.38.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a962918ea88d644592894bc6dc55acc6c0956488adcebbfb6e273506b7fd6e5" +dependencies = [ + "bitflags 2.3.3", +======= +version = "0.38.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a962918ea88d644592894bc6dc55acc6c0956488adcebbfb6e273506b7fd6e5" +dependencies = [ + "bitflags 2.3.3", +>>>>>>> 50c84d3 (Started work on Musixmatch fetcher) "errno", "libc", "linux-raw-sys", diff --git a/src/lyrics.rs b/src/lyrics.rs index 294f21cd..4b5a51de 100644 --- a/src/lyrics.rs +++ b/src/lyrics.rs @@ -1,4 +1,4 @@ -use log::trace; +use log::debug; use std::{cell::RefCell, collections::HashMap, sync::Arc}; use crate::{ @@ -7,15 +7,14 @@ use crate::{ queue::Queue, }; -#[derive(Clone)] pub struct LyricsManager { queue: Arc, - fetcher: LyricsFetcher, + fetcher: Box, cache: RefCell>, } impl LyricsManager { - pub fn new(queue: Arc, fetcher: LyricsFetcher) -> Self { + pub fn new(queue: Arc, fetcher: Box) -> Self { LyricsManager { queue, fetcher, @@ -43,8 +42,8 @@ impl LyricsManager { let cache = self.cache.borrow(); if cache.contains_key(track_id) { - trace!("Retrieving cached lyrics for {}", track.title); - return cache.get(track_id).unwrap().to_owned(); + debug!("Retrieving cached lyrics for {}", track.title); + return cache.get(track_id).unwrap().into(); } } diff --git a/src/lyrics_fetcher.rs b/src/lyrics_fetcher.rs index 68f22eba..7986676c 100644 --- a/src/lyrics_fetcher.rs +++ b/src/lyrics_fetcher.rs @@ -1,26 +1,58 @@ -use log::trace; +use std::sync::Arc; -use crate::model::track::Track; +use log::debug; -#[derive(Clone)] -pub struct LyricsFetcher {} +use crate::{config::Config, model::track::Track}; -impl LyricsFetcher { - pub fn new() -> LyricsFetcher { - Self {} - } +pub trait LyricsFetcher { + fn fetch(&self, track: &Track) -> String; +} + +pub struct MusixMatchLyricsFetcher { + api_key: String, +} + +impl LyricsFetcher for MusixMatchLyricsFetcher { + fn fetch(&self, track: &Track) -> String { + let track_title = track.title.clone(); + let track_authors = track.artists.join(", "); + + debug!("Fetching lyrics for {} by {}", track_title, track_authors); - /// Fetches the lyrics of the given song using the specified lyrics source - pub fn fetch(&self, track: &Track) -> String { - // std::thread::sleep(std::time::Duration::from_secs(2)); - trace!("Fetching lyrics for {track}"); + let client = reqwest::blocking::Client::new(); - format!("Sample Lyrics for {}\n", track.title) + let response = client + .get("https://api.musixmatch.com/ws/1.1/matcher.lyrics.get") + .query(&[ + ("q_track", track_title.clone()), + ("q_artist", track_authors), + ("apikey", self.api_key.clone()), + ]) + .send() + .unwrap(); + + if response.status() != 200 { + debug!("Error fetching lyrics for {}", track_title); + return format!("Error fetching lyrics for {}", track_title); + } + + // Do this since we do not have a specific body type to parse into + let text = response.text().unwrap(); + let json: serde_json::Value = serde_json::from_str(&text).unwrap(); + + debug!("Received {:?}", json); + + if json["status_code"] != 200 { + debug!("Error fetching lyrics for {}", track_title); + return format!("Error fetching lyrics for {}", track_title); + } + + json["message"]["body"]["lyrics"]["lyrics_body"].to_string() } } -impl Default for LyricsFetcher { - fn default() -> Self { - LyricsFetcher::new() // TODO: check the prefered fetcher - } +pub fn default_fetcher(cfg: Arc) -> Box { + Box::new(MusixMatchLyricsFetcher { + api_key: cfg.values().backend.clone().unwrap(), + }) } diff --git a/src/ui/lyrics.rs b/src/ui/lyrics.rs index b3755be3..b8dec53d 100644 --- a/src/ui/lyrics.rs +++ b/src/ui/lyrics.rs @@ -60,14 +60,15 @@ impl LyricsView { lyrics_view } - // needs to be made public in order to be updated from main's event loop - pub fn update_lyrics(&self) { + fn update_lyrics(&self) { + // TODO: this should be done in a separate thread and the UI should be updated when the lyrics are fetched (or an error occurs) + let current_track = self.manager.get_current_track(); if let Some(track) = current_track { let track_title_str = track.clone().title; - let track_authors_str = track.clone().artists.join(", "); + let track_authors_str = track.artists.join(", "); let track_album_str = match track.clone().album { None => String::default(), From 81b0d5ec8b8315cceb4a5e8b06a1a948a773a749 Mon Sep 17 00:00:00 2001 From: Nuno Pereira Date: Tue, 25 Jul 2023 21:43:14 +0100 Subject: [PATCH 6/7] Fixed some minor errors --- Cargo.lock | 673 ++++++++++++++++++------------------------ src/application.rs | 13 +- src/lyrics_fetcher.rs | 3 +- 3 files changed, 301 insertions(+), 388 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c33af749..4a9bce6f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "addr2line" -version = "0.21.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" dependencies = [ "gimli", ] @@ -138,7 +138,11 @@ dependencies = [ name = "anstyle" version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a30da5c5f2d5e72842e00bcb57657162cdabef0931f40e2deb9b4140440cecd" +checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" + +[[package]] +name = "anstyle-parse" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" dependencies = [ @@ -147,9 +151,9 @@ dependencies = [ [[package]] name = "anstyle-query" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a64c907d4e79225ac72e2a354c9ce84d50ebb4586dee56c82b3ee73004f537f5" +checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391" dependencies = [ "windows-sys 0.52.0", ] @@ -177,7 +181,7 @@ dependencies = [ "objc2", "objc2-app-kit", "objc2-foundation", - "parking_lot 0.12.2", + "parking_lot 0.12.3", "windows-sys 0.48.0", "wl-clipboard-rs", "x11rb", @@ -185,34 +189,33 @@ dependencies = [ [[package]] name = "async-broadcast" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "258b52a1aa741b9f09783b2d86cf0aeeb617bbf847f6933340a39644227acbdb" +checksum = "20cd0e2e25ea8e5f7e9df04578dc6cf5c83577fd09b1a46aaf5c85e1c33f2a7e" dependencies = [ - "event-listener 5.3.0", - "event-listener-strategy 0.5.2", + "event-listener", + "event-listener-strategy", "futures-core", "pin-project-lite", ] [[package]] name = "async-channel" -version = "2.2.1" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "136d4d23bcc79e27423727b36823d86233aad06dfea531837b038394d11e9928" +checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" dependencies = [ "concurrent-queue", - "event-listener 5.3.0", - "event-listener-strategy 0.5.2", + "event-listener-strategy", "futures-core", "pin-project-lite", ] [[package]] name = "async-executor" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b10202063978b3351199d68f8b22c4e47e4b1b822f8d43fd862d5ea8c006b29a" +checksum = "c8828ec6e544c02b0d6691d21ed9f9218d0384a82542855073c2a3f58304aaf0" dependencies = [ "async-task", "concurrent-queue", @@ -234,9 +237,9 @@ dependencies = [ [[package]] name = "async-io" -version = "2.3.2" +version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcccb0f599cfa2f8ace422d3555572f47424da5648a4382a9dd0310ff8210884" +checksum = "0d6baa8f0178795da0e71bc42c9e5d13261aac7ee549853162e66a241ba17964" dependencies = [ "async-lock", "cfg-if", @@ -253,20 +256,20 @@ dependencies = [ [[package]] name = "async-lock" -version = "3.3.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d034b430882f8381900d3fe6f0aaa3ad94f2cb4ac519b429692a1bc2dda4ae7b" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" dependencies = [ - "event-listener 4.0.3", - "event-listener-strategy 0.4.0", + "event-listener", + "event-listener-strategy", "pin-project-lite", ] [[package]] name = "async-process" -version = "2.2.2" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a53fc6301894e04a92cb2584fedde80cb25ba8e02d9dc39d4a87d036e22f397d" +checksum = "f7eda79bbd84e29c2b308d1dc099d7de8dcc7035e48f4bf5dc4a531a44ff5e2a" dependencies = [ "async-channel", "async-io", @@ -275,7 +278,7 @@ dependencies = [ "async-task", "blocking", "cfg-if", - "event-listener 5.3.0", + "event-listener", "futures-lite", "rustix", "tracing", @@ -290,14 +293,14 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] name = "async-signal" -version = "0.2.6" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afe66191c335039c7bb78f99dc7520b0cbb166b3a1cb33a03f53d8a1c6f2afda" +checksum = "794f185324c2f00e771cd9f1ae8b5ac68be2ca7abb129a87afd6e86d228bc54d" dependencies = [ "async-io", "async-lock", @@ -325,7 +328,7 @@ checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] @@ -342,9 +345,9 @@ checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "backtrace" -version = "0.3.71" +version = "0.3.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" +checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" dependencies = [ "addr2line", "cc", @@ -379,7 +382,7 @@ version = "0.69.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "cexpr", "clang-sys", "itertools", @@ -390,7 +393,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] @@ -401,9 +404,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" [[package]] name = "block" @@ -431,21 +434,20 @@ dependencies = [ [[package]] name = "block2" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43ff7d91d3c1d568065b06c899777d1e48dcf76103a672a0adbc238a7f247f1e" +checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" dependencies = [ "objc2", ] [[package]] name = "blocking" -version = "1.6.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "495f7104e962b7356f0aeb34247aca1fe7d2e783b346582db7f2904cb5717e88" +checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" dependencies = [ "async-channel", - "async-lock", "async-task", "futures-io", "futures-lite", @@ -460,9 +462,9 @@ checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytemuck" -version = "1.15.0" +version = "1.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d6d68c57235a3a081186990eca2867354726650f42f7516ca50c28d6281fd15" +checksum = "b236fc92302c97ed75b38da1f4917b5cdda4984745740f153a5d3059e48d725e" [[package]] name = "byteorder" @@ -478,9 +480,9 @@ checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" [[package]] name = "cc" -version = "1.0.97" +version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "099a5357d84c4c61eb35fc8eafa9a79a902c2f76911e5747ced4e032edd8d9b4" +checksum = "ac367972e516d45567c7eafc73d24e1c193dcf200a8d94e9db7b3d38b349572d" dependencies = [ "jobserver", "libc", @@ -540,9 +542,9 @@ dependencies = [ [[package]] name = "clang-sys" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67523a3b4be3ce1989d607a828d036249522dd9c1c8de7f4dd2dae43a37369d1" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" dependencies = [ "glob", "libc", @@ -581,9 +583,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" +checksum = "4b82cf0babdbd58558212896d1a4272303a57bdb245c2bf1147185fb45640e70" [[package]] name = "clap_mangen" @@ -610,12 +612,6 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" -[[package]] -name = "colorchoice" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" - [[package]] name = "combine" version = "4.6.7" @@ -757,26 +753,25 @@ dependencies = [ ] [[package]] -name = "crossbeam" -version = "0.8.2" +name = "crc32fast" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2801af0d36612ae591caa9568261fddce32ce6e08a7275ea334a06a4ad021a2c" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ "cfg-if", - "crossbeam-channel", - "crossbeam-deque", - "crossbeam-epoch", - "crossbeam-queue", - "crossbeam-utils", ] [[package]] -name = "crossbeam-channel" -version = "0.5.8" +name = "crossbeam" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" +checksum = "1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8" dependencies = [ - "cfg-if", + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-epoch", + "crossbeam-queue", + "crossbeam-utils", ] [[package]] @@ -790,43 +785,37 @@ dependencies = [ [[package]] name = "crossbeam-deque" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" dependencies = [ - "cfg-if", "crossbeam-epoch", "crossbeam-utils", ] [[package]] name = "crossbeam-epoch" -version = "0.9.14" +version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46bd5f3f85273295a9d14aedfb86f6aadbff6d8f5295c4a9edb08e819dcf5695" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" dependencies = [ - "autocfg", - "cfg-if", "crossbeam-utils", - "memoffset 0.8.0", - "scopeguard", ] [[package]] name = "crossbeam-queue" -version = "0.3.8" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" +checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" dependencies = [ - "cfg-if", "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.19" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" [[package]] name = "crossterm" @@ -838,7 +827,7 @@ dependencies = [ "crossterm_winapi", "libc", "mio", - "parking_lot 0.12.2", + "parking_lot 0.12.3", "signal-hook", "signal-hook-mio", "winapi", @@ -918,7 +907,7 @@ dependencies = [ "interpolation", "lazy_static", "log", - "num 0.4.0", + "num 0.4.3", "send_wrapper", ] @@ -968,12 +957,12 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.8" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" +checksum = "83b2eb4d90d12bdda5ed17de686c2acb4c57914f8f921b8da7e112b5a36f3fe1" dependencies = [ - "darling_core 0.20.8", - "darling_macro 0.20.8", + "darling_core 0.20.9", + "darling_macro 0.20.9", ] [[package]] @@ -992,15 +981,15 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.8" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" +checksum = "622687fe0bac72a04e5599029151f5796111b90f1baaa9b544d807a5e31cd120" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] @@ -1016,13 +1005,13 @@ dependencies = [ [[package]] name = "darling_macro" -version = "0.20.8" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" +checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178" dependencies = [ - "darling_core 0.20.8", + "darling_core 0.20.9", "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] @@ -1042,7 +1031,7 @@ checksum = "d150dea618e920167e5973d70ae6ece4385b7164e0d799fe7c122dd0a5d912ad" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] @@ -1096,20 +1085,20 @@ dependencies = [ ] [[package]] -name = "doc-comment" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" - -[[package]] -name = "downcast-rs" -version = "1.2.0" +name = "dlib" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" dependencies = [ "libloading", ] +[[package]] +name = "doc-comment" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" + [[package]] name = "downcast-rs" version = "1.2.1" @@ -1118,9 +1107,9 @@ checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" [[package]] name = "either" -version = "1.11.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "encoding_rs" @@ -1154,7 +1143,7 @@ checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] @@ -1166,14 +1155,14 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] name = "enumflags2" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3278c9d5fb675e0a51dabcf4c0d355f692b064171535ba72361be1528a9d8e8d" +checksum = "d232db7f5956f3f14313dc2f87985c58bd2c695ce124c8cdd984e08e15ac133d" dependencies = [ "enumflags2_derive", "serde", @@ -1181,13 +1170,13 @@ dependencies = [ [[package]] name = "enumflags2_derive" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c785274071b1b420972453b306eeca06acf4633829db4223b58a2a8c5953bc4" +checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] @@ -1205,10 +1194,10 @@ version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e08b6c6ab82d70f08844964ba10c7babb716de2ecaeab9be5717918a5177d3af" dependencies = [ - "darling 0.20.8", + "darling 0.20.9", "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] @@ -1235,43 +1224,22 @@ checksum = "a0474425d51df81997e2f90a21591180b38eccf27292d755f3e30750225c175b" [[package]] name = "event-listener" -version = "4.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "event-listener" -version = "5.3.0" +version = "5.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d9944b8ca13534cdfb2800775f8dd4902ff3fc75a50101466decadfdf322a24" +checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" dependencies = [ "concurrent-queue", "parking", "pin-project-lite", ] -[[package]] -name = "event-listener-strategy" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" -dependencies = [ - "event-listener 4.0.3", - "pin-project-lite", -] - [[package]] name = "event-listener-strategy" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" dependencies = [ - "event-listener 5.3.0", + "event-listener", "pin-project-lite", ] @@ -1348,7 +1316,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] @@ -1441,7 +1409,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] @@ -1509,9 +1477,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.1" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" [[package]] name = "glob" @@ -1521,15 +1489,15 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "h2" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "816ec7294445779408f36fe57bc5b7fc1cf59664059096c65f905c1c61f58069" +checksum = "fa82e28a107a8cc405f0839610bdc9b15f1e25ec7d696aa5cf173edbcb1486ab" dependencies = [ + "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "futures-util", "http 1.1.0", "indexmap 2.2.6", "slab", @@ -1592,6 +1560,12 @@ version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" +[[package]] +name = "hermit-abi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" + [[package]] name = "hex" version = "0.4.3" @@ -1662,12 +1636,12 @@ dependencies = [ [[package]] name = "http-body-util" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" dependencies = [ "bytes", - "futures-core", + "futures-util", "http 1.1.0", "http-body 1.0.0", "pin-project-lite", @@ -1675,9 +1649,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.8.0" +version = "1.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" [[package]] name = "httpdate" @@ -1687,9 +1661,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "0.14.28" +version = "0.14.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" +checksum = "f361cde2f109281a220d4307746cdfd5ee3f410da58a70377762396775634b33" dependencies = [ "bytes", "futures-channel", @@ -1738,7 +1712,7 @@ dependencies = [ "futures", "headers", "http 0.2.12", - "hyper 0.14.28", + "hyper 0.14.29", "tokio", "tower-service", ] @@ -1761,9 +1735,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.3" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" +checksum = "7b875924a60b96e5d7b9ae7b066540b1dd1cbd90d1828f54c92e02a283351c56" dependencies = [ "bytes", "futures-channel", @@ -1853,9 +1827,9 @@ dependencies = [ [[package]] name = "instant" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" dependencies = [ "cfg-if", ] @@ -1866,17 +1840,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3b7357d2bbc5ee92f8e899ab645233e43d21407573cceb37fed8bc3dede2c02" -[[package]] -name = "io-lifetimes" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" -dependencies = [ - "hermit-abi", - "libc", - "windows-sys", -] - [[package]] name = "ioctl-rs" version = "0.2.0" @@ -1959,9 +1922,9 @@ dependencies = [ [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "lazycell" @@ -1988,9 +1951,9 @@ checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" [[package]] name = "libloading" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" +checksum = "e310b3a6b5907f99202fcdb4960ff45b93735d7c7d96b760fcff8db2dc0e103d" dependencies = [ "cfg-if", "windows-targets 0.52.5", @@ -2056,7 +2019,7 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "libc", ] @@ -2092,7 +2055,7 @@ dependencies = [ "hmac", "http 0.2.12", "httparse", - "hyper 0.14.28", + "hyper 0.14.29", "hyper-proxy", "librespot-protocol", "log", @@ -2150,7 +2113,7 @@ dependencies = [ "librespot-metadata", "log", "ogg", - "parking_lot 0.12.2", + "parking_lot 0.12.3", "portaudio-rs", "rand", "rand_distr", @@ -2174,9 +2137,9 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "lock_api" @@ -2239,14 +2202,14 @@ checksum = "5cf92c10c7e361d6b99666ec1c6f9805b0bea2c3bd8c78dc6fe98ac5bd78db11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] name = "memchr" -version = "2.7.2" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "memoffset" @@ -2259,18 +2222,9 @@ dependencies = [ [[package]] name = "memoffset" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" -dependencies = [ - "autocfg", -] - -[[package]] -name = "memoffset" -version = "0.8.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" dependencies = [ "autocfg", ] @@ -2289,9 +2243,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" dependencies = [ "adler", "simd-adler32", @@ -2311,11 +2265,10 @@ dependencies = [ [[package]] name = "native-tls" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" dependencies = [ - "lazy_static", "libc", "log", "openssl", @@ -2455,63 +2408,11 @@ version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "cfg-if", "cfg_aliases", "libc", -<<<<<<< HEAD "memoffset 0.9.1", -||||||| parent of 53c07a7 (Added lyrics fetcher) - "memoffset 0.6.5", -] - -[[package]] -name = "nix" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfdda3d196821d6af13126e40375cdf7da646a96114af134d5f417a9a1dc8e1a" -dependencies = [ - "bitflags 1.3.2", - "cfg-if", - "libc", -<<<<<<< HEAD - "memoffset 0.7.1", - "static_assertions", -======= -<<<<<<< HEAD -||||||| parent of 50c84d3 (Started work on Musixmatch fetcher) -<<<<<<< HEAD -======= ->>>>>>> 50c84d3 (Started work on Musixmatch fetcher) - "memoffset 0.6.5", -] - -[[package]] -name = "nix" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfdda3d196821d6af13126e40375cdf7da646a96114af134d5f417a9a1dc8e1a" -dependencies = [ - "bitflags 1.3.2", - "cfg-if", - "libc", - "memoffset 0.7.1", - "static_assertions", -<<<<<<< HEAD -||||||| parent of 1f462a4 (Added lyrics fetcher) - "memoffset", -======= - "memoffset 0.6.5", ->>>>>>> 1f462a4 (Added lyrics fetcher) ->>>>>>> 53c07a7 (Added lyrics fetcher) -||||||| parent of 50c84d3 (Started work on Musixmatch fetcher) -||||||| parent of 1f462a4 (Added lyrics fetcher) - "memoffset", -======= - "memoffset 0.6.5", ->>>>>>> 1f462a4 (Added lyrics fetcher) -======= ->>>>>>> 50c84d3 (Started work on Musixmatch fetcher) ] [[package]] @@ -2557,14 +2458,8 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" dependencies = [ -<<<<<<< HEAD + "num-bigint 0.4.5", "num-complex 0.4.6", -||||||| parent of 53c07a7 (Added lyrics fetcher) - "num-complex 0.4.3", -======= - "num-bigint 0.4.3", - "num-complex 0.4.3", ->>>>>>> 53c07a7 (Added lyrics fetcher) "num-integer", "num-iter", "num-rational 0.4.2", @@ -2667,13 +2562,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" dependencies = [ -<<<<<<< HEAD -||||||| parent of 53c07a7 (Added lyrics fetcher) - "autocfg", -======= - "autocfg", - "num-bigint 0.4.3", ->>>>>>> 53c07a7 (Added lyrics fetcher) + "num-bigint 0.4.5", "num-integer", "num-traits", ] @@ -2694,7 +2583,7 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi", + "hermit-abi 0.3.9", "libc", ] @@ -2756,15 +2645,15 @@ dependencies = [ [[package]] name = "objc-sys" -version = "0.3.3" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da284c198fb9b7b0603f8635185e85fbd5b64ee154b1ed406d489077de2d6d60" +checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" [[package]] name = "objc2" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4b25e1034d0e636cd84707ccdaa9f81243d399196b8a773946dcffec0401659" +checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" dependencies = [ "objc-sys", "objc2-encode", @@ -2772,41 +2661,85 @@ dependencies = [ [[package]] name = "objc2-app-kit" -version = "0.2.0" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb79768a710a9a1798848179edb186d1af7e8a8679f369e4b8d201dd2a034047" +checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" dependencies = [ + "bitflags 2.6.0", "block2", + "libc", "objc2", "objc2-core-data", + "objc2-core-image", "objc2-foundation", + "objc2-quartz-core", ] [[package]] name = "objc2-core-data" -version = "0.2.0" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e092bc42eaf30a08844e6a076938c60751225ec81431ab89f5d1ccd9f958d6c" +checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" dependencies = [ + "bitflags 2.6.0", "block2", "objc2", "objc2-foundation", ] +[[package]] +name = "objc2-core-image" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" +dependencies = [ + "block2", + "objc2", + "objc2-foundation", + "objc2-metal", +] + [[package]] name = "objc2-encode" -version = "4.0.1" +version = "4.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88658da63e4cc2c8adb1262902cd6af51094df0488b760d6fd27194269c0950a" +checksum = "7891e71393cd1f227313c9379a26a584ff3d7e6e7159e988851f0934c993f0f8" [[package]] name = "objc2-foundation" -version = "0.2.0" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" +dependencies = [ + "bitflags 2.6.0", + "block2", + "libc", + "objc2", +] + +[[package]] +name = "objc2-metal" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfaefe14254871ea16c7d88968c0ff14ba554712a20d76421eec52f0a7fb8904" +checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" dependencies = [ + "bitflags 2.6.0", "block2", "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-foundation", + "objc2-metal", ] [[package]] @@ -2820,9 +2753,9 @@ dependencies = [ [[package]] name = "object" -version = "0.32.2" +version = "0.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +checksum = "576dfe1fc8f9df304abb159d767a29d0476f7750fbf8aa7ad07816004a207434" dependencies = [ "memchr", ] @@ -2877,7 +2810,7 @@ version = "0.10.64" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "cfg-if", "foreign-types 0.3.2", "libc", @@ -2894,7 +2827,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] @@ -2927,9 +2860,9 @@ dependencies = [ [[package]] name = "os_pipe" -version = "1.1.5" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57119c3b893986491ec9aa85056780d3a0f3cf4da7cc09dd3650dbd6c6738fb9" +checksum = "29d73ba8daf8fac13b0501d1abeddcfe21ba7401ada61a819144b6c2a4f32209" dependencies = [ "libc", "windows-sys 0.52.0", @@ -2976,9 +2909,9 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.12.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e4af0ca4f6caed20e900d564c242b8e5d4903fdacf31d3daf527b66fe6f42fb" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", "parking_lot_core 0.9.10", @@ -3008,7 +2941,7 @@ dependencies = [ "cfg-if", "libc", "petgraph", - "redox_syscall 0.5.1", + "redox_syscall 0.5.2", "smallvec", "thread-id", "windows-targets 0.52.5", @@ -3078,7 +3011,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] @@ -3095,9 +3028,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "piper" -version = "0.2.1" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4" +checksum = "ae1d5c74c9876f070d3e8fd503d748c7d974c3e48da8f41350fa5222ef9b4391" dependencies = [ "atomic-waker", "fastrand", @@ -3134,13 +3067,13 @@ dependencies = [ [[package]] name = "polling" -version = "3.7.0" +version = "3.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645493cf344456ef24219d02a768cf1fb92ddf8c92161679ae3d91b91a637be3" +checksum = "a3ed00ed3fbf728b5816498ecd316d1716eecaced9c0c8d2c5a6740ca214985b" dependencies = [ "cfg-if", "concurrent-queue", - "hermit-abi", + "hermit-abi 0.4.0", "pin-project-lite", "rustix", "tracing", @@ -3211,9 +3144,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.85" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22244ce15aa966053a896d1accb3a6e68469b97c7f33f284b99f0d576879fc23" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] @@ -3312,11 +3245,11 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e" +checksum = "c82cf8cff14456045f55ec4241383baeff27af886adb72ffb2162f99911de0fd" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", ] [[package]] @@ -3350,9 +3283,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" dependencies = [ "aho-corasick", "memchr", @@ -3361,9 +3294,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" [[package]] name = "reqwest" @@ -3501,39 +3434,11 @@ dependencies = [ [[package]] name = "rustix" -<<<<<<< HEAD version = "0.38.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" dependencies = [ - "bitflags 2.5.0", -||||||| parent of 50c84d3 (Started work on Musixmatch fetcher) -version = "0.37.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d69718bf81c6127a49dc64e44a742e8bb9213c0ff8869a22c308f84c1d4ab06" -dependencies = [ - "bitflags 1.3.2", - "errno", - "io-lifetimes", - "libc", - "linux-raw-sys 0.3.8", - "windows-sys", -] - -[[package]] -name = "rustix" -version = "0.38.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a962918ea88d644592894bc6dc55acc6c0956488adcebbfb6e273506b7fd6e5" -dependencies = [ - "bitflags 2.3.3", -======= -version = "0.38.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a962918ea88d644592894bc6dc55acc6c0956488adcebbfb6e273506b7fd6e5" -dependencies = [ - "bitflags 2.3.3", ->>>>>>> 50c84d3 (Started work on Musixmatch fetcher) + "bitflags 2.6.0", "errno", "libc", "linux-raw-sys", @@ -3558,9 +3463,9 @@ checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" [[package]] name = "rustversion" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "092474d1a01ea8278f69e6a358998405fae5b8b963ddaeb2b0b04a128bf1dfb0" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" [[package]] name = "ryu" @@ -3604,7 +3509,7 @@ version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "core-foundation", "core-foundation-sys", "libc", @@ -3660,14 +3565,14 @@ checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] name = "serde_json" -version = "1.0.117" +version = "1.0.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3" +checksum = "d947f6b3163d8857ea16c4fa0dd4840d52f3041039a85decd46867eb1abef2e4" dependencies = [ "itoa", "ryu", @@ -3682,7 +3587,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] @@ -3883,7 +3788,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] @@ -3905,9 +3810,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.66" +version = "2.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c42f3f41a2de00b01c0aaad383c5a45241efc8b2d1eda5661812fda5f3cdcff5" +checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9" dependencies = [ "proc-macro2", "quote", @@ -3988,22 +3893,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.60" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "579e9083ca58dd9dcf91a9923bb9054071b9ebbd800b342194c9feb0ee89fc18" +checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.60" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2470041c06ec3ac1ab38d0356a6119054dedaea53e12fbefc0de730a1c08524" +checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] @@ -4062,9 +3967,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.6.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "c55115c6fbe2d2bef26eb09ad74bde02d8255476fc0c7b515ef09fbb35742d82" dependencies = [ "tinyvec_macros", ] @@ -4086,7 +3991,7 @@ dependencies = [ "libc", "mio", "num_cpus", - "parking_lot 0.12.2", + "parking_lot 0.12.3", "pin-project-lite", "signal-hook-registry", "socket2", @@ -4103,7 +4008,7 @@ checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] @@ -4194,7 +4099,7 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "winnow 0.6.8", + "winnow 0.6.13", ] [[package]] @@ -4210,7 +4115,6 @@ dependencies = [ "tokio", "tower-layer", "tower-service", - "tracing", ] [[package]] @@ -4231,7 +4135,6 @@ version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ - "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -4245,7 +4148,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] @@ -4259,9 +4162,9 @@ dependencies = [ [[package]] name = "tree_magic_mini" -version = "3.1.4" +version = "3.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ee137597cdb361b55a4746983e4ac1b35ab6024396a419944ad473bb915265" +checksum = "469a727cac55b41448315cc10427c069c618ac59bb6a4480283fcd811749bdc2" dependencies = [ "fnv", "home", @@ -4358,15 +4261,15 @@ dependencies = [ [[package]] name = "utf8parse" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.8.0" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" +checksum = "5de17fd2f7da591098415cff336e12965a28061ddace43b59cb3c430179c9439" dependencies = [ "getrandom", ] @@ -4440,7 +4343,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", "wasm-bindgen-shared", ] @@ -4474,7 +4377,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -4487,9 +4390,9 @@ checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" [[package]] name = "wayland-backend" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d50fa61ce90d76474c87f5fc002828d81b32677340112b4ef08079a9d459a40" +checksum = "34e9e6b6d4a2bb4e7e69433e0b35c7923b95d4dc8503a84d25ec917a4bbfdf07" dependencies = [ "cc", "downcast-rs", @@ -4501,11 +4404,11 @@ dependencies = [ [[package]] name = "wayland-client" -version = "0.31.2" +version = "0.31.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82fb96ee935c2cea6668ccb470fb7771f6215d1691746c2d896b447a00ad3f1f" +checksum = "1e63801c85358a431f986cffa74ba9599ff571fc5774ac113ed3b490c19a1133" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "rustix", "wayland-backend", "wayland-scanner", @@ -4517,7 +4420,7 @@ version = "0.31.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f81f365b8b4a97f422ac0e8737c438024b5951734506b0e1d775c73030561f4" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "wayland-backend", "wayland-client", "wayland-scanner", @@ -4529,7 +4432,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad1f61b76b6c2d8742e10f9ba5c3737f6530b4c243132c2a2ccc8aa96fe25cd6" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "wayland-backend", "wayland-client", "wayland-protocols", @@ -4538,9 +4441,9 @@ dependencies = [ [[package]] name = "wayland-scanner" -version = "0.31.1" +version = "0.31.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63b3a62929287001986fb58c789dce9b67604a397c15c611ad9f747300b6c283" +checksum = "67da50b9f80159dec0ea4c11c13e24ef9e7574bd6ce24b01860a175010cea565" dependencies = [ "proc-macro2", "quick-xml", @@ -4549,9 +4452,9 @@ dependencies = [ [[package]] name = "wayland-sys" -version = "0.31.1" +version = "0.31.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15a0c8eaff5216d07f226cb7a549159267f3467b289d9a2e52fd3ef5aae2b7af" +checksum = "105b1842da6554f91526c14a2a2172897b7f745a805d62af4ce698706be79c12" dependencies = [ "dlib", "log", @@ -4644,7 +4547,7 @@ checksum = "f6fc35f58ecd95a9b71c4f2329b911016e6bec66b3f2e6a4aad86bd2e99e2f9b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] @@ -4655,14 +4558,14 @@ checksum = "08990546bf4edef8f431fa6326e032865f27138718c587dc21bc0265bbcb57cc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] name = "windows-result" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "749f0da9cc72d82e600d8d2e44cadd0b9eedb9038f71a1c58556ac1c5791813b" +checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" dependencies = [ "windows-targets 0.52.5", ] @@ -4826,9 +4729,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.6.8" +version = "0.6.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3c52e9c97a68071b23e836c9380edae937f17b9c4667bd021973efc689f618d" +checksum = "59b5e5f6c299a3c7890b876a2a587f3115162487e704907d9b6cd29473052ba1" dependencies = [ "memchr", ] @@ -4891,12 +4794,12 @@ checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d" [[package]] name = "xdg-home" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21e5a325c3cb8398ad6cf859c1135b25dd29e186679cf2da7581d9679f63b38e" +checksum = "ca91dcf8f93db085f3a0a29358cd0b9d670915468f4290e8b85d118a34211ab8" dependencies = [ "libc", - "winapi", + "windows-sys 0.52.0", ] [[package]] @@ -4932,7 +4835,7 @@ dependencies = [ "async-trait", "blocking", "enumflags2", - "event-listener 5.3.0", + "event-listener", "futures-core", "futures-sink", "futures-util", @@ -4963,7 +4866,7 @@ dependencies = [ "proc-macro-crate 3.1.0", "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", "zvariant_utils", ] @@ -5005,7 +4908,7 @@ checksum = "125139de3f6b9d625c39e2efdd73d41bdac468ccd556556440e322be0e1bbd91" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] @@ -5016,7 +4919,7 @@ checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] @@ -5041,7 +4944,7 @@ dependencies = [ "proc-macro-crate 3.1.0", "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", "zvariant_utils", ] @@ -5053,5 +4956,5 @@ checksum = "fc242db087efc22bd9ade7aa7809e4ba828132edc312871584a6b4391bdf8786" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", ] diff --git a/src/application.rs b/src/application.rs index 4e9bfaec..9330d2c2 100644 --- a/src/application.rs +++ b/src/application.rs @@ -18,7 +18,7 @@ use crate::library::Library; use crate::queue::Queue; use crate::spotify::{PlayerEvent, Spotify}; use crate::ui::create_cursive; -use crate::{authentication, ui, utils}; +use crate::{authentication, ui, lyrics, lyrics_fetcher, utils}; use crate::{command, queue, spotify}; #[cfg(feature = "mpris")] @@ -130,6 +130,15 @@ impl Application { library.clone(), )); + println!("Building lyrics manager"); + + let lyrics_manager = Arc::new(lyrics::LyricsManager::new( + queue.clone(), + lyrics_fetcher::default_fetcher(configuration.clone()), + )); + + println!("Built lyrics manager"); + #[cfg(feature = "mpris")] let mpris_manager = mpris::MprisManager::new( event_manager.clone(), @@ -176,7 +185,7 @@ impl Application { let queueview = ui::queue::QueueView::new(queue.clone(), library.clone()); - let lyricsview = ui::lyrics::LyricsView::new(queue.clone()); + let lyricsview = ui::lyrics::LyricsView::new(lyrics_manager.clone()); #[cfg(feature = "cover")] let coverview = ui::cover::CoverView::new(queue.clone(), library.clone(), &configuration); diff --git a/src/lyrics_fetcher.rs b/src/lyrics_fetcher.rs index 7986676c..d9bef8c4 100644 --- a/src/lyrics_fetcher.rs +++ b/src/lyrics_fetcher.rs @@ -51,8 +51,9 @@ impl LyricsFetcher for MusixMatchLyricsFetcher { } } +/// Create a default lyrics fetcher. pub fn default_fetcher(cfg: Arc) -> Box { Box::new(MusixMatchLyricsFetcher { - api_key: cfg.values().backend.clone().unwrap(), + api_key: cfg.values().backend.clone().unwrap_or_default(), }) } From 2fa79321a425f1a0aabac728cb4c07740997e1d7 Mon Sep 17 00:00:00 2001 From: Nuno Pereira Date: Wed, 26 Jun 2024 22:05:35 +0100 Subject: [PATCH 7/7] Changed default lyrics provider from Musixmatch to OVH We are subject to the availability of that API. I still need to investigate whether this breaks TOS. Currently needing to handle line-feeds (and carriage returns) when rendering text in cursive. --- Cargo.lock | 7 +++++++ Cargo.toml | 1 + src/lyrics_fetcher.rs | 46 +++++++++++++++++++++---------------------- src/ui/lyrics.rs | 2 +- 4 files changed, 31 insertions(+), 25 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4a9bce6f..9d25ece6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2319,6 +2319,7 @@ dependencies = [ "toml", "unicode-width", "url", + "urlencoding", "zbus", ] @@ -4259,6 +4260,12 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "urlencoding" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" + [[package]] name = "utf8parse" version = "0.2.2" diff --git a/Cargo.toml b/Cargo.toml index 32c10774..76bcc6ed 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -69,6 +69,7 @@ unicode-width = "0.1.13" url = "2.5" cursive_buffered_backend = "0.6.1" cursive-async-view = "0.6.0" +urlencoding = "2.1.3" [target.'cfg(unix)'.dependencies] signal-hook = "0.3.0" diff --git a/src/lyrics_fetcher.rs b/src/lyrics_fetcher.rs index d9bef8c4..76615b57 100644 --- a/src/lyrics_fetcher.rs +++ b/src/lyrics_fetcher.rs @@ -3,16 +3,14 @@ use std::sync::Arc; use log::debug; use crate::{config::Config, model::track::Track}; - +use urlencoding::encode; pub trait LyricsFetcher { fn fetch(&self, track: &Track) -> String; } -pub struct MusixMatchLyricsFetcher { - api_key: String, -} +pub struct OVHLyricsFetcher; -impl LyricsFetcher for MusixMatchLyricsFetcher { +impl LyricsFetcher for OVHLyricsFetcher { fn fetch(&self, track: &Track) -> String { let track_title = track.title.clone(); let track_authors = track.artists.join(", "); @@ -21,18 +19,25 @@ impl LyricsFetcher for MusixMatchLyricsFetcher { let client = reqwest::blocking::Client::new(); - let response = client - .get("https://api.musixmatch.com/ws/1.1/matcher.lyrics.get") - .query(&[ - ("q_track", track_title.clone()), - ("q_artist", track_authors), - ("apikey", self.api_key.clone()), - ]) - .send() - .unwrap(); + let endpoint = reqwest::Url::parse( + format!( + "https://api.lyrics.ovh/v1/{}/{}", + encode(track.artists[0].as_str()).into_owned(), + encode(track_title.as_str()).into_owned() + ) + .as_str(), + ) + .unwrap(); + + // TODO: probably should not be blocking + let response = client.get(endpoint).send().unwrap(); if response.status() != 200 { - debug!("Error fetching lyrics for {}", track_title); + debug!( + "Error fetching lyrics for {}: {}", + track_title, + response.status() + ); return format!("Error fetching lyrics for {}", track_title); } @@ -42,18 +47,11 @@ impl LyricsFetcher for MusixMatchLyricsFetcher { debug!("Received {:?}", json); - if json["status_code"] != 200 { - debug!("Error fetching lyrics for {}", track_title); - return format!("Error fetching lyrics for {}", track_title); - } - - json["message"]["body"]["lyrics"]["lyrics_body"].to_string() + json["lyrics"].to_string() } } /// Create a default lyrics fetcher. pub fn default_fetcher(cfg: Arc) -> Box { - Box::new(MusixMatchLyricsFetcher { - api_key: cfg.values().backend.clone().unwrap_or_default(), - }) + Box::new(OVHLyricsFetcher {}) } diff --git a/src/ui/lyrics.rs b/src/ui/lyrics.rs index b8dec53d..7b0a8fbb 100644 --- a/src/ui/lyrics.rs +++ b/src/ui/lyrics.rs @@ -6,7 +6,7 @@ use cursive::{ views::{DummyView, LinearLayout, ResizedView, ScrollView, TextContent, TextView}, }; -use crate::{commands::CommandResult, lyrics::LyricsManager, traits::ViewExt, command::Command}; +use crate::{command::Command, commands::CommandResult, lyrics::LyricsManager, traits::ViewExt}; pub struct LyricsView { manager: Arc,