💥 fix: media copy link button not copying link

there are some issues with astalmpris.player.metadata, so I started using playerctl cli instead
This commit is contained in:
retrozinndev
2025-06-18 21:52:41 -03:00
parent ac65bba024
commit eeb775d203
2 changed files with 21 additions and 8 deletions
+11 -4
View File
@@ -1,9 +1,10 @@
import { bind } from "astal"; import { bind, exec } from "astal";
import { Gtk, Widget } from "astal/gtk3"; import { Gtk, Widget } from "astal/gtk3";
import AstalMpris from "gi://AstalMpris"; import AstalMpris from "gi://AstalMpris";
import { getSymbolicIcon } from "../../scripts/apps"; import { getSymbolicIcon } from "../../scripts/apps";
import { Separator, SeparatorProps } from "../Separator"; import { Separator, SeparatorProps } from "../Separator";
import { Windows } from "../../windows"; import { Windows } from "../../windows";
import { Clipboard } from "../../scripts/clipboard";
export function Media(): Gtk.Widget { export function Media(): Gtk.Widget {
const connections: Array<number> = []; const connections: Array<number> = [];
@@ -24,9 +25,15 @@ export function Media(): Gtk.Widget {
icon: "edit-paste-symbolic" icon: "edit-paste-symbolic"
} as Widget.IconProps), } as Widget.IconProps),
tooltipText: "Copy link to Clipboard", tooltipText: "Copy link to Clipboard",
visible: bind(players[0], "metadata").as((metadata) => // AstalMpris.Player.metadata works only sometimes, so I'm not using it
metadata["xesam:url"]?.get_string()[0] != null), visible: bind(players[0], "metadata").as(Boolean),
onClick: () => console.log(players[0].metadata["xesam:url"]?.get_string()[0]!) onClick: async () => {
const link = exec(`playerctl --player=${
players[0].busName.replace(/^org\.mpris\.MediaPlayer2\./i, "")
} metadata xesam:url`);
link && Clipboard.getDefault().copyAsync(link);
}
} as Widget.ButtonProps), } as Widget.ButtonProps),
new Widget.Button({ new Widget.Button({
className: "previous", className: "previous",
+10 -4
View File
@@ -1,6 +1,7 @@
import { AstalIO, bind, Binding, execAsync, GLib, timeout } from "astal"; import { AstalIO, bind, Binding, exec, timeout } from "astal";
import { Gtk, Widget } from "astal/gtk3"; import { Gtk, Widget } from "astal/gtk3";
import AstalMpris from "gi://AstalMpris"; import AstalMpris from "gi://AstalMpris";
import { Clipboard } from "../../scripts/clipboard";
export function BigMedia(): Gtk.Widget { export function BigMedia(): Gtk.Widget {
@@ -101,9 +102,14 @@ export function BigMedia(): Gtk.Widget {
icon: "edit-paste-symbolic" icon: "edit-paste-symbolic"
} as Widget.IconProps), } as Widget.IconProps),
tooltipText: "Copy link to Clipboard", tooltipText: "Copy link to Clipboard",
visible: bind(players[0], "metadata").as((_meta: GLib.HashTable) => visible: bind(players[0], "metadata").as(Boolean),
players[0].get_meta("xesam:url") === null), onClick: async () => {
onClick: () => execAsync(`sh -c "wl-copy \\"$(playerctl metadata 'xesam:url')\\""`) const link = exec(`playerctl --player=${
players[0].busName.replace(/^org\.mpris\.MediaPlayer2\./i, "")
} metadata xesam:url`);
link && Clipboard.getDefault().copyAsync(link);
}
} as Widget.ButtonProps), } as Widget.ButtonProps),
new Widget.Button({ new Widget.Button({
className: "shuffle", className: "shuffle",