- C# 45%
- TypeScript 29.7%
- HTML 12.1%
- Rust 7.2%
- JavaScript 2.7%
- Other 3.3%
The 1.35.6 fix let Discogs return 200 but LabelFilter.FilterValidStylesAsync then threw 'ArgumentException: An item with the same key has already been added. Key: bossanova' on the first album whose picker returned a style containing 'Bossa Nova'. Root cause: the canonical Styles table has both 'Bossa Nova' and 'Bossanova' (legacy alt-spelling from the 1.18.0 SQL hard-cut). Both normalize to 'bossanova' via NormalizeForMatch (lowercase + whitespace strip), so ToDictionary(NormalizeForMatch, ...) crashed on the second row. Fix: replace ToDictionary with GroupBy(NormalizeForMatch).ToDictionary(g => g.Key, g => g.First()). On collision, keep the first DB row's spelling as canonical. FilterValidGenresAsync got the same fix defensively even though the Genres table has no current collisions. Cleanup: drop the 'Bossanova' row from Flacify.Server/Sql/1.18.0_taxonomy_hard_cut.sql so future runs don't see the duplicate in the first place. Existing prod DBs can run 'DELETE FROM "Styles" WHERE "Name" = '"'"'Bossanova'"'"';' to clean up. The picker returned 'Bossa Nova' (the standard spelling), so all existing AlbumStyles join rows already point to that row -- no data loss. Files: - Flacify.Infrastructure/Constants/LabelFilter.cs -- both filter methods use GroupBy + First instead of ToDictionary. - Flacify.Server/Sql/1.18.0_taxonomy_hard_cut.sql -- removed 'Bossanova' from the canonical list. - Flacify.Server/Flacify.Server.csproj -- 1.35.6 -> 1.35.7. Versions: server 1.35.6 -> 1.35.7. No client change. After deploy, re-trigger POST /api/admin/albums/repick. |
||
|---|---|---|
| .opencode | ||
| Flacify.Analysis | ||
| Flacify.API | ||
| Flacify.ClientApi | ||
| Flacify.Console | ||
| Flacify.Core | ||
| Flacify.Infrastructure | ||
| Flacify.Player | ||
| Flacify.Ripper | ||
| Flacify.Server | ||
| Flacify.Tests | ||
| Flacify.Web | ||
| Tools | ||
| .gitignore | ||
| AGENTS.md | ||
| CHANGELOG.md | ||
| docker-compose.yml | ||
| drive-offsets.bin | ||
| Flacify.sln | ||
| LICENSE | ||
| README.md | ||
| TODO.md | ||
Flacify
Multi-project music toolbox: CD ripper, music server, CRC database, project website. Built for Linux with .NET 10.
Quick start
dotnet build
dotnet run --project Flacify.Console # CD ripper
dotnet run --project Flacify.Console -- --test # rip single track (dev)
dotnet run --project Flacify.API # CRC database API
dotnet run --project Flacify.Server # music server
dotnet run --project Flacify.Web # project website
Projects
Flacify.Console — CD → FLAC ripper (v1.1.0)
Linux CD ripper with MusicBrainz metadata lookup, AccurateRip CRC verification, and a keyboard-driven Terminal.Glue TUI. Multi-disc album support, automatic drive offset correction (4,798 drives from AccurateRip), genre management, and first-run setup wizard.
Dependencies: cdparanoia, flac, eject
Flacify.Server — Music server (v1.0.2)
Subsonic-compatible music server with Blazor frontend. Stream your library over the network. 30 Subsonic endpoints, play tracking with listening history, radio stations, starring/favorites, artist discography sync from MusicBrainz, and a stats dashboard.
docker build -t flacify-server Flacify.Server
Flacify.API — CRC database (v1.0.0)
Open CRC database for CD rip verification. Accepts and serves AccurateRip CRCs submitted by users.
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/v1/health |
Server status and counts |
| POST | /api/v1/submit |
Submit CRC data (100/hr per IP) |
| GET | /api/v1/lookup |
Lookup a disc by CRC ID or TOC fields |
Flacify.Web — Project website
Blazor Server landing page with project cards, live stats, CD ripper docs with screenshots, CRC database lookup, manifest format specification, and API reference.
Project structure
| Directory | Description |
|---|---|
Flacify.Console/ |
CD ripper (Terminal.Glue TUI) |
Flacify.Player/ |
Music player (Expo + React Native; Android + Web + Linux/Tauri AppImage targets) |
Flacify.Server/ |
Subsonic music server (Blazor) |
Flacify.API/ |
CRC database REST API |
Flacify.Core/ |
Shared models and interfaces |
Flacify.Infrastructure/ |
Data layer, scanner, infrastructure |
Flacify.Web/ |
Project website |
Flacify.Tests/ |
Integration tests |
Tools/ |
ScrapeDriveOffsets utility |
License
MIT — see LICENSE.