Fix: Discord RPC hat nie Daten empfangen (runJavaScript-Bug)

Wurzelursache gefunden: page().runJavaScript() liefert bei einem direkt
zurueckgegebenen JS-Objekt in dieser PySide6/QtWebEngine-Version zuverlaessig nur
einen leeren String statt das Objekt (Zahlen/Strings funktionieren, Objekte nicht).
Dadurch schlug 'isinstance(result, dict)' in BrowserTab._on_media_probe_result IMMER
fehl, mediaInfoChanged wurde nie emittiert, MainWindow._on_media_info nie aufgerufen
und der DiscordRPCWorker damit nie mit echten Daten gefuettert (Warteschlange blieb
fuer immer leer, der Worker hat sich nie mal mit Discord verbunden).

Fix: media_probe.py gibt jetzt JSON.stringify(...) zurueck, browser.py parst den
String mit json.loads(). Per isoliertem Test verifiziert (Songtitel erscheint jetzt
korrekt im Fenstertitel, Discord-Update wird erfolgreich gesendet).

Ausserdem: PLAYTUBE_DEBUG=1 Env-Var fuer Debug-Logging in browser.py/discord_rpc.py,
Exceptions in discord_rpc.py werden jetzt sichtbar geloggt statt verschluckt,
neue Discord Client-ID.

Co-Authored-By: Claude Sonnet 5 <[email protected]>
This commit is contained in:
2026-09-11 19:46:32 +02:00
co-authored by Claude Sonnet 5
parent bba099e01c
commit cb1e13b0fc
4 changed files with 43 additions and 9 deletions
+16 -4
View File
@@ -7,6 +7,7 @@ versucht, ohne die App zu beeintraechtigen.
"""
from __future__ import annotations
import os
import queue
import time
from typing import Any
@@ -156,8 +157,12 @@ class DiscordRPCWorker(QThread):
self._presence = Presence(self._client_id)
self._presence.connect()
self._connected = True
except Exception:
if os.environ.get("PLAYTUBE_DEBUG"):
print("[discord-rpc] verbunden", flush=True)
except Exception as exc:
self._connected = False
if os.environ.get("PLAYTUBE_DEBUG"):
print(f"[discord-rpc] Verbindung fehlgeschlagen: {exc!r}", flush=True)
def _send(self, item) -> None:
if self._presence is None:
@@ -165,14 +170,21 @@ class DiscordRPCWorker(QThread):
try:
if item is _IDLE_SENTINEL:
if self._show_idle:
self._presence.update(**build_idle_payload(self._session_start))
payload = build_idle_payload(self._session_start)
self._presence.update(**payload)
else:
payload = None
self._presence.clear()
else:
self._presence.update(**build_presence_payload(item, self._session_start))
except Exception:
payload = build_presence_payload(item, self._session_start)
self._presence.update(**payload)
if os.environ.get("PLAYTUBE_DEBUG"):
print(f"[discord-rpc] gesendet: {payload!r}", flush=True)
except Exception as exc:
# Discord evtl. geschlossen worden -> beim naechsten Mal neu verbinden.
self._connected = False
if os.environ.get("PLAYTUBE_DEBUG"):
print(f"[discord-rpc] Senden fehlgeschlagen: {exc!r}", flush=True)
def _cleanup(self) -> None:
if self._presence is not None: