Repository navigation
Releases: Kentarohakase/YTMPresence
Releases · Kentarohakase/YTMPresence
Release list
YTMPresence 1.4.0
[1.4.0] - 2026-08-09
Changed
- The project documentation is now in English: the changelog including its history, the README and everything under
docs/. The extension is published in an international store, and German documentation no longer matched that.
Fixed
- The Discord presence is no longer hard-coded to German. Playback state, the paused line, the advertisement notice and the label of the track button were fixed strings — an English user was showing their contacts „Pausiert bei 1:23" and a button called „Auf YouTube Music öffnen". This is the text other people read, not the app's own interface.
PresenceTextin the core project now translates according to the system language, falling back to English instead of German. - The diagnostics window and the getting-started window follow the system language as well. Server state, the connection and Discord lines, the age labels, the update-check line and the error message when opening YouTube Music were all hard-coded German. The visible interface is now fully translated.
- Log messages are English. They were German, which was the least useful of the options: understandable to the maintainer, opaque to everyone else, and no longer matching the now-English documentation. Logs are deliberately not translatable — a log line is a search key, and a localised message no longer matches the string in the source when a user reports it. The diagnostics window keeps following the system language; that is the surface built for users, whereas the log is the surface built for diagnosis.
- The mini player follows the Windows language. Playback state, the no-track placeholder and the label of the previous-track command were hard-coded German and stayed German even when the rest of the interface ran in English.
YTMPresence 1.3.1
[1.3.1] - 2026-08-09
Changed
- Die Extension fordert die Berechtigung
tabsnicht mehr an. Gebraucht wurde sie nie:tabs.querymit URL-Filter undtabs.sendMessagefunktionieren über die Host-Berechtigung fürhttps://music.youtube.com/*,tabs.createbraucht gar keine Berechtigung, und aus den Treffern wird ausschließlich die Tab-ID gelesen. Chrome zeigte dafür bei der Installation „Deinen Browserverlauf lesen" an — für eine Fähigkeit, von der die Extension nie Gebrauch gemacht hat. - Kurzbeschreibung und Store-Text nennen die Companion-App jetzt zuerst. Ohne sie ist die Extension funktionslos, weil Discord Rich Presence sich aus dem Browser heraus nicht setzen lässt. Die Kurzbeschreibung stammt aus
_locales/<sprache>/messages.jsonund wird von Chrome aus dem Manifest übernommen, nicht aus dem Store-Dashboard. docs/STORE_SUBMISSION_CHECKLIST.mdenthält die Angaben zur Datenerhebung für das Chrome-Dashboard, abgestimmt auf die bereits deklarierten Firefox-Metadaten.
YTMPresence 1.3.0
[1.3.0] - 2026-08-09
Fixed
- Die Presence lässt sich wieder entfernen. Zum Löschen sendete der Discord-IPC-Client den Befehl
CLEAR_ACTIVITY— den es im RPC-Protokoll nicht gibt; dokumentiert sindSET_ACTIVITY,SEND_ACTIVITY_JOIN_INVITEundCLOSE_ACTIVITY_REQUEST. Discord lehnte den Befehl ab, die Ablehnung wurde verworfen, und die App meldete weiterhin „Discord OK". In der Folge blieb die Presence stehen:OnlyShowWhenPlayingwirkte nicht,PausedClearSecondswirkte nicht, und auch beim Beenden verschwand sie nicht. Gelöscht wird jetzt überSET_ACTIVITYmitactivity: null. - Track-URLs verlieren ihre Prozent-Kodierung nicht mehr. Zur Normalisierung wurde an drei Stellen
Uri.ToString()benutzt — laut Dokumentation die unescaped kanonische Form („All characters are unescaped except #, ? and %"). Aus?q=Sam%20Smithwurde dadurch?q=Sam Smithmit echten Leerzeichen. Discord lehnte die Aktivität daraufhin komplett ab ("url" must be a valid uri), und es erschien überhaupt keine Presence. Betroffen waren die Suchlinks, auf die zurückgefallen wird, wenn keine Video-ID zu finden ist. Es wird jetztAbsoluteUriverwendet. - Eine ungültige Button-URL kostet nicht mehr die gesamte Presence. Die URL wird vor dem Bauen des Buttons geprüft; hält sie nicht stand, entfällt nur dieser Button und eine Logzeile nennt den Grund.
- Vor einem Presence-Update wird nicht mehr erst gelöscht. Der frühere „Discord Cache Fix" sendete bei jedem Track- und Play/Pause-Wechsel ein Löschen und wartete 200 ms. Das blieb folgenlos, solange das Löschen den nicht existierenden Befehl
CLEAR_ACTIVITYbenutzte — mit dem reparierten Löschen hätte derselbe Ablauf die Presence bei jedem Songwechsel kurz verschwinden lassen.SET_ACTIVITYersetzt die Aktivität ohnehin von sich aus. - Fehlerantworten von Discord werden protokolliert statt verworfen. Genau diese Lücke hat den falschen Befehl über die gesamte Projektlaufzeit verdeckt.
Added
- Das Diagnosefenster zeigt den letzten erfolgreichen Update-Check. Fehler beim automatischen Start-Check landen bewusst nur im Log, damit nicht bei jedem Hochfahren ohne Netz eine Sprechblase erscheint — dadurch konnte er aber monatelang scheitern, ohne dass es jemand bemerkt. Liegt der letzte Erfolg über zwei Wochen zurück, weist die Zeile ausdrücklich darauf hin; ist die Prüfung beim Start abgeschaltet, steht auch das dort. Der Zeitpunkt wird in den Einstellungen gespeichert und ist im Diagnosebericht enthalten.
YTMPresence 1.2.0
[1.2.0] - 2026-08-05
Added
scripts/verify-extension-archives.ps1prüft die gebauten Extension-Archive so, wie eine Store-Uploadverarbeitung sie sieht: Eintragsnamen (Pfadtrenner, absolute Pfade, Traversal), echtes Entpacken auf die Platte und Auflösung aller__MSG_*__-Platzhalter gegen den Katalog der Standardsprache.- CI baut die Release-Artefakte jetzt selbst (
package-release.ps1 -SkipInstaller), verifiziert sie und lintet die entpackte Firefox-Variante aus dem gebauten Archiv statt des Quellordners. Ein Lint gegen die Quelle übersieht Verpackungsfehler, weil er die Archive nie anfasst.
Changed
- Der Companion-WebSocket prüft jetzt den
Origindes Handshakes. WebSocket-Verbindungen unterliegen nicht der Same-Origin-Policy: Bisher konnte jede besuchte Webseite den lokalen Companion ansprechen und überYTM_TESTunbegrenzt Token raten. Praktisch war das durch das 256-Bit-Token abgesichert, blieb aber als Fingerprinting-Fläche und offener Endpunkt bestehen. Zugelassen sind jetzt Extension-Origins (chrome-extension:,moz-extension:,safari-web-extension:) und fehlender Origin für lokale Nicht-Browser-Clients; Web-Origins werden mit HTTP 403 abgewiesen. - Sockets, die innerhalb von 60 Sekunden kein gültiges Token vorzeigen, werden geschlossen. Ein gültiges Token im Verbindungstest zählt dabei als Nachweis, weil die Extension die Verbindung bei pausierter Wiedergabe genau darüber offen hält.
- Die doppelte Implementierung der Instanzschlüssel-Berechnung (
InstallerCoordination.GetInstanceKeyundMakeInstanceKeyininstaller/YTMPresence.iss) ist auf beiden Seiten als solche gekennzeichnet, mit gemeinsamem Testvektor.docs/RELEASE_QA.mdprüft die Selbstbeendigung jetzt als eigenen Punkt: Sie ist der einzige sichtbare Nachweis, dass beide Seiten denselben Schlüssel berechnen — driften sie, fällt der Installer still auf den Restart Manager zurück und das Update wirkt trotzdem erfolgreich. - Das Setup-Asset eines Releases wird genau einmal ausgewählt; Name und Download-URL stammen anschließend aus demselben Asset. Mehrere Assets mit
-setup.exewerden wie mehrdeutige Prüfsummenzeilen abgelehnt, statt still das erste zu nehmen – die Reihenfolge der GitHub-Antwort ist nicht zugesichert. - Releases mit
prerelease: truewerden nicht mehr als Update angeboten./releases/latestfiltert sie zwar bereits, aberUpdateApiUrlist konfigurierbar. - Auswahl und Verifikation des Prüfsummen-Assets vergleichen den Dateinamen jetzt beide ordinal. Ein abweichend geschriebenes
sha256sums.txtwird dadurch gar nicht erst angeboten, statt später mit einer irreführenden Sicherheitsmeldung abzubrechen. Die Artefaktnamen liegen dafür inUpdateArtifactNamesals gemeinsame Quelle.
Fixed
- Pausierte Wiedergabe wird wieder als Pause erkannt. Die Extension las den Wiedergabestatus bevorzugt aus
navigator.mediaSession.playbackStateund fiel nur bei leerem Wert auf das Medienelement zurück. Da YouTube Music diesen Wert beim Pausieren nicht zuverlässig aktualisiert, meldete die Extension dauerhaft „läuft" — die Presence blieb in Discord stehen, und wederOnlyShowWhenPlayingnochPausedClearSecondskonnten greifen, weil der Companion nie eine Pause zu sehen bekam. Maßgeblich ist jetztpauseddes Medienelements;mediaSessiondient nur noch als Rückfall. Sprünge in der Zeitleiste (seeking) werden übersprungen, damit die Presence beim Spulen nicht flackert. - Die Suche nach dem Medienelement berücksichtigt jetzt auch
<video>. Fand YouTube Music kein<audio>, hatten Position, Dauer und Wiedergabestatus zuvor gar keine Quelle, und der Status fiel stillschweigend auf „läuft" zurück. - Die Presence verlinkt nicht mehr ein beliebiges Video von der Seite.
getPlayerBarWatchUrlenthielt Selektoren ohne Container-Bezug (a[href*="/watch?v="]unda[href*="music.youtube.com/watch?v="]), die den ersten passenden Link im gesamten Dokument greifen — auf YouTube Music also Einträge aus der Warteschlange, Empfehlungskacheln oder der Seitenleiste. Da diese Quelle zusätzlich Vorrang hatte, wurde ein nie abgespielter Track verlinkt. Es zählen jetzt ausschließlich Anker innerhalb von<ytmusic-player-bar>, und das Artwork steht an erster Stelle: Es wird vom Player pro Track gesetzt und meint als einzige Quelle zuverlässig den laufenden Titel. - Die Track-URL berücksichtigt jetzt auch die Adresszeile. YouTube Music liefert (Stand 2026-08) weder die Player-Leisten-Anker noch
canonical, undog:urlzeigt auf/app_shellohne Video-ID — die Ermittlung hing damit allein am Artwork als letzter Rückfallebene. Die Kandidaten sind neu nach Verlässlichkeit geordnet: Player-Leiste, Artwork, Adresszeile, canonical. Die zuvor identischen Zweige fürvideo- und Standardmodus wurden zusammengeführt. - Release-ZIPs verwenden jetzt Forward Slashes als Pfadtrenner.
Compress-Archiveschreibt unter Windows PowerShell 5.1 Backslashes, was gegen die ZIP-Spezifikation verstößt: Spezifikationstreue Entpacker – darunter die Uploadverarbeitung von Chrome Web Store und addons.mozilla.org – lesen_locales\en\messages.jsonals flachen Dateinamen statt als Verzeichnis, wodurch die__MSG_*__-Platzhalter im Manifest nicht auflösen. Betroffen waren beide Extension-ZIPs und das Bundle-ZIP. verify-release.ps1normalisiert Backslash-Einträge nicht mehr auf Forward Slashes, sondern bricht mit Nennung der betroffenen Einträge ab. Die bisherige Normalisierung hat genau den Defekt als in Ordnung gemeldet, den die Prüfung finden sollte.
YTMPresence 1.1.0
[1.1.0] - 2026-08-05
Added
- Versionskonsistenzprüfung für App, Assembly-Metadaten, Extension und Release-Changelog; CI und Release-Paketierung brechen bei Abweichungen ab.
- Settings-Recovery sichert beschädigte JSON-Dateien als
settings.corrupt-<timestamp>.jsonund erzeugt anschließend gültige Defaults. - Update-Sicherheitskomponenten in
YTMPresence.Core.Updates(URL-Validierung, Prüfsummen-Parser, Größenlimits, temporäre Arbeitsverzeichnisse, Download-Service, Start-Verifikation) mit umfangreichen Tests für Prüfsummen-, Download-, Redirect- und Prozessstart-Fälle. - Settings-Flag
AllowLoopbackUpdateSource(Standard: aus) als explizite Testkonfiguration für den lokalen QA-Update-Server;scripts/test-update-flow.ps1setzt es automatisch und stellt die Originaleinstellungen wieder her.
Changed
- Einstellungen werden über eine temporäre Datei und atomaren Dateiersatz gespeichert.
- Firefox-Pakete deklarieren die lokale Übertragung von Browsing-Aktivität und Website-Inhalten über Mozillas Consent-Metadaten, ohne die bestehende Mindestversion 126 anzuheben.
- Updates werden nur noch nach erfolgreicher SHA256-Verifikation ausgeführt. Fehlende
SHA256SUMS.txt, fehlende, doppelte oder widersprüchliche Setup-Zeilen, ungültige oder abweichende Hashes blockieren die Installation; der bisherige Start „ohne Prüfsummenvergleich“ entfällt. - Update-Quellen sind auf HTTPS zu
api.github.com,github.com,release-assets.githubusercontent.comundobjects.githubusercontent.combeschränkt; Metadaten- und Asset-Redirects werden einzeln validiert (max. 5, Schleifenerkennung), Downloads haben Größenlimits (Setup 300 MB, Prüfsummen 64 KB, Metadaten 4 MB) sowie Verbindungs-, Stall- und Gesamt-Timeouts. EigeneUpdateApiUrl-Werte außerhalb dieser Richtlinie werden mit einer klaren Fehlermeldung abgelehnt. - Jeder Updateversuch nutzt ein eindeutiges temporäres Verzeichnis mit
.part-Datei und atomarem Umbenennen nach der Prüfung; Fehler und Abbrüche räumen auf, verwaiste Verzeichnisse werden beim App-Start altersbasiert bereinigt. - Unmittelbar vor dem Setup-Start werden Existenz, Name, Größe und SHA256 erneut geprüft und die Datei während des Starts gegen Veränderung gesperrt; YTMPresence beendet sich erst nach tatsächlich gestartetem Setup und bleibt bei einem Fehlstart benutzbar.
- Der Inno-Setup-Installer beendet keine Prozesse mehr per
taskkillnach Dateinamen: Er bittet die installierte Instanz über ein mit SHA256 kollisionsresistent an den Zielpfad gebundenes Shutdown-Event, sich regulär zu beenden, und nutzt sonst den Windows Restart Manager (CloseApplications=force), der nur Prozesse mit offenen Dateien im Installationsordner schließt. Portable Kopien und fremde gleichnamige Prozesse bleiben unberührt. verify-release.ps1verifiziertSHA256SUMS.txtnur noch (Existenz, exakt eine gültige Zeile pro Artefakt, korrekte Hashes, keine veralteten/doppelten/unbekannten Zeilen) statt sie neu zu schreiben; erzeugt wird die Liste ausschließlich inpackage-release.ps1, nachdem alle Artefakte final sind. Der Release-Workflow baut und testet die Solution vor dem Paketieren.
Fixed
- WebSocket-Textnachrichten bleiben korrekt, wenn ein UTF-8-Zeichen über mehrere Frames fragmentiert ist; Binär- und übergroße Nachrichten werden weiterhin verworfen.
- Serverstart, -stopp und Presence-Updates sind serialisiert; Idle-Tasks und Discord-Ressourcen werden bei Neustarts vollständig beendet.
- Ein rückwärtskompatibles Keepalive über den bestehenden Verbindungstest hält die Manifest-V3-WebSocket-Verbindung bei pausierter Wiedergabe aktiv, ohne Pause- oder Idle-Timeouts zurückzusetzen.
- Die finale Release-Prüfsummenliste enthält jetzt auch Firefox-ZIP und – sofern gebaut – das Setup-EXE.
YTMPresence 0.8.10
[0.8.10] - 2026-05-15
Changed
- Release-Skript baut Installer nur noch über Inno Setup und ist dadurch einfacher wartbar.
Fixed
- Release-Skript entfernt veraltete Setup-Artefakte und lässt bei
-SkipInstallerkeine alte Setup-EXE liegen. - Update-Fenster deaktiviert Download- und Installationsbuttons, wenn ein Release kein Setup-Asset enthält.
- Companion-Server verwirft nicht-textuelle oder zu große WebSocket-Nachrichten frühzeitig.
- Einstellungen verhindern URL-artige Hosts und ungültige WebSocket-Pfade.
Removed
- Alter IExpress-basierter Installer-Fallback wurde entfernt.
YTMPresence 0.8.9
[0.8.9] - 2026-05-15
Added
- Inno-Setup-Installer-Pipeline mit GitHub-Actions-Integration fuer Release-Builds.
Changed
- Release-Skript nutzt Inno Setup bevorzugt und faellt lokal bei fehlendem
ISCC.exeauf den bisherigen Legacy-Installer zurueck.
YTMPresence 0.8.8
[0.8.8] - 2026-05-15
Added
- Diagnosefenster kann jetzt einen Diagnosebericht als ZIP mit Status, Umgebung, redacted Settings und Logs erstellen.
YTMPresence 0.8.7
[0.8.7] - 2026-05-15
Fixed
- Update-Installer startet das Setup jetzt mit explizitem Arbeitsverzeichnis und beendet die App nicht mehr selbst, bevor der Installer sichtbar läuft.
YTMPresence 0.8.6
[0.8.6] - 2026-05-15
Changed
- Update-Installer kann Setups auch nur herunterladen und prüfen, ohne die App zu beenden.