yadm-config/.config/eww/widgets/media/media.yuck
2025-10-23 15:52:29 +02:00

104 lines
2.4 KiB
Text

(deflisten media-info :initial '{}' `~/.config/scripts/playerctl-metadata-json.sh`)
(deflisten media-status :initial 'stopped' 'playerctl status --follow')
(defpoll media-playback-info :interval '1s' :initial '0' `playerctl position`)
(defvar statusIcons '{"Playing": "player_play", "Paused": "player_pause"}')
(defvar media-close-time 0)
(defwidget icon-button [icon onclick]
(button
:onclick {onclick}
:vexpand false
(image :icon {icon})
)
)
(defwidget media-label [text ?header ?icon]
(box
:visible {strlength(text) > 1}
:space-evenly false
:spacing 10
(image :icon {icon})
(label :text {text} :xalign "0" :class {header ? "header" : ""})
)
)
(defwidget media-texts []
(box
:orientation "vertical"
:hexpand true
:valign "center"
:halign "start"
:space-evenly false
(media-label :header true :text {media-info["xesam:title"]} :icon "library-music")
(media-label :text {media-info["xesam:artist"]} :icon "user-identity")
(media-label :text {media-info["xesam:album"] ?: ""} :icon "cd")
)
)
(defwidget media-control []
(box
:visible {EWW_TIME < media-close-time}
:class "widget"
:width 512
:space-evenly false
:orientation "v"
(box
:class "data-display"
:valign "center"
:halign "start"
:space-evenly false
:spacing 20
(box
:width {512 - 128}
:space-evenly false
:orientation "vertical"
:spacing 10
(media-texts)
(box :vexpand true)
(box
:hexpand true
:vexpand false
:spacing 10
(icon-button
:icon "player_rew"
:onclick "~/.config/scripts/media.sh previous"
)
(icon-button
:icon {statusIcons[media-status] ?: "player_stop"}
:onclick "~/.config/scripts/media.sh play-pause"
)
(icon-button
:icon "player_fwd"
:onclick "~/.config/scripts/media.sh next"
)
)
)
(image
:path {media-info["mpris:artUrl"]}
:image-width 128
)
)
(progress
:height 1
:value {jq(media-playback-info, "tonumber(.)") / (jq(media-info["mpris:length"] ?: 1000, "tonumber(.)") / 1000000) * 100}
)
)
)
(defwindow media
:monitor 1
:geometry (geometry
:x "10px"
:y "50px"
:width "0px"
:height "10%"
:anchor "top right")
:stacking "fg"
(media-control)
)