v2.1.3#73
Merged
Merged
Conversation
…during processing - Remove DirectoryProcessingDelete script evaluation from inbound processing to prevent accidental data loss; directories are no longer physically deleted through event scripting - Treat delete onDeny from DirectoryProcessingStart as skip for safety - Fix image renumbering to skip File.Move when filename already matches - Fix FileSystemFileInfo.Exists to check Name before falling back to OriginalName, preserving copied cover images in staged metadata - Add Blackbeard plugin to directory processor pipeline - Bump SkiaSharp from 3.119.2 to 3.119.4 - Update docs navigation and scripting documentation - Bump version to 2.1.1
…for revalidation Expand ScanStepResult and ProcessingEventStatistics with granular storage transfer metrics including skip reasons, merge counts, and failure tracking. Add bypassNegativeCache option to ArtistSearchEngineService.DoSearchAsync so StagingAlbumRevalidationJob can force revalidation after cached misses. Fix MergedJobDataMap initialization in MelodeeJobExecutionContext so string-keyed puts are mirrored correctly. Condense DecentDB improvements design doc from historical narrative to active TODO backlog.
Add iTunes ID alongside MusicBrainz and Spotify as a trusted external artist identifier. Artists with only an iTunes ID are now considered valid, participate in storage insert matching, and can be used for directory naming. - Artist.IsValid() now checks ItunesId with Nullify() - ArtistService.FindArtistAsync accepts and queries by iTunes ID - LibraryInsertJob matches existing artists by iTunes ID - ArtistSearchEngineService includes iTunes in trusted ID checks - AlbumValidator skips invalid-artist flag when artist is already valid - StagingAlbumRevalidationJob revalidates albums with valid artists to clear stale invalid-artist statuses Also fix Dashboard spinner lifecycle: use SetSpinnerVisible method, guard against updates after component disposal, and clear spinner on dispose.
During inbound move-mode processing, delete source sidecar metadata files (.sfv, .nfo, .m3u, .cue, Blackbeard provenance) after albums are staged. Also clean up metadata-only directories left behind by earlier runs when the delete-original setting is enabled.
…ers in inbound Replace boolean conversion flag with a dictionary mapping original filenames to their converted counterparts, so the staging resolver can locate converted files (e.g. MP3 from FLAC) and stage them instead of leaving them behind in the inbound directory. Add TryResolveSourceFileForStaging to centralize source file resolution with converted-file awareness.
… and conversion throttling Add run-scoped performance metrics collection for library scans including artist lookup cache behavior, conversion/copy time, and DecentDB persistence retry counts. Introduce compound artist fallback lookups that split names like "Artist One feat. Artist Two" and validate candidates against trusted identities and release evidence. Bound concurrent media conversions to reduce CPU/disk saturation on large batch scans. Skip staging revalidation for albums with blank or unsearchable artist metadata instead of repeatedly calling external providers. Share a single DirectoryRunContext across inbound processing and revalidation stages so caches persist for the full scan lifecycle.
Add ShouldAttemptCompoundArtistFallback guard that returns false when bypassNegativeCache is true, preventing forced staging revalidation from expanding compound artist names into multiple fallback provider searches that made mcli library scan appear hung on invalid collaboration artists. Also improve StagingAlbumRevalidationJob progress reporting to track albums processed separately from albums revalidated, giving clearer visibility into skipped albums during revalidation runs.
Add a staging-local revalidation state database that tracks failed album revalidation attempts and defers recently failed albums on subsequent scans instead of re-querying every invalid staged release on every run. The state database is recreated automatically if missing or corrupt, and a passthrough session is used as fallback when the store cannot be opened. Add live progress messages and item counts for inbound processing, staging revalidation, storage transfer, and database insert steps so active steps no longer appear stuck at 0% during scans. Each step now reports current item, total count, and a descriptive message through a thread-safe ScanProgressState that updates the Spectre progress task at 200ms intervals.
Track artist search database read errors and DecentDB corruption errors in scan performance output and surface them as scan warnings. Format processing event messages as single-line summaries instead of full stack traces. Disable ATL library console stack trace output in both CLI and Blazor hosts to prevent TUI corruption during scans.
…p doctor validation - Defer inbound directories whose files are still changing instead of partially staging releases while the source copy is in progress - Expand move-mode cleanup to remove source residue files (artwork, .txt notes) after media files are gone, allowing empty directories to be deleted - Replace shallow EF Core connection probes in `mcli doctor` with deep DecentDB validation that checks file presence, opens the database, inspects expected schema tables, and runs read queries - Accept valid converted MP3s when ffmpeg produced usable output but ATL reports an unexpected format label, preventing converted tracks from being stranded in inbound - Rename "corruption" terminology to "non-retryable error" and "open/read failure" across artist search persistence and scan output
…eserialization
External artist provider searches now pass bounded max results to plugins
instead of int.MaxValue during forced lookups. A new GetBoundedMaxResults
helper clamps requested page size between 1 and a configurable upper bound.
iTunes search models changed ArtistId, CollectionId, AmgArtistId, and
PrimaryGenreId from int? to long? to prevent deserialization failures for
large Apple identifiers. The artist search URL template was fixed from
double-braced literal {{maxResults}} to interpolated {maxResults}, and
UniqueId calculation corrected from operator-precedence bug
(CollectionId ?? 0 + ArtistId ?? 0) to CollectionId ?? ArtistId ?? 0.
Staging revalidation now tracks and reports artist lookup attempts and
no-match counts in scan output and job logs. The revalidation state store
logs database path, existence, and row counts on open.
- Ignore malformed NFO track lines and missing artist metadata without emitting parser stack traces - Report missing staged files once per album instead of per-song - Use compact release/alias loading path for single-result MusicBrainz artist lookups to reduce unnecessary data retrieval - Add phase timing diagnostics to DecentDB artist searches
- Execute all enabled search engines concurrently via Task.WhenAll instead of sequentially, reducing overall search latency - Add per-engine timeout (10s) with linked CancellationTokenSource to prevent individual slow engines from blocking results - Add CancellationToken support and request coalescing to ImageSearchUpload component with proper IDisposable cleanup - Fix search value SortOrder (Artist=1, Year=2, Title=3) to ensure correct album query parameter ordering - Add test verifying concurrent plugin execution
- Upgraded DecentDB packages to 2.8.0 and other minor dependency upgrades - Fixed duplicate EasyMDE script import in Blazor shell - Prevented EasyMDE's Font Awesome stylesheet auto-download via MarkdownEditor - Added ordered first-row projection for MusicBrainz artist queries - Updated diagnostics and documentation for DecentDB improvements - Incremented project version to 2.1.2 across components
…query tooling - Added `ArtistAlias` entity with normalized name indexing for efficient lookups. - Formalized large-text search strategy in `decentdb-large-text-search-strategy.md`, prohibiting substring scans on hot paths. - Documented DecentDB-specific enhancements in `decentdb-provider-enhancements.md`, covering WAL checkpoint handling, indexed string equality performance, full-text guidance, and upgrade diagnostics. - Added `DecentDBMusicBrainzImportSummary` for summarizing streaming import row counts. - Implemented `MusicBrainzImportProbe` and `MusicBrainzQueryProbe` benchmarks to measure and diagnose DecentDB performance with record-phase profiling and sample query outputs.
…ocument remaining follow-up - Upgraded DecentDB to 2.10.0 and validated real-file MusicBrainz scenarios. - Query probe tooling now emits DecentDB EXPLAIN output with structured plan diagnostics for indexed and ordered equality shapes. - Provider enhancements for ordered indexed equality and native index rebuild were validated, but checkpointed large-table indexed equality remains multi-second (DDB-002 and DDB-003). - Updated documentation and benchmarks to reflect provider fixes and unresolved runtime/storage issues in 2.10.0 validation results.
…ocument remaining follow-up - Upgraded DecentDB to 2.11.0 and validated real-file MusicBrainz scenarios. - Updated query probe tooling, benchmarks, and diagnostics for DecentDB 2.11.0 validation. - Confirmed provider fixes for ordered indexed equality and native index rebuild helpers, but checkpointed large-table indexed equality remains multi-second (DDB-002 and DDB-003). - Adjusted documentation and benchmarks to reflect 2.11.0 results and ongoing runtime/storage issues.
…ocument remaining follow-up - Upgraded DecentDB to 2.12.0 and validated real-file MusicBrainz scenarios. - Updated query probe tooling, benchmarks, and diagnostics for DecentDB 2.12.0 validation. - Confirmed provider fixes for ordered indexed equality and native index rebuild helpers, but checkpointed large-table indexed equality remains multi-second (DDB-002 and DDB-003). - Adjusted documentation and benchmarks to reflect 2.12.0 results and ongoing runtime/storage issues.
…update docs - Upgraded DecentDB to 2.13.1 and validated real-file MusicBrainz scenarios. - Resolved DDB-002 and DDB-003 with `IndexSeek` plans and sub-millisecond warm indexed equality timings for `Artist.NameNormalized`, `ArtistAlias.NameNormalized`, and `Artist.MusicBrainzIdRaw`. - Updated query probe tooling, benchmarks, and diagnostics for DecentDB 2.13.1 validation. - Adjusted documentation to reflect runtime/storage fix and completed follow-up for 2.13.1.
- Added `MusicBrainzDecentDbWarmupService` to optimize hot-path indexed query shapes. - Documented new runbook for DecentDB package upgrade validation and acceptance steps. - Created tools for automated DDB-002/DDB-003 gate probes with query performance criteria. - Updated tests to cover warm-up behaviors and validation scenarios.
…ntDB warm-up - Removed alias-by-artist warm-up query rejected by DecentDB 2.13.1. - Updated tests, documentation, and diagnostics to reflect adjusted query shapes. - Bumped Jint and Serilog.Settings.Configuration dependencies to latest versions.
…angelog - Updated `VersionPrefix` to 2.1.3 in all projects. - Reorganized and updated the changelog for release.
…remove IdSharp dependency - Migrated from `IdSharpMetaTag` to `NativeId3MetaTag` for improved .mp3 metadata handling. - Removed `IdSharp` dependencies (`IdSharp.Common` and `IdSharp.Tagging`) across the project. - Updated `DirectoryProcessorToStagingService` to use `NativeId3MetaTag`. - Adjusted tests to reflect the metadata plugin migration. - Cleaned up unused `AuralizeBlazor` dependency in the Blazor project.
- Introduced detailed DecentDB usage and migration documentation to guide users through resolving unsupported file-format errors. - Updated Admin dashboard to display specific DecentDB health issues, linking to the migration guide for easier resolution. - Improved `Doctor` service and dashboard logic to surface health check results for incompatible DecentDB files. - Enhanced test coverage for health checks and migration scenarios.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
[2.1.3] - 2026-06-15
Added
successful MusicBrainz database promotion, using native .NET queries against
the request-path indexed lookup shapes.
repeatable DDB-002/DDB-003 checks against checkpointed MusicBrainz data.
Changed
DecentDB.AdoNet,DecentDB.EntityFrameworkCore, andDecentDB.EntityFrameworkCore.NodaTimeto2.13.1.measurement opt-in via
--include-row-existenceso default validation staysfocused on request-safe indexed lookups.
Fixed
2.13.1NuGet packages against the checkpointed realMusicBrainz query probe, completing DDB-002 and DDB-003 with
IndexSeekplans and sub-millisecond warm indexed equality timings.
bounded query shape that DecentDB
2.13.1rejects with a missing-parametererror.