import app from "ags/gtk3/app" import { Astal, Gtk, Gdk } from "ags/gtk3" import { execAsync } from "ags/process" import { createPoll } from "ags/time" export default function Media(gdkmonitor: Gdk.Monitor) { const { TOP, LEFT } = Astal.WindowAnchor // Poll playerctl for complete metadata and status in one go const mediaState = createPoll({ title: "No Media", artist: "", artUrl: "", status: "Stopped" }, 1000, "playerctl metadata -f '{{title}}|||{{artist}}|||{{mpris:artUrl}}|||{{status}}' 2>/dev/null || echo 'No Media||||||Stopped'", (stdout) => { const parts = stdout.split("|||"); const title = parts[0]?.trim() || "No Media"; const artist = parts[1]?.trim() || ""; // GTK supports raw paths better than file:// URIs in background-image CSS const rawUrl = parts[2]?.trim() || ""; const artUrl = rawUrl.replace(/^file:\/\//, ''); const status = parts[3]?.trim() || "Stopped"; return { title, artist, artUrl, status }; }); return ( s.artUrl ? `background-image: url('${s.artUrl}');` : 'background-color: alpha(@color0, 0.5);')} /> ) }