local gobject = require "gears.object" local playerctl = require "services.mpris.playerctl" local qpersistent = require "quarrel.persistent" local playerctl = require("lgi").Playerctl ---@class ServiceMpris : gears.object ---@field index number the index of the currently active player ---@field manager lgi.Playerctl.PlayerManager local M = { object = {} } ---@class WrappedPlayer : gears.object ---@field inner lgi.Playerctl.Player ---@field _position_timer gears.timer ---@param self WrappedPlayer function M.object:_update_position(by_user) self:emit_signal("property::position", by_user) end ---@param self WrappedPlayer function M.object:_update_position_timer() if self.inner.playback_status == "PLAYING" then self._position_timer:again() else self._position_timer:stop() end end ---@param self WrappedPlayer ---@param value boolean function M.object:set_shuffle(value) self.inner:set_shuffle(value) end ---@param self WrappedPlayer ---@param value number function M.object:set_volume(value) self.inner:set_volume(value) end ---@param self WrappedPlayer ---@param value integer function M.object:set_position(value) self.inner:set_position(value) end ---@param self WrappedPlayer ---@param value lgi.Playerctl.LoopStatus function M.object:set_loop_status(value) self.inner:set_loop_status(value) end ---@param self WrappedPlayer function M.object:play_pause() self.inner:play_pause() end ---@param self WrappedPlayer function M.object:play() self.inner:play() end ---@param self WrappedPlayer function M.object:pause() self.inner:pause() end ---@param self WrappedPlayer function M.object:stop() self.inner:stop() end ---@param self WrappedPlayer function M.object:previous() self.inner:previous() end ---@param self WrappedPlayer function M.object:next() self.inner:next() end ---@param self Playerctl ---@param player_a lgi.Playerctl.Player ---@param player_b lgi.Playerctl.Player ---@return sign local function compare_players(self, player_a, player_b) if player_a.player_name < player_b.player_name then return -1 elseif player_a.player_name > player_b.player_name then return 1 else return 0 end end local function manage_player(self, full_name) local player = playerctl.Player.new_from_name(full_name) function player.on_metadata(p, metadata) end end local function init_manager(self) self.manager = playerctl.PlayerManager() self.manager:set_sort_func(function(a, b) local player_a = playerctl.Player(a) local player_b = playerctl.Player(b) return compare_players(self, player_a, player_b) end) function self.manager.on_name_appeared(_, full_name) end function self.manager.on_player_appeared() end end local function new() local self = gobject {} init_manager(self) return self end local instance = new() return instance