diff --git a/ags/widget/bar/Media.tsx b/ags/widget/bar/Media.tsx index 9e1cc60..caaab0b 100644 --- a/ags/widget/bar/Media.tsx +++ b/ags/widget/bar/Media.tsx @@ -1,5 +1,4 @@ -import { createBinding, createState, onCleanup, With } from "ags"; -import { execAsync } from "ags/process"; +import { Accessor, createBinding, createConnection, createState, onCleanup, With } from "ags"; import { Gtk } from "ags/gtk4"; import { Separator } from "../Separator"; import { Windows } from "../../windows"; @@ -8,7 +7,7 @@ import { Clipboard } from "../../scripts/clipboard"; import GObject from "ags/gobject"; import AstalMpris from "gi://AstalMpris"; import Pango from "gi://Pango?version=1.0"; -import { getPlayerIconFromBusName } from "../../scripts/utils"; +import { decoder, getPlayerIconFromBusName, variableToBoolean } from "../../scripts/utils"; export const dummyPlayer = AstalMpris.Player.new("colorshellDummy"); @@ -127,14 +126,10 @@ export const Media = () => { pl.available)}> {(available: boolean) => available && { - execAsync(`playerctl --player=${ - player.get().busName.replace(/^org\.mpris\.MediaPlayer2\./i, "") - } metadata xesam:url`).then(link => { - Clipboard.getDefault().copyAsync(link); - }).catch((e: Error) => { - console.error(`Media: couldn't copy media link. Stderr: \n${e.message}\n${e.stack}`); - }); + const url = getMediaUrl(player.get()).get(); + url && Clipboard.getDefault().copyAsync(url); }} /> { } + +export function getMediaUrl(player: AstalMpris.Player): Accessor { + return createConnection(player.get_meta("xesam:url"), + [player, "notify::metadata", () => player.get_meta("xesam:url")] + ).as(url => { + const byteString = url?.get_data_as_bytes(); + + return byteString ? + decoder.decode(byteString.toArray()) + : undefined; + }) +} diff --git a/ags/widget/center-window/BigMedia.tsx b/ags/widget/center-window/BigMedia.tsx index 072f5ff..5a18ea9 100644 --- a/ags/widget/center-window/BigMedia.tsx +++ b/ags/widget/center-window/BigMedia.tsx @@ -1,10 +1,9 @@ import { timeout } from "ags/time"; -import { execAsync } from "ags/process"; import { Astal, Gtk } from "ags/gtk4"; import { Clipboard } from "../../scripts/clipboard"; -import { player, setPlayer } from "../bar/Media"; +import { getMediaUrl, player, setPlayer } from "../bar/Media"; import { Accessor, createBinding, createConnection, For, With } from "ags"; -import { getPlayerIconFromBusName, pathToURI } from "../../scripts/utils"; +import { getPlayerIconFromBusName, pathToURI, variableToBoolean } from "../../scripts/utils"; import AstalMpris from "gi://AstalMpris"; import AstalIO from "gi://AstalIO"; @@ -96,14 +95,10 @@ export const BigMedia = () => { { - execAsync(`playerctl --player=${ - player.busName.replace(/^org\.mpris\.MediaPlayer2\./i, "") - } metadata xesam:url`).then(link => { - Clipboard.getDefault().copyAsync(link); - }).catch((e: Error) => { - console.error(`Media: couldn't copy media link. Stderr: \n${e.message}\n${e.stack}`); - }); + const url = getMediaUrl(player).get(); + url && Clipboard.getDefault().copyAsync(url); }} /> @@ -185,10 +180,10 @@ export function PlayerSelectButton({ player, reveal, halign = Gtk.Align.CENTER, {(pl: AstalMpris.Player) => setPlayer(pl)}> - -