From 2ba4e1bb6fa7b93b2f788fb1e726c6e20d8e217a Mon Sep 17 00:00:00 2001 From: fojadrachi Date: Sat, 12 Sep 2026 00:08:32 +0200 Subject: [PATCH] Fix: Discord-Fortschrittszeit stackt weiterhin bei YT-Music-Songwechsel (gapless playback) video.currentTime wird bei YouTube Music beim Songwechsel wegen nahtloser (gapless) Wiedergabe aus einem durchgehenden Buffer nicht zuverlaessig auf 0 zurueckgesetzt. Da start/end bisher bei JEDEM RPC-Update frisch aus currentTime berechnet wurden, blieb die in Discord angezeigte Zeit ueber Songwechsel hinweg stehen bzw. stackte sich, obwohl Titel/Bild laengst gewechselt hatten (v2.1.2 hat nur das Rate-Limit-Problem fuer das Bild behoben, nicht dieses). Der Zeit-Anker wird jetzt im DiscordRPCWorker anhand von Titel-/Untertitel- Aenderung gesetzt (_track_timestamps) und bleibt danach stabil ueber die Systemzeit, statt bei jedem Send erneut aus currentTime abgeleitet zu werden. Co-Authored-By: Claude Sonnet 5 --- playtube/discord_rpc.py | 66 ++++++++++++++++++++++++++++++----------- 1 file changed, 48 insertions(+), 18 deletions(-) diff --git a/playtube/discord_rpc.py b/playtube/discord_rpc.py index 5861bf7..880f745 100644 --- a/playtube/discord_rpc.py +++ b/playtube/discord_rpc.py @@ -54,9 +54,13 @@ def _upsize_thumbnail(url: str | None) -> str | None: return _THUMBNAIL_SIZE_RE.sub("=w544-h544-l90-rj", url) -def build_presence_payload(info: dict[str, Any], session_start: int) -> dict[str, Any]: +def build_presence_payload( + info: dict[str, Any], session_start: int, start_ts: int, end_ts: int | None +) -> dict[str, Any]: """Baut das update()-Payload fuer pypresence aus den vom Browser-Tab gelieferten - Medien-Informationen.""" + Medien-Informationen. start_ts/end_ts werden vom DiscordRPCWorker mitgegeben (siehe + dort _track_timestamps) statt hier direkt aus info["currentTime"] berechnet zu + werden.""" is_music = bool(info.get("isMusic")) playing = bool(info.get("playing")) title = _truncate(info.get("title"), fallback="Unbekannter Titel") @@ -84,22 +88,10 @@ def build_presence_payload(info: dict[str, Any], session_start: int) -> dict[str "large_text": "YouTube Music" if is_music else "YouTube", "small_image": ASSET_PLAY if playing else ASSET_PAUSE, "small_text": "Spielt" if playing else "Pausiert", + "start": start_ts, } - - duration = info.get("duration") or 0 - current_time = info.get("currentTime") or 0 - # IMMER start/end mitschicken, unabhaengig vom playing-Status - nicht nur wenn - # playing=true. Discord ersetzt "timestamps" bei einem SET_ACTIVITY-Update ohne - # diese Felder offenbar nicht sauber, sondern behaelt intern die zuletzt bekannten - # Werte bei ("stackt"). Waehrend eines Songwechsels ist "playing" durch das kurze - # Neuladen des