use crate::application_data::ApplicationData;
use crate::error::Error;
use crate::playlist::Playlist;
use crate::script_controller::{ParamType, ScriptController};
use crate::track::Track;
use strum_macros::Display;
pub struct AppleMusic;
impl AppleMusic {
pub fn get_application_data() -> Result<ApplicationData, Error> {
match ScriptController.execute_script::<ApplicationData>(
ParamType::ApplicationData,
None,
None,
) {
Ok(data) => Ok(data),
Err(err) => Err(err),
}
}
pub fn get_playlist_by_id(id: i32) -> Result<Playlist, Error> {
match ScriptController.execute_script::<Playlist>(ParamType::PlaylistById, Some(id), None) {
Ok(data) => Ok(data),
Err(err) => Err(err),
}
}
pub fn get_current_track() -> Result<Track, Error> {
match ScriptController.execute_script::<Track>(ParamType::CurrentTrack, None, None) {
Ok(data) => Ok(data),
Err(err) => Err(err),
}
}
pub fn get_all_library_tracks() -> Result<Vec<Track>, Error> {
match ScriptController.execute_script::<Vec<Track>>(ParamType::AllTracks, None, None) {
Ok(data) => Ok(data),
Err(err) => Err(err),
}
}
pub fn play_track(track: &Track) -> Result<(), Error> {
let cmd = format!(
"Application('Music').play(Application('Music').tracks.byId({}))",
track.id
);
let _ = ScriptController.execute(cmd.as_str(), None);
Ok(())
}
pub fn play_playlist(playlist: &Playlist) -> Result<(), Error> {
let cmd = format!(
"Application('Music').play(Application('Music').playlists.byId({}))",
playlist.id
);
let _ = ScriptController.execute(cmd.as_str(), None);
Ok(())
}
pub fn set_mute(value: bool) -> Result<(), Error> {
let cmd = format!("Application('Music').mute = {}", value);
let _ = ScriptController.execute(cmd.as_str(), None);
Ok(())
}
pub fn set_shuffle(value: bool) -> Result<(), Error> {
let cmd = format!("Application('Music').shuffleEnabled = {}", value);
let _ = ScriptController.execute(cmd.as_str(), None);
Ok(())
}
pub fn set_song_repeat_mode(value: SongRepeatMode) -> Result<(), Error> {
let cmd = format!(
"Application('Music').songRepeat = \"{}\"",
value.to_string()
);
let _ = ScriptController.execute(cmd.as_str(), None);
Ok(())
}
pub fn set_sound_volume(value: i8) -> Result<(), Error> {
let cmd = format!("Application('Music').soundVolume = {}", value);
let _ = ScriptController.execute(cmd.as_str(), None);
Ok(())
}
pub fn convert_track(track: &Track) -> Result<(), Error> {
let cmd = format!(
"Application('Music').convert(Application('Music').tracks.byId({}))",
track.id
);
let _ = ScriptController.execute(cmd.as_str(), None);
Ok(())
}
pub fn play() -> Result<(), Error> {
let cmd = "Application('Music').play()";
let _ = ScriptController.execute(cmd, None);
Ok(())
}
pub fn pause() -> Result<(), Error> {
let cmd = "Application('Music').pause()";
let _ = ScriptController.execute(cmd, None);
Ok(())
}
pub fn resume() -> Result<(), Error> {
let cmd = "Application('Music').resume()";
let _ = ScriptController.execute(cmd, None);
Ok(())
}
pub fn back_track() -> Result<(), Error> {
let cmd = "Application('Music').backTrack()";
let _ = ScriptController.execute(cmd, None);
Ok(())
}
pub fn fast_forward() -> Result<(), Error> {
let cmd = "Application('Music').fastForward()";
let _ = ScriptController.execute(cmd, None);
Ok(())
}
pub fn next_track() -> Result<(), Error> {
let cmd = "Application('Music').nextTrack()";
let _ = ScriptController.execute(cmd, None);
Ok(())
}
pub fn playpause() -> Result<(), Error> {
let cmd = "Application('Music').playpause()";
let _ = ScriptController.execute(cmd, None);
Ok(())
}
pub fn previous_track() -> Result<(), Error> {
let cmd = "Application('Music').previousTrack()";
let _ = ScriptController.execute(cmd, None);
Ok(())
}
pub fn rewind() -> Result<(), Error> {
let cmd = "Application('Music').rewind()";
let _ = ScriptController.execute(cmd, None);
Ok(())
}
pub fn stop() -> Result<(), Error> {
let cmd = "Application('Music').stop()";
let _ = ScriptController.execute(cmd, None);
Ok(())
}
pub fn quit() -> Result<(), Error> {
let cmd = "Application('Music').quit()";
let _ = ScriptController.execute(cmd, None);
Ok(())
}
pub fn run() -> Result<(), Error> {
let cmd = "Application('Music').run()";
let _ = ScriptController.execute(cmd, None);
Ok(())
}
}
#[derive(Display)]
#[strum(serialize_all = "lowercase")]
pub enum SongRepeatMode {
OFF,
ONE,
ALL,
}