From ba5694271dacfdd2f868b8de303c1be404a10bb0 Mon Sep 17 00:00:00 2001 From: retrozinndev Date: Tue, 29 Jul 2025 14:18:58 -0300 Subject: [PATCH] :boom: fix(media, big-media): only show button to copy media link if it's provided by the player makes use of a connection to notify::metadata to get when the link is updated, instead of binding directly to AstalMpris.Player::metadata and getting the 'xesam:url' property, since JS does not support the hashmap thing --- ags/widget/bar/Media.tsx | 27 +++++++++++++++++---------- ags/widget/center-window/BigMedia.tsx | 19 +++++++------------ 2 files changed, 24 insertions(+), 22 deletions(-) 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)}> - -