From a236370d47790fbb4ffb2829ea501bade250ca5c Mon Sep 17 00:00:00 2001 From: The Wobbler Date: Sun, 13 Apr 2025 16:24:34 +0200 Subject: [PATCH] Implemented MPRIS metadata "mpris:artUrl" --- wobuzz/player/mpris.py | 6 +++++- wobuzz/player/player.py | 23 +++++++++++++++++++++++ wobuzz/utils.py | 1 + 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/wobuzz/player/mpris.py b/wobuzz/player/mpris.py index f4c3146..fdf7bf4 100644 --- a/wobuzz/player/mpris.py +++ b/wobuzz/player/mpris.py @@ -62,8 +62,12 @@ class MPRISPlayer(DbusInterfaceCommonAsync, interface_name=MPRIS_PLAYER_INTERFAC await self.Metadata.set_async(self.to_xesam(metadata)) def to_xesam(self, metadata: "TrackMetadata") -> dict: + # cache name by filename without extension + art_path = self.app.utils.tmp_path + "/cover_cache/" + metadata.path.split("/")[-1][:-4] + xesam_metadata = { - "mpris:trackid": ("s", "kjuztuktg"), + "mpris:trackid": ("s", "kjuztuktg"), # nonsense, no functionality + "mpris:artUrl": ("s", "file://" + art_path), "xesam:title": ("s", metadata.title), "xesam:artist": ("as", [metadata.artist]) } diff --git a/wobuzz/player/player.py b/wobuzz/player/player.py index b9bc4e9..6946667 100644 --- a/wobuzz/player/player.py +++ b/wobuzz/player/player.py @@ -1,5 +1,6 @@ #!/usr/bin/python3 +import os import time import threading import pygame.mixer @@ -40,6 +41,8 @@ class Player: self.paused = False self.app.gui.on_playstate_update() + + self.export_cover_art_tmp() self.mpris_server.exec_async(self.mpris_server.set_metadata(self.current_playlist.current_track.metadata)) # cache next track so it immediately starts when the current track finishes @@ -217,3 +220,23 @@ class Player: self.start_playlist(playlist) break + + def export_cover_art_tmp(self) -> None: + """ + Export the cover art of the current track to /tmp/wobuzz/current_cover, so MPRIS can access it. + """ + + metadata = self.current_playlist.current_track.metadata + + art_tmp_path = self.app.utils.tmp_path + "/cover_cache/" + art_path = art_tmp_path + metadata.path.split("/")[-1][:-4] + + if os.path.isfile(art_path): # cover art already exported + return + + if not os.path.exists(art_tmp_path): + os.makedirs(art_tmp_path) + + file = open(art_path, "wb") + file.write(metadata.images.any.data) + file.close() diff --git a/wobuzz/utils.py b/wobuzz/utils.py index 901b57b..eabba71 100644 --- a/wobuzz/utils.py +++ b/wobuzz/utils.py @@ -8,6 +8,7 @@ class Utils: home_path = str(Path.home()) wobuzz_location = os.path.dirname(os.path.abspath(__file__)) settings_location = f"{wobuzz_location}/settings.json" + tmp_path = "/tmp/wobuzz" def __init__(self, app): self.app = app