github Kopuz-org/kopuz v0.16.0

latest release: v0.16.1
13 days ago

Android is back and shippable, two new sources (Apple Music, Nextcloud), lyrics grew depth blur and instrumental breaks, and remote tracks start faster. The app identity finished its move to moe.kopuz.kopuz, so your data directory moves with it on macOS and Windows.

Highlights

Android builds again. arm64 APK on the releases page (API 24+), signed release job that fails a tagged build rather than shipping unsigned, F-Droid recipe, just android-release. Phone UI too: two line track rows, swipe gestures (up for fullscreen, left/right for next/prev), notification shuffle and repeat buttons, media permission flow, a keepalive waker so the player task keeps turning while hidden, WebView based YouTube deciphering, and an AMOLED theme (#634).

(I wanted mention android again .d)

Apple Music. Browser sign in, catalog and library browsing, favorites, playlists, downloads, word timed lyrics, per server storefront and language. Playback is hand rolled Widevine using a CDM borrowed from a browser you already have installed (never shipped with Kopuz); Android goes through MediaDrm. Streams decrypt progressively instead of pulling the whole file first (#455, closes #404).

Nextcloud over WebDAV. App password auth. No music API there, so the library is read off the tree: folder is album, level above is artist. Listings carry no duration, so the scanner range requests the file head. Per server library folders with a PROPFIND picker and autodetect. Covers go embedded, then sidecar, then the preview endpoint. Use the Subsonic source if your instance runs the Music app (#629).

Lyrics. Depth of field blur with a strength slider, synthesized instrumental breaks that fill left to right, the active line stays centered, changing songs no longer reads as a scroll, tab switches no longer desync, and a manual offset that auto fills from the backend's reported output latency (#643, #647, #648).

Remote tracks start faster. HTTP clients are pooled across tracks instead of one handshake per song, and the next 512 KiB window prefetches once reading passes the middle of the current one (#634).

Radio uses the server's analysis. OpenSubsonic sonicSimilarity (AudioMuse on Navidrome) when advertised, song seeded getSimilarSongs otherwise, seed at the head of the queue, and a 90s budget since cold metadata agent lookups were timing out silently (#647, 15615f3).

Untrusted paths. Offline filenames are SHA-256 derived, extensions restricted, downloads staged before publication. Deletion only touches direct children of the offline cache or canonical files under a configured library root. Cancellation tombstones close the race where a worker finishing after a cancel re-registered the track (#650).

Fixes

  • Favorite reconciliation ran one SQLite statement per item, now one json_each insert per page; in-memory search stopped cloning rows and re-lowercasing (#650).
  • Nextcloud stream URLs carry the app password in the userinfo, now redacted before any log line, error, or UI string (#629).
  • Dashboard rows carry the full song action menu, which is how you reach radio from there (#647).
  • Radio button showed on playlist views that can't answer it, and Nextcloud capabilities was missing the radio field (#647, 15615f3).
  • First launch after upgrading moves the old macOS and Windows data directory to the new identity, and refuses to merge onto an existing one (899fb50).

What's Changed

Full Changelog: v0.15.1...v0.16.0

Don't miss a new kopuz release

NewReleases is sending notifications on new releases.