Skip to content

Releases: Kentarohakase/YTMPresence

YTMPresence 1.4.0

Choose a tag to compare

@github-actions github-actions released this 10 Aug 20:16

[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. PresenceText in 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

Choose a tag to compare

@github-actions github-actions released this 09 Aug 16:18

[1.3.1] - 2026-08-09

Changed

  • Die Extension fordert die Berechtigung tabs nicht mehr an. Gebraucht wurde sie nie: tabs.query mit URL-Filter und tabs.sendMessage funktionieren über die Host-Berechtigung für https://music.youtube.com/*, tabs.create braucht 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.json und wird von Chrome aus dem Manifest übernommen, nicht aus dem Store-Dashboard.
  • docs/STORE_SUBMISSION_CHECKLIST.md enthält die Angaben zur Datenerhebung für das Chrome-Dashboard, abgestimmt auf die bereits deklarierten Firefox-Metadaten.

YTMPresence 1.3.0

Choose a tag to compare

@github-actions github-actions released this 09 Aug 08:55

[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 sind SET_ACTIVITY, SEND_ACTIVITY_JOIN_INVITE und CLOSE_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: OnlyShowWhenPlaying wirkte nicht, PausedClearSeconds wirkte nicht, und auch beim Beenden verschwand sie nicht. Gelöscht wird jetzt über SET_ACTIVITY mit activity: 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%20Smith wurde dadurch ?q=Sam Smith mit 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 jetzt AbsoluteUri verwendet.
  • 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_ACTIVITY benutzte — mit dem reparierten Löschen hätte derselbe Ablauf die Presence bei jedem Songwechsel kurz verschwinden lassen. SET_ACTIVITY ersetzt 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

Choose a tag to compare

@github-actions github-actions released this 09 Aug 06:49

[1.2.0] - 2026-08-05

Added

  • scripts/verify-extension-archives.ps1 prü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 Origin des Handshakes. WebSocket-Verbindungen unterliegen nicht der Same-Origin-Policy: Bisher konnte jede besuchte Webseite den lokalen Companion ansprechen und über YTM_TEST unbegrenzt 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.GetInstanceKey und MakeInstanceKey in installer/YTMPresence.iss) ist auf beiden Seiten als solche gekennzeichnet, mit gemeinsamem Testvektor. docs/RELEASE_QA.md prü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.exe werden wie mehrdeutige Prüfsummenzeilen abgelehnt, statt still das erste zu nehmen – die Reihenfolge der GitHub-Antwort ist nicht zugesichert.
  • Releases mit prerelease: true werden nicht mehr als Update angeboten. /releases/latest filtert sie zwar bereits, aber UpdateApiUrl ist konfigurierbar.
  • Auswahl und Verifikation des Prüfsummen-Assets vergleichen den Dateinamen jetzt beide ordinal. Ein abweichend geschriebenes sha256sums.txt wird dadurch gar nicht erst angeboten, statt später mit einer irreführenden Sicherheitsmeldung abzubrechen. Die Artefaktnamen liegen dafür in UpdateArtifactNames als gemeinsame Quelle.

Fixed

  • Pausierte Wiedergabe wird wieder als Pause erkannt. Die Extension las den Wiedergabestatus bevorzugt aus navigator.mediaSession.playbackState und 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 weder OnlyShowWhenPlaying noch PausedClearSeconds konnten greifen, weil der Companion nie eine Pause zu sehen bekam. Maßgeblich ist jetzt paused des Medienelements; mediaSession dient 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. getPlayerBarWatchUrl enthielt Selektoren ohne Container-Bezug (a[href*="/watch?v="] und a[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, und og:url zeigt auf /app_shell ohne 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ür video- und Standardmodus wurden zusammengeführt.
  • Release-ZIPs verwenden jetzt Forward Slashes als Pfadtrenner. Compress-Archive schreibt 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.json als 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.ps1 normalisiert 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

Choose a tag to compare

@github-actions github-actions released this 05 Aug 13:34

[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>.json und 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.ps1 setzt 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.com und objects.githubusercontent.com beschrä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. Eigene UpdateApiUrl-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 taskkill nach 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.ps1 verifiziert SHA256SUMS.txt nur 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 in package-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

Choose a tag to compare

@github-actions github-actions released this 15 May 19:12

[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 -SkipInstaller keine 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

Choose a tag to compare

@github-actions github-actions released this 15 May 17:23

[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.exe auf den bisherigen Legacy-Installer zurueck.

YTMPresence 0.8.8

Choose a tag to compare

@github-actions github-actions released this 15 May 16:45

[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

Choose a tag to compare

@github-actions github-actions released this 15 May 15:29

[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

Choose a tag to compare

@github-actions github-actions released this 15 May 14:57

[0.8.6] - 2026-05-15

Changed

  • Update-Installer kann Setups auch nur herunterladen und prüfen, ohne die App zu beenden.