diff options
Diffstat (limited to 'src/sources/swinsian.rs')
| -rw-r--r-- | src/sources/swinsian.rs | 62 |
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(()) + } +} |