From c6fe8953349eda504c7c1ea20b0629a3585de5b6 Mon Sep 17 00:00:00 2001 From: fojadrachi Date: Sat, 12 Sep 2026 13:44:41 +0200 Subject: [PATCH] Fix: Discord-Thumbnail bleibt ueber mehrere Songs stehen (YT Music) Log-Beweis: dieselbe Thumbnail-URL blieb ueber mehrere komplett verschiedene Songs (unterschiedliche Titel/Interpreten) unveraendert stehen, waehrend Titel und Zeit bereits korrekt aktualisiert wurden. Das bisher bevorzugte in der YT-Music-Playerleiste wird von YouTube per Crossfade/Shadow-DOM animiert und aktualisiert sein src-Attribut dabei nicht zuverlaessig pro Titel. Thumbnail wird jetzt primaer aus der Video-ID in der URL abgeleitet (wechselt garantiert synchron mit dem Titel, dieselbe Quelle die schon zuverlaessig als Fallback diente) statt aus dem unzuverlaessigen Player-Leisten-, das nur noch als letzter Fallback dient. Debug-Log zeigt jetzt zusaetzlich die URL pro Send fuer weitere Verifikation. Co-Authored-By: Claude Sonnet 5 --- playtube/discord_rpc.py | 3 ++- playtube/media_probe.py | 12 ++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/playtube/discord_rpc.py b/playtube/discord_rpc.py index 8937c62..e01b1f0 100644 --- a/playtube/discord_rpc.py +++ b/playtube/discord_rpc.py @@ -259,9 +259,10 @@ class DiscordRPCWorker(QThread): payload = build_presence_payload(item, self._session_start, start_ts, end_ts) self._presence.update(**payload) log_line( - "[send] title=%r thumbnail=%r large_image=%r start=%s end=%s" + "[send] title=%r url=%r thumbnail=%r large_image=%r start=%s end=%s" % ( item.get("title"), + item.get("url"), item.get("thumbnail"), payload.get("large_image"), start_ts, diff --git a/playtube/media_probe.py b/playtube/media_probe.py index e44895b..aab7bc9 100644 --- a/playtube/media_probe.py +++ b/playtube/media_probe.py @@ -82,10 +82,18 @@ MEDIA_PROBE_JS = r""" var videoId = videoIdFromUrl(location.href); var title = null, subtitle = null, thumbnail = null; + // WICHTIG: die Video-ID aus der URL ist die zuverlaessigste Thumbnail-Quelle - sie + // wechselt garantiert synchron mit dem Titel. Das in der YT-Music-Playerleiste + // (fruehere Praeferenz) wird von YouTube per Crossfade/Shadow-DOM animiert und + // aktualisiert sein src-Attribut dabei nachweislich NICHT zuverlaessig pro Titel - + // empirisch bestaetigt: dieselbe Thumbnail-URL blieb ueber mehrere komplett + // unterschiedliche Songs hinweg stehen, obwohl Titel/Zeit schon laengst gewechselt + // hatten. Das DOM- dient nur noch als Fallback, falls keine Video-ID in der + // URL steckt. if (isMusic) { title = txt('.title.ytmusic-player-bar') || txt('ytmusic-player-bar .title'); subtitle = txt('.byline.ytmusic-player-bar') || txt('ytmusic-player-bar .byline'); - thumbnail = imgSrc('ytmusic-player-bar img, .image.ytmusic-player-bar img') || ytThumbnailUrl(videoId); + thumbnail = ytThumbnailUrl(videoId) || imgSrc('ytmusic-player-bar img, .image.ytmusic-player-bar img'); } else { var t = document.title.replace(/ - YouTube$/, ''); title = t || null; @@ -94,7 +102,7 @@ MEDIA_PROBE_JS = r""" || txt('#channel-name a') || txt('ytd-channel-name#channel-name a'); var imgY = document.querySelector('link[rel="image_src"]'); - thumbnail = (imgY ? imgY.href : null) || ytThumbnailUrl(videoId); + thumbnail = ytThumbnailUrl(videoId) || (imgY ? imgY.href : null); } var timeInfo = isMusic ? musicTimeInfo() : youtubeTimeInfo();