feat(android): playlist mgmt, album sort, home hero parity, notification fix
- Playlist: create (FAB + dialog), rename, delete, remove songs, cover upload/remove - Library Albums tab: sort chips (Neueste/Älteste/A-Z/Künstler) matching StarredScreen - ABS notification: shows current chapter title; updates live without re-buffering - Home hero: pool now matches web (frequent(5) ∪ recentlyPlayed(5)); label MEISTGESPIELT / ZULETZT GEHÖRT - Home: added Zuletzt gehört section (type=recent) matching web layout - Notifications: fixed delivery bug — polling moved to NotificationStore app-lifetime scope so notifications arrive even after user navigates away from ImporterScreen - NotificationStore.startPoll() extended with navType/navAlbum/navArtist/navId params - Removed defunct AbsPlayerService.kt Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
1 parent
eacce487df
commit
6be7981b8a
16 files changed
+971
-412
No files matched your search
+200
@@ -0,0 +1,200 @@
|
||||
# Changelog
|
||||
|
||||
All notable changes to NovaSonic are documented here.
|
||||
Format follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
||||
Versioning: `MAJOR.MINOR.PATCH` — minor = new feature, patch = fix/improvement.
|
||||
|
||||
---
|
||||
|
||||
## Platform Parity Matrix
|
||||
|
||||
| Feature | Web (PWA) | Android |
|
||||
|----------------------------------|:---------:|:-------:|
|
||||
| Music playback (Navidrome) | ✅ | ✅ |
|
||||
| Seek bar / scrubbing | ✅ | ✅ |
|
||||
| Queue management | ✅ | ✅ |
|
||||
| Shuffle / Repeat | ✅ | ✅ |
|
||||
| Radio mode (similar songs) | ✅ | ✅ |
|
||||
| Now Playing overlay | ✅ | ✅ |
|
||||
| Dominant color background | ✅ | ✅ |
|
||||
| Cover art scale animation | ❌ | ✅ |
|
||||
| Synced lyrics (LRCLIB) | ✅ | ✅ |
|
||||
| Lyrics autoscroll | ✅ | ✅ |
|
||||
| Star / favorite song | ✅ | ✅ |
|
||||
| Multi-artist navigation | ✅ | ✅ |
|
||||
| Album detail page | ✅ | ✅ |
|
||||
| Artist page (Navidrome) | ✅ | ✅ |
|
||||
| Artist page (iTunes fallback) | ✅ | ❌ |
|
||||
| Concert events (Ticketmaster) | ✅ | ✅ |
|
||||
| Genre browsing | ✅ | ✅ |
|
||||
| Global search | ✅ | ✅ |
|
||||
| Playlist browsing | ✅ | ✅ |
|
||||
| Playlist create/edit | ✅ | ✅ |
|
||||
| Playlist cover upload | ✅ | ✅ |
|
||||
| Spotify / YouTube importer | ✅ | ✅ |
|
||||
| Import notification | ✅ | ✅ |
|
||||
| Import notification → nav | ✅ | ✅ |
|
||||
| ABS (Audiobookshelf) playback | ✅ | ✅ |
|
||||
| ABS chapter navigation | ✅ | ✅ |
|
||||
| ABS sleep timer | ✅ | ✅ |
|
||||
| ABS playback speed | ✅ | ✅ |
|
||||
| ABS library search | ✅ | ✅ |
|
||||
| ABS book descriptions (HTML) | ✅ | ✅ |
|
||||
| Media notification | ✅ | ✅ |
|
||||
| ABS notification (modern style) | ❌ | ✅ |
|
||||
| Android Auto | — | ✅ |
|
||||
| Romaji / Japanese sort | ✅ | ❌ |
|
||||
| Settings (Navidrome, ABS, etc.) | ✅ | ✅ |
|
||||
|
||||
---
|
||||
|
||||
## [0.7.0] — 2026-06-18
|
||||
|
||||
### Added
|
||||
- **Android** — Playlist create: "+" FAB on the Playlists tab opens a dialog to create a new playlist
|
||||
- **Android** — Playlist rename: pencil icon in the playlist hero opens a rename dialog (pre-filled with current name)
|
||||
- **Android** — Playlist delete: trash icon in the playlist hero with confirmation dialog; navigates back to library on success
|
||||
- **Android** — Playlist song removal: edit-mode toggle button in the playlist action row reveals a "−" button per song; tapping removes the song from the playlist via Navidrome API (`updatePlaylist.view?songIndexToRemove`)
|
||||
- **Android** — ABS notification: current chapter name shown as the main title; book title moves to the artist line; updates automatically on chapter change without interrupting playback
|
||||
- **Android** — Home "Zuletzt gehört" section: recently played albums row added below "Zuletzt hinzugefügt", matching the web's `type=recent` row
|
||||
|
||||
### Fixed
|
||||
- **Android** — In-app notification bell: import/download notifications were never delivered after navigating away from the Importer screen because the poll loop ran in `viewModelScope` (cancelled on navigation); polling now delegates to `NotificationStore.startPoll()` which uses an app-lifetime `CoroutineScope` — notifications are delivered regardless of screen
|
||||
- **Android** — Home hero card: pool now matches web exactly — union of `frequent(5) ∪ recentlyPlayed(5)` deduped, random pick; label is "MEISTGESPIELT" or "ZULETZT GEHÖRT" depending on which list the album came from (was hardcoded "AKTUELL")
|
||||
- **Android** — Artist screen crash: duplicate key in `LazyColumn` when Navidrome returns the same song ID more than once in `topSongs`; key now uses `idx_id`
|
||||
- **Android** — "Alle Alben anzeigen" crash: duplicate key in `LazyGrid` when two albums share the same name + year; key now uses `idx_name_year`
|
||||
- **Android** — "Alle Alben anzeigen": albums were left-aligned inside grid cells; now centered
|
||||
- **Android** — "Alle Alben anzeigen" search bar now matches the app design (`OutlinedTextField`, `RoundedCornerShape(12.dp)`, accent color border — same as `ExploreScreen`)
|
||||
- **Android** — ABS notification button order: Samsung One UI slot mapping was causing wrong order; buttons now show Kapitel zurück | 30s zurück | Play/Pause | 30s vor | Kapitel vor as intended
|
||||
|
||||
---
|
||||
|
||||
## [0.6.0] — 2026-06-17
|
||||
|
||||
### Added
|
||||
- **Android** — Lyrics preload on NowPlaying open; lyrics load in background while on Player tab, so switching to Lyrics tab is instant
|
||||
|
||||
### Fixed
|
||||
- **Android** — Home hero card: play button now sits to the right of title/artist, not below
|
||||
- **Android** — ABS media notification now uses Media3's modern media card style (blurred cover art background) instead of a plain notification; identical look to the music notification
|
||||
- **Android** — ABS notification buttons corrected: now shows exactly Kapitel zurück | 30s zurück | Play/Pause | 30s vor | Kapitel vor in both compact and expanded view; previously showed double back-button and 30s-forward was cut off
|
||||
- **Android** — Lyrics autoscroll switches from fixed tween to spring animation (DampingRatioNoBouncy, StiffnessLow); rapid line changes no longer produce choppy stop-and-restart scrolling
|
||||
|
||||
### Internal
|
||||
- **Android** — ABS notification rebuilt using a custom `DefaultMediaNotificationProvider` subclass (`AbsAwareNotificationProvider`) registered via `setMediaNotificationProvider()`; overrides `getMediaButtons()` to return exactly 5 session-command buttons when ABS is active, bypassing `setCustomLayout()` which only appends to (not replaces) the standard skip-prev/play-pause/skip-next buttons
|
||||
- **Android** — Removed abandoned `AbsPlayerService.kt` (unreferenced, unregistered, referenced missing drawable)
|
||||
|
||||
---
|
||||
|
||||
## [0.5.0] — 2026-06
|
||||
|
||||
### Added
|
||||
- **Android** — ABS full playback: chapter list, playback speed control, sleep timer, progress sync to ABS server
|
||||
- **Android** — ABS 30s skip-back / skip-forward buttons in media notification (compact + expanded view)
|
||||
- **Android** — ABS library search bar in Books tab (server-side search via `/api/libraries/{id}/search`, 400ms debounce)
|
||||
- **Android** — Notification sheet: shows import/download history with status icons; "Zum Album →" / "Öffnen →" button navigates to album or playlist on tap
|
||||
- **Web** — Notification sheet: "Zum Album →" link button after download completes
|
||||
- **Android** — NowPlaying lyrics: 200ms lookahead for better sync feel (matches web)
|
||||
|
||||
### Fixed
|
||||
- **Web + Android** — ABS book descriptions: HTML tags (`<p>`, `</p>`) now stripped before display
|
||||
- **Android** — NowPlaying background: switched from `darkMutedSwatch` to `vibrantSwatch` (55% darken) for more visible color tinting
|
||||
- **Android** — NowPlaying top bar: fixed layout overflow with navigation labels
|
||||
- **Android** — Lyrics scroll: removed Phase 2 "drift" animation; now simply centers active line (matches web `scrollTo({ behavior: 'smooth' })`)
|
||||
- **Android** — ABS skip: library list skip fixed on first load
|
||||
|
||||
---
|
||||
|
||||
## [0.4.0] — 2026-05
|
||||
|
||||
### Added
|
||||
- **Android** — Full native app rewrite in Kotlin / Jetpack Compose (replaces React Native / Expo attempt)
|
||||
- **Android** — Media3 / ExoPlayer music playback with `MusicService` (`MediaLibraryService`)
|
||||
- **Android** — NowPlaying screen: cover art with scale animation (Apple Music style), seek bar with drag scrubbing, queue tab, lyrics tab
|
||||
- **Android** — Dominant color background in NowPlaying (Palette API, animated on song change)
|
||||
- **Android** — Multi-artist display with per-artist tap-to-navigate in NowPlaying
|
||||
- **Android** — Synced lyrics via LRCLIB (parallel requests, in-memory cache)
|
||||
- **Android** — ABS (Audiobookshelf) integration: login, library browse, book detail, chapter playback
|
||||
- **Android** — Android Auto support: browsable tree (Recent, Favorites, Playlists), play-all / shuffle pseudo-items
|
||||
- **Android** — Radio mode: auto-queues similar songs via Navidrome `getSimilarSongs`
|
||||
- **Android** — Global search (Navidrome)
|
||||
- **Android** — Genre browsing with play button per genre
|
||||
- **Android** — Concert events via Ticketmaster on artist page
|
||||
- **Android** — Spotify / YouTube importer (connects to backend)
|
||||
- **Android** — Notification sheet in-app (import/download job progress)
|
||||
- **Android** — Settings: Navidrome URL/credentials, ABS URL/token, theme, display name
|
||||
|
||||
### Fixed
|
||||
- **Android** — Login flash on startup (credentials loaded before nav resolves)
|
||||
- **Android** — Album name casing normalization
|
||||
|
||||
---
|
||||
|
||||
## [0.3.0] — 2025-Q4
|
||||
|
||||
### Added
|
||||
- **Web** — Artist page: hero banner, iTunes + Navidrome album categorization, all-songs view
|
||||
- **Web** — Concert events via Ticketmaster (replaces Bandsintown); 30min server-side cache
|
||||
- **Web** — Playlist editing: name, description, public toggle, cover image upload
|
||||
- **Web** — Global search: artist cards with images, explicit badge (E)
|
||||
- **Web** — Romaji display for Japanese artists/albums (Navidrome `sortName` tag)
|
||||
- **Web** — iTunes album detail page (for tracks not in Navidrome)
|
||||
- **Web** — Mobile search bar in header (tap icon)
|
||||
- **Web** — Smooth progress bar scrubbing with touch drag
|
||||
|
||||
### Fixed
|
||||
- **Web** — Multi-artist splitting: handles `·`, `/`, `;` separators; each name navigates to own artist profile
|
||||
- **Web** — Lyrics: LRCLIB fuzzy fallback, title-only search fallback, parallel requests, in-memory cache
|
||||
- **Web** — Lyrics scrollbar hidden, fade edges on active line
|
||||
- **Web** — Artwork: hi-res cover embedded; consistent `album_artist` tag for Navidrome grouping
|
||||
- **Web** — `feat.`/`ft.`/`featuring` converted to `/` in artist tag for correct Navidrome multi-artist split
|
||||
|
||||
---
|
||||
|
||||
## [0.2.0] — 2025-Q3
|
||||
|
||||
### Added
|
||||
- **Web** — Spotify / YouTube / SoundCloud importer: resolve link → yt-dlp download → optional Navidrome playlist creation
|
||||
- **Web** — iTunes per-track artwork lookup for playlist downloads
|
||||
- **Web** — Synced lyrics via LRCLIB in Now Playing overlay (200ms lookahead)
|
||||
- **Web** — Lyrics embedding in downloaded track metadata
|
||||
- **Web** — Explicit metadata tag + E badge in search
|
||||
- **Web** — Disc number and compilation metadata tags
|
||||
- **Web** — Genre metadata from iTunes `primaryGenreName`
|
||||
- **Web** — SW update banner (notify user, no force-reload)
|
||||
- **Web** — Duplicate detection before download (shows toast on skip)
|
||||
- **Web** — Player drag feedback; swipe-up player bar opens Now Playing
|
||||
|
||||
### Fixed
|
||||
- **Web** — Spotify importer: multi-artist parsing, GraphQL embed format, locale URL support, public web-player token
|
||||
- **Web** — Playlist cover auto-refresh after upload
|
||||
- **Web** — Service worker: network-first strategy, does not intercept cross-origin requests, auto-reloads all PWA windows on SW update
|
||||
- **Web** — Bottom navigation: full-width edge-to-edge layout
|
||||
|
||||
---
|
||||
|
||||
## [0.1.0] — 2025-Q2
|
||||
|
||||
### Added
|
||||
- **Web** — Initial PWA music player (Vite + ES modules)
|
||||
- **Web** — Navidrome Subsonic API integration (albums, songs, playlists, search, cover art)
|
||||
- **Web** — Album and playlist browsing
|
||||
- **Web** — Basic player (play/pause, skip, shuffle, repeat)
|
||||
- **Web** — Media Session API (lock screen / notification controls)
|
||||
- **Web** — Service worker with offline support
|
||||
- **Web** — Docker setup: nginx frontend + Node.js backend + Navidrome
|
||||
- **Web** — Home screen: hero card (last played album), genre grid, recently added, most played, discover
|
||||
|
||||
---
|
||||
|
||||
## Planned / Backlog
|
||||
|
||||
### Features
|
||||
- **Android** — Playlist drag-and-drop / sort order
|
||||
- **Android** — Artist page iTunes fallback (for artists not in Navidrome)
|
||||
- **Android** — Romaji / Japanese sort support
|
||||
- **Web + Android** — Backend settings UI rework (move, reorganize)
|
||||
- **Web + Android** — yt-dlp backend update / maintenance
|
||||
|
||||
### Known Bugs
|
||||
_(none currently tracked)_
|
||||
Reference in new issue
Block a user