Skip to content

Sph.2026 05 14.01#71

Merged
sphildreth merged 9 commits into
mainfrom
sph.2026-05-14.01
May 25, 2026
Merged

Sph.2026 05 14.01#71
sphildreth merged 9 commits into
mainfrom
sph.2026-05-14.01

Conversation

@sphildreth

Copy link
Copy Markdown
Collaborator

What's New in 2.1.0

SkiaSharp Image Processing

All image processing has migrated from SixLabors.ImageSharp to SkiaSharp, replacing the legacy library with a more performant and actively maintained alternative.

  • New IImageProcessor abstraction for decode, encode, resize, format detection, and hash generation
  • Clean dependency injection throughout services, Blazor components, CLI commands, and tests
  • Conditional native asset inclusion (SkiaSharp.NativeAssets.Linux on Linux) — no extra runtime dependencies needed

Dashboard Performance

Page loads are faster and feel more responsive thanks to targeted optimizations.

  • Dashboard data loading now occurs in OnAfterRenderAsync — skeleton placeholders render immediately instead of blocking the initial page paint
  • DoctorService.NeedsAttentionAsync fast path uses lightweight file-existence checks, cutting dashboard first-render time by ~5 seconds

Bulk Delete Performance

Deleting large collections is now significantly faster.

  • SongService, AlbumService, and ArtistService batch-load entities in a single query instead of executing N+1 queries per item
  • Dramatic speed improvements for cleaning up large libraries

Party Mode Optimization

Party Mode has been refactored for direct in-process performance.

  • PartyModeService now calls domain services (PartySessionService, PartyQueueService, PartyPlaybackService, PartySessionEndpointRegistryService) directly via dependency injection instead of making HTTP requests to the same application
  • Eliminates ~20 HTTP round-trips per user interaction (create, join, leave, queue, playback, endpoints)
  • User identity resolved through IAuthService rather than cookie authentication

Developer Experience

Building and maintaining Melodee is now easier for contributors.

  • Squashed 55 EF Core database migrations into a single InitialBaseline migration — smaller repository, faster CI builds, no fragile migration chains
  • Quartz job scheduling extracted into a reusable helper, shrinking Program.cs from 1,046 to ~860 lines
  • .kilo/ project configuration with slash commands (/build, /test, /test-mql, /lint, /migrate, /coverage) and a melodee-developer agent for consistent workflows
  • CodeQL analysis optimized — JavaScript/TypeScript scanning dropped, saving 5–10 minutes per CI run

Security Hardening

  • Password reset endpoint no longer exposes reset tokens in API responses. Tokens are now only returned in development mode; in production, the endpoint returns a generic message and relies on email delivery.

Additional Improvements

  • Min-width set on album detail action column for layout stability
  • Removed unnecessary EnsureArtistAliasTableAsync call in MusicBrainz repository
  • NuGet dependency updates across the project

Migrate all image processing from SixLabors.ImageSharp to SkiaSharp via
a new IImageProcessor abstraction. This change:

- Introduces IImageProcessor interface and ImageProcessor implementation
  using SkiaSharp for all image operations (identify, resize, convert,
  hash computation)
- Refactors ImageConvertor, ImageValidator, ImageHasher, and AtlMetaTag
  to accept IImageProcessor via dependency injection
- Updates all services and Blazor components to inject IImageProcessor
- Adds null-safety checks for IdentifyAsync results since SkiaSharp can
  return null for unidentifiable images
- Registers IImageProcessor as singleton in DI containers
- Removes direct SixLabors.ImageSharp package dependency
- Suppresses NU1902 for transitive ImageSharp via IdSharp.Tagging
- Bumps various NuGet package versions
Update VersionPrefix to 2.1.0 in Melodee.Blazor and Melodee.Cli
csproj files, update docs/VERSION, and add 2.1.0 changelog entry
documenting the SixLabors.ImageSharp to SkiaSharp migration.
- Bump DecentDB.EntityFrameworkCore from 2.4.2 to 2.7.0
- Bump SkiaSharp from 3.116.1 to 3.119.2
- Bump Dapper from 2.1.72 to 2.1.79
- Bump Radzen.Blazor from 10.4.3 to 10.4.4
- Bump coverlet.collector, Jint, NBomber, MarkdownEditor, Scalar.AspNetCore
- Set min-width on album detail action column for layout stability
- Remove unnecessary EnsureArtistAliasTableAsync call in MusicBrainz repository
Move dashboard data loading from OnInitializedAsync to
OnAfterRenderAsync so skeleton placeholders render immediately
instead of blocking the initial page render.

Also update SkiaSharp.NativeAssets.Linux from 3.116.1 to 3.119.2
to align with the SkiaSharp package version.
Password reset endpoint now only returns reset tokens in
development mode. In production, a generic message is returned
and tokens are delivered via email only.

Also includes:
- Eliminate N+1 queries in bulk delete operations (SongService,
  AlbumService, ArtistService) by batch-loading entities
- Extract Quartz scheduling into ScheduleJobIfConfigured helper,
  reducing Program.cs by ~150 lines
- Remove JavaScript/TypeScript from CodeQL CI analysis
- Update EF Core model snapshot with numeric precision and
  product version bump
…ventions

Simplify implementation tracking from separate changes files in
.copilot-tracking/ to updating plan files directly. Update references
to standards locations (.github/instructions/ and .kilo/) and change
record output path (design/docs/).
Replace HttpClient-based API requests with direct calls to
PartySessionService, PartyQueueService, PartyPlaybackService, and
PartySessionEndpointRegistryService via dependency injection. User
identity is now resolved through IAuthService.CurrentUser rather than
cookie-based authentication. Eliminates ~20 HTTP round-trips per
user interaction in party mode Blazor components.

Also fix GitHub project URLs in About page and Docker instructions,
and register PartyModeService in DI container.
@sphildreth sphildreth merged commit e06180e into main May 25, 2026
10 checks passed
@sphildreth sphildreth deleted the sph.2026-05-14.01 branch May 25, 2026 03:52
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