Song server: search and download songs, mobile web UI

- Sources: "free" (Creative Commons songs with media from
  github.com/UltraStar-Deluxe/songs) and "usdb" (usdb.animux.de with an
  account; audio/video via yt-dlp from the song's #VIDEO hints or YouTube
  links in the comments, covers from fanart.tv/YouTube)
- Aggregated search (all sources in parallel, in-library flag), download
  queue into <library>/Downloads/<source>/<Artist - Title>, then rescan
- Web UI in wwwroot (plain JS, no build): search, downloads with progress,
  library; phone first, dark mode, installable
- Docker image with yt-dlp, ffmpeg and deno; library mounted writable
- Tests for matching, USDB parsing and song rewriting

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Simon DiesenreiterandClaude Opus 5.5 committed 2026-11-05 23:15:48 +01:00
1 parent efcc63a640
commit 1e65864c8f
19 files changed
+1862 -12

No files matched your search

+9 -3
View File
@@ -8,15 +8,15 @@ hook-based, so upstream can still be merged.
1. **Song server** (`VocaluxeSongServer/`, in progress): a central song library on the homelab. The game becomes the
frontend and downloads song files on demand. See `VocaluxeSongServer/README.md`.
2. Later: serve the guest WebApp ("browse by phone", `WebApp/` + `VocaluxeWeb/`) directly from the server.
3. Later: search and download songs that aren't in the library, from common internet sources (possibly UltraSinger
to create songs from audio).
3. Search and download songs that aren't in the library (started: server web UI with the sources `free` and `usdb`;
next: more sources, UltraSinger to create songs from audio).
## Layout
| Folder | What |
|---|---|
| `Vocaluxe/` | The game. Song server client: `Base/SongServer/` (`CSongServer` sync, `CRemoteSongFileProvider` downloads) |
| `VocaluxeLib/` | Shared library. `Songs/CSongFiles.cs` is the hook every song file access goes through |
| `VocaluxeSongServer/` | ASP.NET Core server, Docker image `git.disi.dev/projects/vocaluxe-song-server` |
| `VocaluxeSongServer/` | ASP.NET Core server, Docker image `git.disi.dev/projects/vocaluxe-song-server`. `Sources/`: song search and downloads (free CC songs from GitHub, USDB + yt-dlp). `wwwroot/`: mobile web UI (plain JS, no build) |
| `VocaluxeWeb/`, `WebApp/` | Built-in webserver of the game and the guest WebApp (Vue), upstream |
| `Tests/` | NUnit; song server tests in `Tests/SongServer` |
@@ -32,6 +32,12 @@ hook-based, so upstream can still be merged.
- Config: `config.xml` section `SongServer` (`Url`, `ApiKey`). The contracts (`VocaluxeSongServer/Contracts`) are
linked into `Vocaluxe.csproj`; the test project references the server with `extern alias songserver`.
## Song server web UI and sources
- The web UI is plain HTML/CSS/JS in `VocaluxeSongServer/wwwroot` (no build step, no external requests except cover
images). Check it at phone width: headless Edge has a ~500px minimum window, so render the page in a 390px iframe.
- USDB can't be tested without an account (search and text download need a login). Its HTML parsing is covered by
`Tests/SongServer/CSongSourcesTest.cs`; if USDB changes its HTML, fix `CUsdbSongSource.ParseList` there.
## Build and test (Windows)
- `dotnet build Vocaluxe/Vocaluxe.csproj -c DebugWin -p:Platform=x64` (the whole solution also builds the native
`PitchTracker`, which needs Visual Studio's C++ tools).