aboutsummaryrefslogtreecommitdiff
path: root/src/sources/swinsian.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/sources/swinsian.rs')
-rw-r--r--src/sources/swinsian.rs62
1 files changed, 62 insertions, 0 deletions
diff --git a/src/sources/swinsian.rs b/src/sources/swinsian.rs
new file mode 100644
index 0000000..641af6f
--- /dev/null
+++ b/src/sources/swinsian.rs
@@ -0,0 +1,62 @@
+use std::io::Result;
+
+use objc2::{msg_send, rc::Retained, runtime::AnyObject};
+use objc2_foundation::NSString;
+use objc2_scripting_bridge::SBApplication;
+
+use crate::Track;
+
+use super::LyricsSource;
+
+pub struct Swinsian;
+
+impl Swinsian {
+ pub fn new() -> Self {
+ Swinsian
+ }
+}
+
+impl LyricsSource for Swinsian {
+ fn name(&self) -> String {
+ "swinsian".to_string()
+ }
+
+ fn current_track(&self) -> Option<Track> {
+ unsafe {
+ let bundle_identifier = NSString::from_str("com.swinsian.Swinsian");
+ if let Some(app) = SBApplication::applicationWithBundleIdentifier(&bundle_identifier) {
+ let key = NSString::from_str("currentTrack");
+ let current_track: Option<Retained<AnyObject>> = msg_send![&app, valueForKey:&*key];
+
+ if let Some(track) = current_track {
+ let name_key = NSString::from_str("name");
+ let artist_key = NSString::from_str("artist");
+
+ let name: Option<Retained<NSString>> =
+ msg_send![&track, valueForKey:&*name_key];
+ let artist: Option<Retained<NSString>> =
+ msg_send![&track, valueForKey:&*artist_key];
+
+ if let Some(name) = name.map(|s| s.to_string())
+ && let Some(artist) = artist.map(|s| s.to_string())
+ {
+ return Some(Track { name, artist });
+ }
+ }
+ }
+ }
+ None
+ }
+
+ fn disable(&self) -> Result<()> {
+ Ok(())
+ }
+
+ fn enable(&self) -> Result<()> {
+ Ok(())
+ }
+
+ fn reset(&self) -> Result<()> {
+ Ok(())
+ }
+}