Playtube: eigenstaendiger YouTube/YouTube-Music-Player mit Discord RPC und Auto-Update

- PySide6/QtWebEngine mit persistentem Login-Profil (YouTube + YouTube Music Tabs)
- Google-Login-Fix per Sec-CH-UA-Headern + Chrome-JS-Shim
- Discord Rich Presence (eigener Thread, Titel/Fortschritt/Buttons)
- Eigenes Branding (Taskmanager/Taskleiste) per AppUserModelID + PyInstaller-Packaging
- Auto-Update ueber GitHub Releases (fojadrachi/Playtube)

Co-Authored-By: Claude Sonnet 5 <[email protected]>
This commit is contained in:
2026-09-11 19:13:13 +02:00
co-authored by Claude Sonnet 5
commit 578cda499a
21 changed files with 1640 additions and 0 deletions
+57
View File
@@ -0,0 +1,57 @@
"""Branding-Helfer: eigener Prozessname/Icon im Taskmanager, in der Taskleiste und
(so weit von Windows respektiert) im Lautstaerkemixer.
Wichtig: Diese Funktionen muessen VOR dem Import von QtWebEngineWidgets/QtWebEngineCore
aufgerufen werden, weil QtWebEngine seinen Sub-Prozess (QtWebEngineProcess.exe) beim
Import-Zeitpunkt vorbereitet.
"""
from __future__ import annotations
import os
import sys
from pathlib import Path
from .config import APP_AUMID
def set_app_user_model_id() -> None:
"""Setzt die Windows AppUserModelID fuer diesen Prozess.
Das sorgt dafuer, dass Windows die App in Taskleiste/Alt-Tab/Benachrichtigungen
als eigenstaendige Anwendung fuehrt (eigenes Icon, eigene Gruppierung) statt als
generisches "Python".
"""
if sys.platform != "win32":
return
try:
import ctypes
ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(APP_AUMID)
except Exception:
# Auf aelteren Windows-Versionen oder ohne shell32 einfach ignorieren.
pass
def configure_webengine_process_path() -> None:
"""Wenn ein umbenannter QtWebEngineProcess (siehe packaging/build.ps1) neben der
.exe liegt, wird QtWebEngine angewiesen diesen zu benutzen statt des Standard-
"QtWebEngineProcess.exe". Dadurch zeigt auch der Sub-Prozess, der tatsaechlich den
Ton wiedergibt, im Taskmanager/Lautstaerkemixer den Playtube-Namen statt
"QtWebEngineProcess".
Nur relevant fuer gepackte (PyInstaller-)Builds. Im Entwicklungsmodus (python
main.py) wird der Standardprozess von PySide6 benutzt - das ist voellig normal
und hat keinen Einfluss auf die Funktion der App.
"""
if sys.platform != "win32" or not getattr(sys, "frozen", False):
return
exe_dir = Path(sys.executable).resolve().parent
candidates = [
exe_dir / "PlaytubeHelper.exe",
exe_dir / "_internal" / "PlaytubeHelper.exe",
]
for candidate in candidates:
if candidate.exists():
os.environ["QTWEBENGINEPROCESS_PATH"] = str(candidate)
return