docs: trim README to core features only; fix: remove duplicate save button in Android settings

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
HoneyandClaude Sonnet 4.6 committed 2026-06-15 23:58:15 +02:00
1 parent ba16f88355
commit 3280ffee37
2 files changed
+45 -78

No files matched your search

+45 -75
View File
@@ -9,88 +9,58 @@ Built with Vite + vanilla ES modules (web) and Jetpack Compose + Media3/ExoPlaye
### Music Library ### Music Library
- Stream music from your Navidrome / Subsonic library - Stream music from your Navidrome / Subsonic library
- Browse artists, albums, playlists, starred tracks, and random picks - Browse artists, albums, playlists, starred tracks, genres, and random picks
- Sort and filter views with chip filters - Search across songs, albums, and artists
- Search / filter bar inside playlist detail and favorites (instant, client-side)
- Play count display — optional toggle in Settings
- Star and context menu on every song row - Star and context menu on every song row
- Genre browsing with genre-filtered song lists - Play count display (optional)
### Lyrics ### Lyrics
- Synced (word-by-word highlighted) and plain lyrics via lrclib.net - Synced and plain lyrics via lrclib.net, auto-fetched per track
- Auto-fetched per track — no manual setup needed - Fallback chain: exact match → no-duration match → fuzzy artist+title search → title-only search
- Fallback chain: exact match with duration → exact match without duration (catches version mismatches) → artist+title search → title-only search - In-memory cache per session
- In-memory cache per session — no repeated network requests for the same track
- Android: smooth scroll animation keeps the active line centered
### Artist Pages ### Artist Pages
- Full-bleed hero card — artist photo as portrait + blurred background (desktop); full-bleed image with name overlay (mobile) - Hero card with artist photo and blurred background
- Bio, similar artists, top songs pulled from Last.fm via Navidrome - Bio, similar artists, top songs from Last.fm
- Concert events via Ticketmaster (upcoming shows with venue, date, ticket link) - Concert events via Ticketmaster
- Albums cross-referenced against iTunes catalog — shows what's downloaded, partially downloaded, or missing - Albums cross-referenced against iTunes catalog — shows downloaded vs. missing tracks
- Artist cards with images in search results - Artist cards with images in search results
- Quick actions: play top songs, shuffle all, open concerts
### Playback ### Playback
- Queue management with shuffle, repeat (all / one), and radio mode (endless similar songs) - Queue with shuffle, repeat (all / one), and radio mode (endless similar songs)
- Spotify-style shuffle — pre-shuffles the full queue so every song plays exactly once - Now Playing overlay with synced lyrics, queue view, star, and multi-artist links
- Now Playing overlay: synced lyrics, queue view, star, multi-artist links - Gapless-style playback — next track pre-buffered before current track ends
- Multi-artist support — OpenSubsonic `artists` array shown as individual clickable links - Lock screen / notification media controls
- Gapless-style playback — next track pre-buffered 60 seconds before current track ends - Scrobbling to Navidrome (configurable delay)
- Lock screen / notification media controls (Android / iOS / desktop)
- Scrobbling to Navidrome (configurable: 15 s / 30 s / ⅓ / ⅔ / end)
### Discovery (Erkunden tab) ### Discovery
- iTunes / Last.fm integration — charts, global search, 30-second previews, similar artists, recommendations - iTunes / Last.fm — charts, global search, 30-second previews, similar artists
- Song Importer — paste a Spotify, YouTube, YouTube Music, or SoundCloud link to preview and download tracks - Song Importer — paste a Spotify, YouTube, YouTube Music, or SoundCloud link to download
### Downloads (yt-dlp backend) ### Downloads (yt-dlp backend)
- Download individual tracks, full albums, or entire artists - Download tracks, albums, or entire artists from YouTube Music / SoundCloud / Spotify
- Sources: YouTube Music (primary), YouTube, SoundCloud, Spotify (via importer) - iTunes metadata enrichment — album art, year, track number, genre
- iTunes enrichment — album, year, track number, genre, 1000×1000 cover art - Duplicate detection, standard folder/filename structure
- Duplicate detection — skips tracks already present on the server
- Standard filename: `01 - Artist - Title.ext`, organised into `AlbumArtist/Album/` folders
### Metadata Editor ### Metadata Editor
- Edit title, artist, album artist, album, genre, year, track number, disc number - Edit tags (title, artist, album, genre, year, track, disc, cover art)
- Update embedded cover art via URL or file upload - File renamed and moved automatically; Navidrome rescan triggered on save
- File renamed and moved automatically on save
- Navidrome rescan triggered after every save
### Playlists ### Playlists
- Create, edit, and delete playlists - Create, edit, delete playlists; add / remove tracks
- Add / remove tracks
- Filter/search within a playlist
### Audiobookshelf Integration (Web) ### Audiobookshelf Integration
- Browse and stream audiobooks from your Audiobookshelf server - **Web:** browse libraries, stream audiobooks, chapter navigation, playback speed, sleep timer, progress sync
- Chapters list with chapter-by-chapter navigation - **Android:** browse libraries and audiobook list (tab hidden until ABS is configured in Settings)
- Playback speed control
- Sleep timer
- Progress sync — current position saved back to ABS server
### Audiobookshelf Integration (Android)
- Browse ABS libraries and audiobook list with covers, author, and runtime
- Tab appears in navigation only when ABS URL + API key are configured in Settings
### Settings
- Connection status indicators (green / red dot) for ABS server and NovaSonic backend — tested live with a button
- Save button at top and bottom of settings for easy access
- Order matches web: Theme → Bibliothek → Audiobookshelf → Discover APIs → Navidrome Server
### App — Web PWA ### App — Web PWA
- Installable on Android / iOS / desktop - Installable on Android / iOS / desktop
- Randomized home greetings - Multiple color themes, German UI
- Multiple color themes, dark mode, mobile-first responsive layout
- German UI
### App — Android (native) ### App — Android (native Jetpack Compose)
- Native Jetpack Compose app with Material3 design — not a WebView wrapper - Media3 / ExoPlayer backend
- Media3 / ExoPlayer backend for reliable audio playback - OS notification with playback controls
- OS notification with skip / play / pause buttons - Last played song shown in mini player bar on restart; tap to resume
- Last played song persisted across restarts — shown in mini player bar; tap play to resume
- Audiobookshelf library browser (tab hidden until ABS is configured)
- No login screen flash on startup when credentials are already saved
--- ---
@@ -106,14 +76,14 @@ NovaSonic/
│ │ ├── detail.js # Artist / album detail pages │ │ ├── detail.js # Artist / album detail pages
│ │ ├── views.js # Navigation, page loaders, search │ │ ├── views.js # Navigation, page loaders, search
│ │ ├── events.js # Ticketmaster concert events │ │ ├── events.js # Ticketmaster concert events
│ │ ├── home.js # Home page, artist image cache │ │ ├── home.js # Home page
│ │ ├── search.js # Search, artist/album navigation │ │ ├── search.js # Search, artist/album navigation
│ │ ├── playlists.js # Playlist management │ │ ├── playlists.js # Playlist management
│ │ ├── spotify.js # Spotify importer │ │ ├── spotify.js # Spotify importer
│ │ ├── youtube.js # YouTube importer │ │ ├── youtube.js # YouTube importer
│ │ ├── soundcloud.js # SoundCloud importer │ │ ├── soundcloud.js # SoundCloud importer
│ │ ├── navigation.js # Client-side router │ │ ├── navigation.js # Client-side router
│ │ └── abs.js # Audiobookshelf integration (web) │ │ └── abs.js # Audiobookshelf integration
│ ├── ui/ │ ├── ui/
│ │ ├── ui.js # Modals, sidebar, context menu │ │ ├── ui.js # Modals, sidebar, context menu
│ │ ├── components.js # Song rows, cards, shared UI │ │ ├── components.js # Song rows, cards, shared UI
@@ -123,8 +93,8 @@ NovaSonic/
│ │ ├── notify.js # Toast notifications │ │ ├── notify.js # Toast notifications
│ │ └── settings.js # Settings page │ │ └── settings.js # Settings page
│ ├── state.js # Shared mutable state (S object) │ ├── state.js # Shared mutable state (S object)
│ ├── utils.js # md5, esc, formatDur, toast │ ├── utils.js # Helpers (md5, esc, formatDur, toast)
│ ├── api.js # Subsonic API, iTunes API, cover art, romaji display │ ├── api.js # Subsonic API, iTunes API, cover art
│ └── main.js # App init, audio wiring, window globals │ └── main.js # App init, audio wiring, window globals
├── backend/ ├── backend/
│ ├── novasonic-server.js # Express API: downloads, metadata, events proxy, ABS proxy │ ├── novasonic-server.js # Express API: downloads, metadata, events proxy, ABS proxy
@@ -177,7 +147,7 @@ Edit `.env`:
NAVIDROME_URL=https://music.yourdomain.com NAVIDROME_URL=https://music.yourdomain.com
BACKEND_URL=https://novasonic-api.yourdomain.com BACKEND_URL=https://novasonic-api.yourdomain.com
MUSIC_PATH=/srv/navidrome/music # absolute path to your music folder on the host MUSIC_PATH=/srv/navidrome/music
AUDIO_FMT=mp3 # mp3 | flac | opus | best AUDIO_FMT=mp3 # mp3 | flac | opus | best
AUDIO_QUALITY=0 # 0 = best (yt-dlp) AUDIO_QUALITY=0 # 0 = best (yt-dlp)
@@ -195,13 +165,13 @@ TICKETMASTER_API_KEY= # optional — free key from developer.ticketmaster.com
docker compose up -d docker compose up -d
``` ```
This starts both the frontend (nginx on port 8080) and the backend (Node.js on port 3700). Route both ports through your reverse proxy. Frontend on port 8080, backend on port 3700. Route both through your reverse proxy.
### 3. First launch ### 3. First launch
1. Open the app and enter your Navidrome server URL, username and password 1. Enter your Navidrome server URL, username, and password
2. Optionally add a Last.fm API key in Settings for recommendations and artist bios 2. Optionally add a Last.fm API key in Settings for bios and recommendations
3. Optionally connect Audiobookshelf in Settings to stream audiobooks 3. Optionally connect Audiobookshelf in Settings
4. Optionally add the NovaSonic backend URL in Settings to enable downloads 4. Optionally add the NovaSonic backend URL in Settings to enable downloads
--- ---
@@ -220,13 +190,13 @@ This starts both the frontend (nginx on port 8080) and the backend (Node.js on p
| Variable | Default | Description | | Variable | Default | Description |
|---|---|---| |---|---|---|
| `PORT` | `3700` | Port the backend listens on | | `PORT` | `3700` | Port the backend listens on |
| `MUSIC_PATH` | `/music` | Absolute path to your Navidrome music folder (mounted as volume) | | `MUSIC_PATH` | `/music` | Absolute path to your Navidrome music folder |
| `AUDIO_FMT` | `mp3` | Download output format (`mp3`, `flac`, `opus`, `best`) | | `AUDIO_FMT` | `mp3` | Download format (`mp3`, `flac`, `opus`, `best`) |
| `AUDIO_QUALITY` | `0` | yt-dlp audio quality (0 = best) | | `AUDIO_QUALITY` | `0` | yt-dlp audio quality (0 = best) |
| `MAX_PARALLEL` | `2` | Max concurrent download jobs | | `MAX_PARALLEL` | `2` | Max concurrent download jobs |
| `DOWNLOAD_BACKEND` | `auto` | `ytdlp` / `squid` / `auto` (tries Qobuz first, falls back to yt-dlp) | | `DOWNLOAD_BACKEND` | `auto` | `ytdlp` / `squid` / `auto` |
| `SQUID_QUALITY` | `mp3` | Qobuz quality: `mp3`, `flac`, `hi-res` | | `SQUID_QUALITY` | `mp3` | Qobuz quality: `mp3`, `flac`, `hi-res` |
| `TICKETMASTER_API_KEY` | — | Free API key from [developer.ticketmaster.com](https://developer.ticketmaster.com) — enables concert events on artist pages | | `TICKETMASTER_API_KEY` | — | Free key from [developer.ticketmaster.com](https://developer.ticketmaster.com) |
--- ---
@@ -203,9 +203,6 @@ fun SettingsScreen() {
Spacer(Modifier.height(8.dp)) Spacer(Modifier.height(8.dp))
// ── Save button (BOTTOM) ─────────────────────────────────────────────
SaveButton(vm, state.isSaving, state.savedOk, state.error)
HorizontalDivider(modifier = Modifier.padding(vertical = 8.dp), color = NsBorder) HorizontalDivider(modifier = Modifier.padding(vertical = 8.dp), color = NsBorder)
OutlinedButton( OutlinedButton(