- Read the track from the Media Session API, falling back to the legacy
ytmusic-player-bar scrape. Current YT Music layouts render no player bar,
so the API and tray stayed empty while music played. Artist is also clean
now (no "• views • likes" suffix).
- Terminate connected WebSocket clients before closing the server. ws's
close() waits for every client to disconnect, so quitting with an overlay
open hung forever, leaving the window playing and the port bound.
- Replace the tray icon with a valid PNG (the old one had a bad IDAT CRC and
decoded to an empty image) and test that its chunks are well formed.
- Create the tray before the window so early state updates are not dropped.
- Bump version to 1.0.1.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Splits the release workflow into linux, windows and macos jobs feeding a
single publish job. The publish step is separate so parallel builds cannot
race to create the release and fail on a duplicate tag.
Windows now builds natively, so signAndEditExecutable no longer has to be
disabled. That flag was suppressing rcedit, which is what embeds the icon
and version resources -- the v1.0.0 exe shipped with the stock Electron
icon as a result. Also adds an NSIS installer alongside the portable zip.
macOS gains a dmg target, which cannot be produced off macOS. Builds stay
unsigned pending a Developer ID, with CSC_IDENTITY_AUTO_DISCOVERY disabled
so electron-builder builds unsigned instead of failing on a real Mac.
Nothing cross-builds now; all three runners must be registered before
tagging, since a job with no matching runner queues silently.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Adds a mac zip target (x64 + arm64) so releases cover all three
platforms. Builds unsigned: electron-builder skips code signing when not
running on macOS, so these need the quarantine attribute cleared.
Also puts ${os} in artifactName. Without it the Windows and macOS zips
were both WhatsThatMusic-1.0.0-x64.zip, which collide as release assets
and give no clue which platform they are.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The build config only had a Windows target. Adds a linux block producing
an AppImage, plus a 512x512 build/icon.png so the packaged app does not
ship with the stock Electron icon.
Verified by running the packaged binary: the embedded server comes up on
9095 and serves the overlay from process.resourcesPath, confirming the
extraResources mapping works in a packaged build.
StartupWMClass is deliberately not set via linux.desktop -- electron-builder
already emits the correct value, and the nested { entry: {...} } form leaks a
literal "entry=[object Object]" line into the .desktop file.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Removes extension/, desktop-client/backends/, desktop-client/config.js,
server/, root package.json/package-lock.json/node_modules/, and the
now-unused electron-store dependency from desktop-client/package.json.
The desktop-client is now a self-contained Electron app with no external
deps beyond express and ws.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Removes top-level let trayInstance, opts, currentTitle, currentArtist
and the top-level buildMenu function. All mutable state and buildMenu
now live inside the createTray closure. Public API and behaviour are
unchanged.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>