aboutsummaryrefslogtreecommitdiff
path: root/.config/awesome/services/mpris/init.lua
diff options
context:
space:
mode:
Diffstat (limited to '.config/awesome/services/mpris/init.lua')
-rw-r--r--.config/awesome/services/mpris/init.lua100
1 files changed, 100 insertions, 0 deletions
diff --git a/.config/awesome/services/mpris/init.lua b/.config/awesome/services/mpris/init.lua
new file mode 100644
index 0000000..3659a3a
--- /dev/null
+++ b/.config/awesome/services/mpris/init.lua
@@ -0,0 +1,100 @@
+local gobject = require "gears.object"
+local playerctl = require "services.mpris.playerctl"
+local qpersistent = require "quarrel.persistent"
+
+---@class ServiceMpris : gears.object
+---@field inner Playerctl
+---@field index number the index of the currently active player
+local M = {}
+
+---@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)
+end
+
+---@param diff_player Playerctl.data
+local function recalculate_active_player(diff_player, vanished)
+ if type(diff_player) ~= "table" then
+ return
+ end
+ -- if #layout.children == 0 then
+ -- M.active_player_index = 1
+ -- update_player()
+ -- return
+ -- 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
+
+ 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
+
+ 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
+end
+
+function M:next_player()
+ local players = self.inner:list()
+
+ if #players == 0 then
+ return
+ elseif self.index + 1 > #players then
+ self.index = 1
+ else
+ self.index = self.index + 1
+ end
+
+ -- 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)
+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
+ end
+
+ local player = players[self.index]
+ self:emit_signal("player::metadata", player)
+ self:emit_signal("player::position", player)
+end
+
+M.inner = playerctl.new {
+ players = {},
+ metadata = {
+ album = "xesam:album",
+ title = "xesam:title",
+ artist = "xesam:artist",
+ art = "mpris:artUrl",
+ },
+}
+
+local instance = gobject { class = M }
+instance:connect_signal("property::index", function(self, index)
+ qpersistent.store("active_player_index", self.index)
+end)
+return instance