diff options
Diffstat (limited to '.config/awesome/services/mpris/init.lua')
| -rw-r--r-- | .config/awesome/services/mpris/init.lua | 178 |
1 files changed, 105 insertions, 73 deletions
diff --git a/.config/awesome/services/mpris/init.lua b/.config/awesome/services/mpris/init.lua index 3659a3a..1c907e7 100644 --- a/.config/awesome/services/mpris/init.lua +++ b/.config/awesome/services/mpris/init.lua @@ -1,100 +1,132 @@ 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 inner Playerctl ---@field index number the index of the currently active player -local M = {} +---@field manager lgi.Playerctl.PlayerManager +local M = { object = {} } ----@param self ServiceMpris ----@param player Playerctl.data -local function update_player(self, player) - self:emit_signal("player::metadata", player) - self:emit_signal("player::position", player) - -- handle_position(nil, player) +---@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 diff_player Playerctl.data -local function recalculate_active_player(diff_player, vanished) - if type(diff_player) ~= "table" then - return +---@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 - -- if #layout.children == 0 then - -- M.active_player_index = 1 - -- update_player() - -- return - -- end +end - local active_player = players[M.active_player_index] - if not active_player then -- we're recovering from a state with no players - update_player(diff_player) - return - end +---@param self WrappedPlayer +---@param value boolean +function M.object:set_shuffle(value) + self.inner:set_shuffle(value) +end - if diff_player.instance == active_player.instance and vanished then -- active player vanished; fall back to previous player - M.previous_player() - else -- non-active player appeared/vanished; try to find active player - for i, p in ipairs(playerctl:list()) do - if p.instance == active_player.instance then - M.active_player_index = i - update_player(p) - return - end - end +---@param self WrappedPlayer +---@param value number +function M.object:set_volume(value) + self.inner:set_volume(value) +end - gdebug.print_warning( - "failed to find active player:\n " .. gdebug.dump_return(active_player, nil, 2):gsub("\n", "\n ") - ) - M.active_player_index = 1 - update_player(playerctl:list()[M.active_player_index]) - 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 -function M:next_player() - local players = self.inner:list() +---@param self WrappedPlayer +function M.object:stop() + self.inner:stop() +end - if #players == 0 then - return - elseif self.index + 1 > #players then - self.index = 1 +---@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 - self.index = self.index + 1 + return 0 end +end + +local function manage_player(self, full_name) + local player = playerctl.Player.new_from_name(full_name) - -- update_player(playerctl:list()[M.active_player_index]) - local player = players[self.index] - self:emit_signal("player::metadata", player) - self:emit_signal("player::position", player) + function player.on_metadata(p, metadata) + + end end -function M:previous_player() - local players = self.inner:list() - if #players == 0 then - return - elseif self.index - 1 < #players then - self.index = #players - else - self.index = self.index - 1 +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) - local player = players[self.index] - self:emit_signal("player::metadata", player) - self:emit_signal("player::position", player) + return self end -M.inner = playerctl.new { - players = {}, - metadata = { - album = "xesam:album", - title = "xesam:title", - artist = "xesam:artist", - art = "mpris:artUrl", - }, -} +local instance = new() -local instance = gobject { class = M } -instance:connect_signal("property::index", function(self, index) - qpersistent.store("active_player_index", self.index) -end) return instance |
