No description
  • C# 45%
  • TypeScript 29.7%
  • HTML 12.1%
  • Rust 7.2%
  • JavaScript 2.7%
  • Other 3.3%
Find a file
Bruno Hunziker f11bd043fe Fix LabelFilter crash on duplicate normalized keys (server 1.35.7)
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.
2026-06-19 21:59:05 +02:00
.opencode Flacify.Mobile -> Flacify.Player: rename to flacify.player + add web target 2026-06-07 15:30:01 +02:00
Flacify.Analysis Flacify.Server: write albumGain to all disc manifests 2026-06-10 12:23:47 +02:00
Flacify.API Blazor migration Phase 1 (server 1.8.0, player 1.5.0) 2026-06-11 09:41:17 +02:00
Flacify.ClientApi Initialize Flacify Mobile project: add Expo setup, mobile player context, API hook, and initial configurations. 2026-05-29 23:15:53 +02:00
Flacify.Console Discogs taxonomy (1.18.0 server, 1.7.0 console) 2026-06-17 14:23:39 +02:00
Flacify.Core Add one-shot re-pick endpoint for post-reset label migration (1.35.2) 2026-06-19 19:09:28 +02:00
Flacify.Infrastructure Fix LabelFilter crash on duplicate normalized keys (server 1.35.7) 2026-06-19 21:59:05 +02:00
Flacify.Player Drop dead Discogs backfill pipeline (1.33.0) 2026-06-19 11:41:17 +02:00
Flacify.Ripper Flacify.Ripper: bar shows per-disc progress (0-100% per CD) 2026-06-13 17:55:20 +02:00
Flacify.Server Fix LabelFilter crash on duplicate normalized keys (server 1.35.7) 2026-06-19 21:59:05 +02:00
Flacify.Tests Fix LabelFilter case/whitespace mismatches (1.35.4) 2026-06-19 20:20:04 +02:00
Flacify.Web Fix LabelFilter crash on duplicate normalized keys (server 1.35.7) 2026-06-19 21:59:05 +02:00
Tools Fix 3 sidecar bugs surfaced by prod verification + add VerifySidecar tool 2026-06-05 10:42:08 +02:00
.gitignore Flacify.Ripper: multi-disc rip + album page disc grouping 2026-06-09 15:09:52 +02:00
AGENTS.md Docs: clarify MusicBrainzLastQueried + ArtistReleases state 2026-06-16 19:13:47 +02:00
CHANGELOG.md Fix LabelFilter crash on duplicate normalized keys (server 1.35.7) 2026-06-19 21:59:05 +02:00
docker-compose.yml Enhance ScanService with progress tracking, improved artist enrichment, and MusicBrainz metadata handling. Integrate ArtistInfoService for artist enrichment. Update UI components for scanning visibility and playback improvements. Adjust API settings and database setup for production readiness. 2026-05-19 22:17:50 +02:00
drive-offsets.bin Move API Description to Webpage 2026-05-18 22:24:28 +02:00
Flacify.sln Add Flacify logo component across screens, improve header design, refine playback logic with track format and bitrate settings, and integrate network-based resolution for streaming quality. 2026-06-02 15:26:47 +02:00
LICENSE Add initial CHANGELOG.md, and include MIT license file. Transition Flacify.Console to Terminal.Glue framework. Refactor Razor components and update project metadata. 2026-05-25 14:33:08 +02:00
README.md cleanup: CHANGELOG, TODO, AGENTS, doc updates for Tauri desktop shell + bump Server 1.7.1 -> 1.7.2 2026-06-09 11:10:29 +02:00
TODO.md Radio station: Styles filter (1.16.0 server, 1.6.14 player) 2026-06-17 11:24:14 +02:00

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.