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 { 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> = 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> = msg_send![&track, valueForKey:&*name_key]; let artist: Option> = 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(()) } }