Skip to content

v2.1.3#73

Merged
sphildreth merged 25 commits into
mainfrom
sph.2026-05-25.01
Jun 16, 2026
Merged

v2.1.3#73
sphildreth merged 25 commits into
mainfrom
sph.2026-05-25.01

Conversation

@sphildreth

Copy link
Copy Markdown
Collaborator

[2.1.3] - 2026-06-15

Added

  • Added MusicBrainz DecentDB index warm-up after Blazor startup and after
    successful MusicBrainz database promotion, using native .NET queries against
    the request-path indexed lookup shapes.
  • Added an internal DecentDB package-upgrade validation gate and runbook for
    repeatable DDB-002/DDB-003 checks against checkpointed MusicBrainz data.

Changed

  • Upgraded DecentDB.AdoNet, DecentDB.EntityFrameworkCore, and
    DecentDB.EntityFrameworkCore.NodaTime to 2.13.1.
  • MusicBrainz query probes now keep the broad ordered first-row existence
    measurement opt-in via --include-row-existence so default validation stays
    focused on request-safe indexed lookups.

Fixed

  • Validated DecentDB 2.13.1 NuGet packages against the checkpointed real
    MusicBrainz query probe, completing DDB-002 and DDB-003 with IndexSeek
    plans and sub-millisecond warm indexed equality timings.
  • MusicBrainz DecentDB startup warm-up no longer runs the alias-by-artist
    bounded query shape that DecentDB 2.13.1 rejects with a missing-parameter
    error.

sphildreth added 25 commits May 25, 2026 08:17
…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.
@sphildreth sphildreth merged commit 931853c into main Jun 16, 2026
12 checks passed
@sphildreth sphildreth deleted the sph.2026-05-25.01 branch June 16, 2026 14:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant