diff --git a/CHANGELOG.md b/CHANGELOG.md index cfde09c..b5eab2d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -55,6 +55,26 @@ Versioning: two-part `MAJOR.MINOR` — each release bumps the minor (features an --- +## [1.2] — 2026-07-25 + +Follow-up to 1.1: web history navigation, correct download tagging for mixed-artist albums, and UI polish. + +### Added +- **Android** — Directional bottom-nav tab transitions: the slide follows the tapped tab's position (a tab to the right slides in from the right, one to the left from the left) instead of a fixed, sometimes-random-feeling direction. Applied across all four enter/exit/pop transitions; detail-screen push/pop is unchanged + +### Fixed +- **Web** — Browser / mouse **Forward** navigation now works (previously only Back did): `popstate` applies the target history entry (`nsIdx`) for both directions, and the back handler no longer `pushState()`s over the browser's forward stack. In-app back buttons route through `history.back()` so the browser and app stacks stay in sync +- **Web** — Album detail header showed the **first track's** artist (e.g. "TWICE" on a soundtrack) instead of the album artist; it now reads the album's own album-artist fields from `getAlbum` (matches the Android app) +- **Web** — Metadata autofill (iTunes / MusicBrainz) normalizes the trailing `" & "` in a multi-artist credit ("A, B & C" → "A; B; C"), but only when the value is already a list, so band names like "Simon & Garfunkel" stay intact +- **Android** — Erkunden (Apple) overlay back no longer *sometimes* jumped to Home: the root-level back callback is re-asserted on every navigation, so it can't lose back-priority to the NavHost after an album drill-down or tab switch +- **Backend (download)** — Mixed-artist albums search **per track**: the YTM/YouTube query and channel filter use each track's own performer, so soundtrack tracks by other artists (TWICE's "Strategy", MeloMance's "Love, Maybe") are found instead of failing with "Nicht eindeutig gefunden" +- **Backend (download)** — `album_artist` is derived from iTunes' album-level `collectionArtistName` (identical across the album) instead of the request's artist — which could be the lead single's performer, so a whole KPop soundtrack was tagged `album_artist = TWICE`. Applies to album and artist downloads; each track still gets its own per-track artist tag + +### Changed +- **Web** — NowPlaying favorite star is vertically centered with the whole title / album / artist block instead of pinned to the title line + +--- + ## [1.1] — 2026-07-19 Polish release: Android navigation and offline resilience, download accuracy for artists with stylised names, and a fix for the lyrics outage caused by lrclib rate-limiting. diff --git a/CLAUDE.md b/CLAUDE.md index ee62332..9d5b1e5 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -21,6 +21,10 @@ plus a **Node.js/Express backend** that downloads tracks via yt-dlp and proxies - `src/` — web PWA (vanilla ES modules). State in `src/state.js` (the `S` object); Subsonic/iTunes API in `src/api.js`; views in `src/views/`, UI in `src/ui/`. +- **Client-side router** (`src/views/navigation.js`, History API): `navigate()` pushStates `{nsIdx}` + only on genuine new navigation; `popstate` applies the target entry's `nsIdx` for **both** back and + forward. Never `pushState` inside the `popstate`/back path — it wipes the browser's forward stack + (that was the "forward doesn't work" bug). In-app back buttons call `history.back()` (one path). - `backend/novasonic-server.js` — Express API (downloads, metadata edit/delete, events/ABS proxy). - `backend/lib/` — `ytdlp.js` (download + cascade + ffmpeg tagging), `downloader.js`, `metadata.js` (iTunes lookup, file resolution helpers), `config.js`, `jobs.js`, `romaji.js`. @@ -68,6 +72,10 @@ Backend runs in Docker (see `docker-compose.yml`); on the deploy host it lives a so without this every track on a soundtrack searched the album-artist blob + its channel filter and matched nothing (e.g. "Strategy" = TWICE, "Love, Maybe" = MeloMance failed). The `album_artist` tag still uses `albumArtist`, so album grouping is unaffected. +- **Album/artist download `album_artist`** comes from the iTunes tracks' `collectionArtistName` + (album-level, identical across the album), derived in `novasonic-server.js` — **not** the request's + `artist`, which can be the lead single's performer (a KPop soundtrack got tagged `album_artist=TWICE` + from track 1 "TAKEDOWN"). Falls back to the request artist only when iTunes omits it. - **Always write an `album` tag.** `ytdlp.js` defaults it to `Singles` when no album is known. Previously no tag was written at all, so Navidrome showed its own "Singles" fallback while the metadata editor showed "[Unknown Album]" — the two never matched and file resolution failed.