diff options
Diffstat (limited to 'mpris/src')
-rw-r--r-- | mpris/src/cli.vala | 331 | ||||
-rw-r--r-- | mpris/src/config.vala.in | 6 | ||||
-rw-r--r-- | mpris/src/ifaces.vala | 60 | ||||
-rw-r--r-- | mpris/src/meson.build | 77 | ||||
-rw-r--r-- | mpris/src/mpris.vala | 66 | ||||
-rw-r--r-- | mpris/src/player.vala | 467 |
6 files changed, 0 insertions, 1007 deletions
diff --git a/mpris/src/cli.vala b/mpris/src/cli.vala deleted file mode 100644 index b71def9..0000000 --- a/mpris/src/cli.vala +++ /dev/null @@ -1,331 +0,0 @@ -namespace AstalMpris { -static bool help; -static bool version; -static bool list; -static bool raw; -[CCode (array_length = false, array_null_terminated = true)] -static string[] players; - -const OptionEntry[] options = { - { "version", 'v', OptionFlags.NONE, OptionArg.NONE, ref version, null, null }, - { "help", 'h', OptionFlags.NONE, OptionArg.NONE, ref help, null, null }, - { "player", 'p', OptionFlags.NONE, OptionArg.STRING_ARRAY, ref players, null, null }, - { "list", 'l', OptionFlags.NONE, OptionArg.NONE, ref list, null, null }, - { "raw", 'r', OptionFlags.NONE, OptionArg.NONE, ref raw, null, null }, - { null }, -}; - -int main(string[] argv) { - try { - var opts = new OptionContext(); - opts.add_main_entries(options, null); - opts.set_help_enabled(false); - opts.set_ignore_unknown_options(false); - opts.parse(ref argv); - } catch (OptionError err) { - printerr(err.message); - return 1; - } - - if (help) { - print("Usage:\n"); - print(" %s [flags] [command]\n\n", argv[0]); - print("Flags:\n"); - print(" -h, --help Print this help and exit\n"); - print(" -v, --version Print version number and exit\n"); - print(" -l, --list List available players\n"); - print(" -p, --player Operate on given player\n"); - print(" -r, --raw Print single line json info\n"); - print("\nCommands:\n"); - print(" info Print info about player\n"); - print(" monitor Monitor changes\n"); - print(" play Play track\n"); - print(" pause Pause track\n"); - print(" play-pause Play if paused, Pause if playing\n"); - print(" stop Stop player\n"); - print(" next Play next track\n"); - print(" previous Play previous track\n"); - print(" quit Quit player\n"); - print(" raise Ask compositor to raise the player\n"); - print(" position [OFFSET][+/-/%] Set position of player\n"); - print(" volume [LEVEL][+/-/%] Set volume of player\n"); - print(" loop [STATUS] One of: \"None\", \"Track\", \"Playlist\"\n"); - print(" shuffle [STATUS] One of: \"On\", \"Off\", \"Toggle\"\n"); - return 0; - } - - if (version) { - print(VERSION); - return 0; - } - - var mpris = new Mpris(); - var mpris_players = new List<Player>(); - - if (list) { - foreach (var p in mpris.players) - print("%s\n", p.bus_name.replace(Mpris.PREFIX, "")); - - return 0; - } - - if (players.length > 0) { - foreach (var name in players) - mpris_players.append(new Player(name)); - } else { - foreach (var p in mpris.players) - mpris_players.append(p); - } - - var cmd = argv[1]; - var arg = argv[2]; - - switch (cmd) { - case "monitor": - return do_monitor(mpris); - - case "info": - print_players(mpris_players.copy()); - break; - - case "play": - foreach (var player in mpris_players) - player.play(); - break; - - case "pause": - foreach (var player in mpris_players) - player.pause(); - break; - - case "play-pause": - foreach (var player in mpris_players) - player.play_pause(); - break; - - case "stop": - foreach (var player in mpris_players) - player.stop(); - break; - - case "next": - foreach (var player in mpris_players) - player.next(); - break; - - case "previous": - foreach (var player in mpris_players) - player.previous(); - break; - - case "raise": - foreach (var player in mpris_players) - player.raise(); - break; - - case "quit": - foreach (var player in mpris_players) - player.quit(); - break; - - case "position": - foreach (var player in mpris_players) { - if (do_position(player, arg) != 0) - return 1; - } - break; - - case "volume": - foreach (var player in mpris_players) { - if (do_volume(player, arg) != 0) - return 1; - } - break; - - case "loop": - foreach (var player in mpris_players) { - if (do_loop(player, arg) != 0) - return 1; - } - break; - - case "shuffle": - foreach (var player in mpris_players) { - if (do_shuffle(player, arg) != 0) - return 1; - } - break; - - case "open": - if (arg == null) { - stderr.printf("missing open arg"); - return 1; - } - - foreach (var player in mpris_players) - player.open_uri(arg); - break; - - default: - if (cmd == null) - stderr.printf("missing command\n"); - else - stderr.printf(@"unknown command \"$cmd\"\n"); - return 1; - } - - return 0; -} - -Json.Node to_json(Player p) { - var uris = new Json.Builder().begin_array(); - foreach (var uri in p.supported_uri_schemas) - uris.add_string_value(uri); - - uris.end_array(); - - return new Json.Builder().begin_object() - .set_member_name("bus_name").add_string_value(p.bus_name) - .set_member_name("available").add_boolean_value(p.available) - .set_member_name("identity").add_string_value(p.identity) - .set_member_name("entry").add_string_value(p.entry) - .set_member_name("supported_uri_schemas").add_value(uris.get_root()) - .set_member_name("loop_status").add_string_value(p.loop_status.to_string()) - .set_member_name("shuffle_status").add_string_value(p.shuffle_status.to_string()) - .set_member_name("rate").add_double_value(p.rate) - .set_member_name("volume").add_double_value(p.volume) - .set_member_name("position").add_double_value(p.position) - .set_member_name("cover_art").add_string_value(p.cover_art) - .set_member_name("metadata").add_value(Json.gvariant_serialize( - p.metadata != null ? p.metadata : new HashTable<string, Variant>(str_hash, str_equal))) - .end_object() - .get_root(); -} - -void print_players(List<weak Player> players) { - var json = new Json.Builder().begin_array(); - - foreach (var p in players) - json.add_value(to_json(p)); - - stdout.printf("%s\n", Json.to_string(json.end_array().get_root(), !raw)); - stdout.flush(); -} - -int do_monitor(Mpris mpris) { - print_players(mpris.players); - foreach (var player in mpris.players) { - player.notify.connect(() => print_players(mpris.players)); - } - - mpris.player_added.connect((player) => { - player.notify.connect(() => print_players(mpris.players)); - }); - - mpris.player_closed.connect(() => { - print_players(mpris.players); - }); - - new MainLoop(null, false).run(); - return 0; -} - -int do_position(Player player, string? arg) { - if (arg == null) { - stderr.printf("missing position argument\n"); - return 1; - } - - else if (arg.has_suffix("%")) { - var percent = double.parse(arg.slice(0, -1)) / 100; - player.position = player.length * percent; - } - - else if (arg.has_suffix("-")) { - player.position += double.parse(arg.slice(0, -1)) * -1; - } - - else if (arg.has_suffix("+")) { - player.position += double.parse(arg.slice(0, -1)); - } - - else { - player.position = double.parse(arg); - } - - return 0; -} - -int do_volume(Player player, string? arg) { - if (arg == null) { - stderr.printf("missing volume argument\n"); - return 1; - } - - else if (arg.has_suffix("%")) { - player.volume = double.parse(arg.slice(0, -1)) / 100; - } - - else if (arg.has_suffix("-")) { - player.volume += (double.parse(arg.slice(0, -1)) * -1) / 100; - } - - else if (arg.has_suffix("+")) { - player.volume += double.parse(arg.slice(0, -1)) / 100; - } - - else { - player.volume = double.parse(arg); - } - - return 0; -} - -int do_loop(Player player, string? arg) { - if (arg == null) { - player.loop(); - return 0; - } - - switch (arg) { - case "None": - player.loop_status = Loop.NONE; - break; - case "Track": - player.loop_status = Loop.TRACK; - break; - case "Playlist": - player.loop_status = Loop.PLAYLIST; - break; - default: - stderr.printf(@"unknown shuffle status \"$arg\""); - return 1; - } - - return 0; -} - -int do_shuffle(Player player, string? arg) { - if (arg == null) { - player.shuffle(); - return 1; - } - - switch (arg) { - case "On": - player.shuffle_status = Shuffle.ON; - break; - case "Off": - player.shuffle_status = Shuffle.OFF; - break; - case "Toggle": - player.shuffle(); - break; - default: - stderr.printf(@"unknown shuffle status \"$arg\""); - return 1; - } - - return 0; -} -} diff --git a/mpris/src/config.vala.in b/mpris/src/config.vala.in deleted file mode 100644 index 767c4bd..0000000 --- a/mpris/src/config.vala.in +++ /dev/null @@ -1,6 +0,0 @@ -namespace AstalMpris { - public const int MAJOR_VERSION = @MAJOR_VERSION@; - public const int MINOR_VERSION = @MINOR_VERSION@; - public const int MICRO_VERSION = @MICRO_VERSION@; - public const string VERSION = "@VERSION@"; -} diff --git a/mpris/src/ifaces.vala b/mpris/src/ifaces.vala deleted file mode 100644 index 4a9d715..0000000 --- a/mpris/src/ifaces.vala +++ /dev/null @@ -1,60 +0,0 @@ -namespace AstalMpris { -[DBus (name="org.freedesktop.DBus")] -internal interface DBusImpl : DBusProxy { - public abstract string[] list_names () throws GLib.Error; - public signal void name_owner_changed (string name, string old_owner, string new_owner); -} - -[DBus (name="org.freedesktop.DBus.Properties")] -internal interface PropsIface : DBusProxy { - public abstract HashTable<string, Variant> get_all (string iface); -} - -[DBus (name="org.mpris.MediaPlayer2")] -internal interface IMpris : PropsIface { - public abstract void raise () throws GLib.Error; - public abstract void quit () throws GLib.Error; - - public abstract bool can_quit { get; } - public abstract bool fullscreen { get; set; } - public abstract bool can_set_fullscreen { get; } - public abstract bool can_raise { get; } - public abstract bool has_track_list { get; } - public abstract string identity { owned get; } - public abstract string desktop_entry { owned get; } - public abstract string[] supported_uri_schemas { owned get; } - public abstract string[] supported_mime_types { owned get; } -} - -[DBus (name="org.mpris.MediaPlayer2.Player")] -internal interface IPlayer : IMpris { - public abstract void next () throws GLib.Error; - public abstract void previous () throws GLib.Error; - public abstract void pause () throws GLib.Error; - public abstract void play_pause () throws GLib.Error; - public abstract void stop () throws GLib.Error; - public abstract void play () throws GLib.Error; - public abstract void seek (int64 offset) throws GLib.Error; - public abstract void set_position (ObjectPath track_id, int64 position) throws GLib.Error; - public abstract void open_uri (string uri) throws GLib.Error; - - public signal void seeked (int64 position); - - public abstract string playback_status { owned get; } - public abstract string loop_status { owned get; set; } - public abstract double rate { get; set; } - public abstract bool shuffle { get; set; } - public abstract HashTable<string,Variant> metadata { owned get; } - public abstract double volume { get; set; } - public abstract int64 position { get; } - public abstract double minimum_rate { get; set; } - public abstract double maximum_rate { get; set; } - - public abstract bool can_go_next { get; } - public abstract bool can_go_previous { get; } - public abstract bool can_play { get; } - public abstract bool can_pause { get; } - public abstract bool can_seek { get; } - public abstract bool can_control { get; } -} -} diff --git a/mpris/src/meson.build b/mpris/src/meson.build deleted file mode 100644 index 9b3c51f..0000000 --- a/mpris/src/meson.build +++ /dev/null @@ -1,77 +0,0 @@ -version_split = meson.project_version().split('.') -api_version = version_split[0] + '.' + version_split[1] -gir = 'AstalMpris-' + api_version + '.gir' -typelib = 'AstalMpris-' + api_version + '.typelib' -so = 'lib' + meson.project_name() + '.so.' + meson.project_version() - -config = configure_file( - input: 'config.vala.in', - output: 'config.vala', - configuration: { - 'VERSION': meson.project_version(), - 'MAJOR_VERSION': version_split[0], - 'MINOR_VERSION': version_split[1], - 'MICRO_VERSION': version_split[2], - }, -) - -deps = [ - dependency('glib-2.0'), - dependency('gobject-2.0'), - dependency('json-glib-1.0'), -] - -sources = [ - config, - 'ifaces.vala', - 'player.vala', - 'mpris.vala', -] - -if get_option('lib') - lib = library( - meson.project_name(), - sources, - dependencies: deps, - vala_header: meson.project_name() + '.h', - vala_vapi: meson.project_name() + '-' + api_version + '.vapi', - vala_gir: gir, - version: meson.project_version(), - install: true, - install_dir: [true, true, true, true], - ) - - import('pkgconfig').generate( - lib, - name: meson.project_name(), - filebase: meson.project_name() + '-' + api_version, - version: meson.project_version(), - subdirs: meson.project_name(), - requires: deps, - install_dir: get_option('libdir') / 'pkgconfig', - ) - - custom_target( - typelib, - command: [ - find_program('g-ir-compiler'), - '--output', '@OUTPUT@', - '--shared-library', get_option('prefix') / get_option('libdir') / '@PLAINNAME@', - meson.current_build_dir() / gir, - ], - input: lib, - output: typelib, - depends: lib, - install: true, - install_dir: get_option('libdir') / 'girepository-1.0', - ) -endif - -if get_option('cli') - executable( - meson.project_name(), - ['cli.vala', sources], - dependencies: deps, - install: true, - ) -endif diff --git a/mpris/src/mpris.vala b/mpris/src/mpris.vala deleted file mode 100644 index 0e55a2e..0000000 --- a/mpris/src/mpris.vala +++ /dev/null @@ -1,66 +0,0 @@ -namespace AstalMpris { -public Mpris get_default() { - return Mpris.get_default(); -} - -public class Mpris : Object { - internal static string PREFIX = "org.mpris.MediaPlayer2."; - - private static Mpris instance; - public static Mpris get_default() { - if (instance == null) - instance = new Mpris(); - - return instance; - } - - private DBusImpl proxy; - - private HashTable<string, Player> _players = - new HashTable<string, Player> (str_hash, str_equal); - - public List<weak Player> players { owned get { return _players.get_values(); } } - - public signal void player_added (Player player); - public signal void player_closed (Player player); - - construct { - try { - proxy = Bus.get_proxy_sync( - BusType.SESSION, - "org.freedesktop.DBus", - "/org/freedesktop/DBus" - ); - - foreach (var busname in proxy.list_names()) { - if (busname.has_prefix(Mpris.PREFIX)) - add_player(busname); - } - - proxy.name_owner_changed.connect((name, old_owner, new_owner) => { - if (!name.has_prefix(Mpris.PREFIX)) - return; - - if (new_owner != "" && old_owner == "") - add_player(name); - }); - } catch (Error error) { - critical(error.message); - } - } - - private void add_player(string busname) { - var p = new Player(busname); - _players.set(busname, p); - - p.closed.connect(() => { - player_closed(p); - _players.remove(busname); - notify_property("players"); - }); - - player_added(p); - notify_property("players"); - } -} -} diff --git a/mpris/src/player.vala b/mpris/src/player.vala deleted file mode 100644 index ed146f6..0000000 --- a/mpris/src/player.vala +++ /dev/null @@ -1,467 +0,0 @@ -namespace AstalMpris { -public class Player : Object { - private static string COVER_CACHE = Environment.get_user_cache_dir() + "/astal/mpris"; - - private IPlayer proxy; - - public signal void appeared () { available = true; } - public signal void closed () { available = false; } - - // identifiers - public string bus_name { owned get; construct set; } - public bool available { get; private set; } - - // periodically notify position - private uint pollid; - - // mpris - public void raise() { - try { proxy.raise(); } catch (Error error) { critical(error.message); } - } - - public void quit() { - try { proxy.quit(); } catch (Error error) { critical(error.message); } - } - - public bool can_quit { get; private set; } - public bool fullscreen { get; private set; } - public bool can_set_fullscreen { get; private set; } - public bool can_raise { get; private set; } - public bool has_track_list { get; private set; } - public string identity { owned get; private set; } - public string entry { owned get; private set; } - public string[] supported_uri_schemas { owned get; private set; } - public string[] supported_mime_types { owned get; private set; } - - public void toggle_fullscreen() { - if (!can_set_fullscreen) - critical("can not set fullscreen on " + bus_name); - - proxy.fullscreen = !fullscreen; - } - - // player - public void next() { - try { proxy.next(); } catch (Error error) { critical(error.message); } - } - - public void previous() { - try { proxy.previous(); } catch (Error error) { critical(error.message); } - } - - public void pause() { - try { proxy.pause(); } catch (Error error) { critical(error.message); } - } - - public void play_pause() { - try { proxy.play_pause(); } catch (Error error) { critical(error.message); } - } - - public void stop() { - try { proxy.stop(); } catch (Error error) { critical(error.message); } - } - - public void play() { - try { proxy.play(); } catch (Error error) { critical(error.message); } - } - - public void open_uri(string uri) { - try { proxy.open_uri(uri); } catch (Error error) { critical(error.message); } - } - - public void loop() { - switch (loop_status) { - case Loop.NONE: - loop_status = Loop.TRACK; - break; - case Loop.TRACK: - loop_status = Loop.PLAYLIST; - break; - case Loop.PLAYLIST: - loop_status = Loop.NONE; - break; - default: - break; - } - } - - public void shuffle() { - shuffle_status = shuffle_status == Shuffle.ON - ? Shuffle.OFF - : Shuffle.ON; - } - - public signal void seeked (int64 position); - - public double _get_position() { - try { - var reply = proxy.call_sync( - "org.freedesktop.DBus.Properties.Get", - new Variant("(ss)", - "org.mpris.MediaPlayer2.Player", - "Position" - ), - DBusCallFlags.NONE, - -1, - null - ); - - var body = reply.get_child_value(0); - if (body.classify() == Variant.Class.STRING) { - return -1; // Position not supported - } - - return (double)body.get_variant().get_int64() / 1000000; - } catch (Error err) { - return -1; - } - } - - private void _set_position(double pos) { - try { - proxy.set_position((ObjectPath)trackid, (int64)(pos * 1000000)); - } catch (Error error) { - critical(error.message); - } - } - - private Loop _loop_status = Loop.UNSUPPORTED; - private double _rate; - private Shuffle _shuffle_status = Shuffle.UNSUPPORTED; - private double _volume = -1; - - public Loop loop_status { - get { return _loop_status; } - set { proxy.loop_status = value.to_string(); } - } - - public double rate { - get { return _rate; } - set { proxy.rate = value; } - } - - public Shuffle shuffle_status { - get { return _shuffle_status; } - set { proxy.shuffle = value == Shuffle.ON; } - } - - public double volume { - get { return _volume; } - set { proxy.volume = value; } - } - - public double position { - get { return _get_position(); } - set { _set_position(value); } - } - - public PlaybackStatus playback_status { get; private set; } - public double minimum_rate { get; private set; } - public double maximum_rate { get; private set; } - public bool can_go_next { get; private set; } - public bool can_go_previous { get; private set; } - public bool can_play { get; private set; } - public bool can_pause { get; private set; } - public bool can_seek { get; private set; } - public bool can_control { get; private set; } - - // metadata - [CCode (notify = false)] - public HashTable<string,Variant> metadata { owned get; private set; } - - public string trackid { owned get; private set; } - public double length { get; private set; } - public string art_url { owned get; private set; } - - public string album { owned get; private set; } - public string album_artist { owned get; private set; } - public string artist { owned get; private set; } - public string lyrics { owned get; private set; } - public string title { owned get; private set; } - public string composer { owned get; private set; } - public string comments { owned get; private set; } - - // cached cover art - public string cover_art { owned get; private set; } - - public Player(string name) { - Object(bus_name: name.has_prefix("org.mpris.MediaPlayer2.") - ? name : "org.mpris.MediaPlayer2." + name); - } - - private void sync() { - // mpris - can_quit = proxy.can_quit; - fullscreen = proxy.fullscreen; - can_set_fullscreen = proxy.can_set_fullscreen; - can_raise = proxy.can_raise; - has_track_list = proxy.has_track_list; - identity = proxy.identity; - entry = proxy.desktop_entry; - supported_uri_schemas = proxy.supported_uri_schemas; - supported_mime_types = proxy.supported_mime_types; - - if (position >= 0) - notify_property("position"); - - // LoopStatus and Shuffle are optional props - var props = proxy.get_all("org.mpris.MediaPlayer2.Player"); - - // player - if (props != null && props.get("LoopStatus") != null) { - if (loop_status != Loop.from_string(proxy.loop_status)) { - _loop_status = Loop.from_string(proxy.loop_status); - notify_property("loop-status"); - } - } - - if (rate != proxy.rate) { - _rate = proxy.rate; - notify_property("rate"); - } - - if (props != null && props.get("Shuffle") != null) { - if (shuffle_status != Shuffle.from_bool(proxy.shuffle)) { - _shuffle_status = Shuffle.from_bool(proxy.shuffle); - notify_property("shuffle-status"); - } - } - - if (volume != proxy.volume) { - _volume = proxy.volume; - notify_property("volume"); - } - - playback_status = PlaybackStatus.from_string(proxy.playback_status); - minimum_rate = proxy.minimum_rate; - maximum_rate = proxy.maximum_rate; - can_go_next = proxy.can_go_next; - can_go_previous = proxy.can_go_previous; - can_play = proxy.can_play; - can_pause = proxy.can_pause; - can_seek = proxy.can_seek; - can_control = proxy.can_control; - - // metadata - metadata = proxy.metadata; - if (metadata != null) { - if (metadata.get("mpris:length") != null) - length = (double)metadata.get("mpris:length").get_uint64() / 1000000; - else - length = -1; - - trackid = get_str("mpris:trackid"); - art_url = get_str("mpris:artUrl"); - album = get_str("xesam:album"); - lyrics = get_str("xesam:asText"); - title = get_str("xesam:title"); - album_artist = join_strv("xesam:albumArtist", ", "); - artist = join_strv("xesam:artist", ", "); - comments = join_strv("xesam:comments", "\n"); - composer = join_strv("xesam:composer", ", "); - cache_cover.begin((_, res) => cache_cover.end(res)); - notify_property("metadata"); - } - } - - private async void cache_cover() { - if (art_url == null || art_url == "") - return; - - var file = File.new_for_uri(art_url); - if (file.get_path() != null) { - cover_art = file.get_path(); - return; - } - - var path = COVER_CACHE + "/" + Checksum.compute_for_string(ChecksumType.SHA1, art_url, -1); - if (FileUtils.test(path, FileTest.EXISTS)) { - cover_art = path; - return; - } - - try { - if (!FileUtils.test(COVER_CACHE, FileTest.IS_DIR)) - File.new_for_path(COVER_CACHE).make_directory_with_parents(null); - - file.copy_async.begin( - File.new_for_path(path), - FileCopyFlags.OVERWRITE, - Priority.DEFAULT, - null, - null, - (_, res) => { - try { - file.copy_async.end(res); - cover_art = path; - } catch (Error err) { - critical("Failed to cache cover art with url \"%s\": %s", art_url, err.message); - } - } - ); - } catch (Error err) { - critical(err.message); - } - } - - public Variant? get_meta(string key) { - return metadata.lookup(key); - } - - private string get_str(string key) { - if (metadata.get(key) == null) - return ""; - - var str = metadata.get(key).get_string(null); - return str == null ? "" : str; - } - - private string? join_strv(string key, string sep) { - if (metadata.get(key) == null) - return null; - - var arr = metadata.get(key).get_strv(); - if (arr.length == 0) - return null; - - var builder = new StringBuilder(); - for (var i = 0; i < arr.length; ++i) { - builder.append(arr[i]); - if (i + 1 < arr.length) - builder.append(sep); - } - - return builder.str; - } - - construct { - try { - try_proxy(); - sync(); - } catch (Error error) { - critical(error.message); - } - } - - public void try_proxy() throws Error { - if (proxy != null) - return; - - proxy = Bus.get_proxy_sync( - BusType.SESSION, - bus_name, - "/org/mpris/MediaPlayer2" - ); - - if (proxy.g_name_owner != null) - appeared(); - - proxy.notify["g-name-owner"].connect(() => { - if (proxy.g_name_owner != null) - appeared(); - else - closed(); - }); - - proxy.g_properties_changed.connect(sync); - - pollid = Timeout.add_seconds(1, () => { - if (!available) - return Source.CONTINUE; - - if (position >= 0) { - notify_property("position"); - } - return Source.CONTINUE; - }, Priority.DEFAULT); - } - - ~Player() { - Source.remove(pollid); - } -} - -public enum PlaybackStatus { - PLAYING, - PAUSED, - STOPPED; - - public static PlaybackStatus from_string(string? str) { - switch (str) { - case "Playing": - return PLAYING; - case "Paused": - return PAUSED; - case "Stopped": - default: - return STOPPED; - } - } - - public string to_string() { - switch (this) { - case PLAYING: - return "Playing"; - case PAUSED: - return "Paused"; - case STOPPED: - default: - return "Stopped"; - } - } -} - -public enum Loop { - UNSUPPORTED, - NONE, - TRACK, - PLAYLIST; - - public static Loop from_string(string? str) { - switch (str) { - case "None": - return NONE; - case "Track": - return TRACK; - case "Playlist": - return PLAYLIST; - default: - return UNSUPPORTED; - } - } - - public string? to_string() { - switch (this) { - case NONE: - return "None"; - case TRACK: - return "Track"; - case PLAYLIST: - return "Playlist"; - default: - return "Unsupported"; - } - } -} - -public enum Shuffle { - UNSUPPORTED, - ON, - OFF; - - public static Shuffle from_bool(bool b) { - return b ? Shuffle.ON : Shuffle.OFF; - } - - public string? to_string() { - switch (this) { - case OFF: - return "Off"; - case ON: - return "On"; - default: - return "Unsupported"; - } - } -} -} |