Implements Jellyfin MusicVideo library sync for issue #42.
Projects Jellyfin CollectionType=musicvideos libraries as LibraryMediaKind.MusicVideos instead of dropping them.
Adds Jellyfin MusicVideo item retrieval with includeItemTypes=MusicVideo and artist metadata support.
Routes MusicVideo Jellyfin libraries through a new IJellyfinMusicVideoLibraryScanner implementation.
Adds tests for library projection and sync-handler routing.
Root cause
Jellyfin MusicVideo libraries were silently dropped because JellyfinApiClient.Project() only recognized tvshows, movies, and boxsets. Even if a MusicVideo library existed locally, the scanner handler only routed Movies and Shows; unsupported kinds returned success without scanning.
Verification
RED confirmed: JellyfinApiClientTests.GetLibraries.Should_Project_MusicVideo_Libraries failed with 0 projected libraries before implementation.
RED confirmed: SynchronizeJellyfinLibraryByIdHandlerTests.Handle.Should_Scan_MusicVideo_Libraries failed because the MusicVideo scanner contract/route did not exist.
TZ=UTC dotnet test ErsatzTV.Infrastructure.Tests/ErsatzTV.Infrastructure.Tests.csproj -v minimal passed: 16 tests.
TZ=UTC dotnet test ErsatzTV.Scanner.Tests/ErsatzTV.Scanner.Tests.csproj -v minimal passed: 1467 tests.
TZ=UTC dotnet test ErsatzTV.Architecture.Tests/ErsatzTV.Architecture.Tests.csproj -v minimal passed: 5 tests.
git diff --check passed.
Note: attempted dotnet build ErsatzTV.sln -v minimal and dotnet build ErsatzTV/ErsatzTV.csproj -v minimal; both became silent/stuck in the local shell and the host build process was killed after process inspection. Project-level tests/builds above completed successfully.
Docs
No docs updated; this is an ingestion behavior fix with no new operator-facing configuration.
## Summary
Implements Jellyfin MusicVideo library sync for issue #42.
- Projects Jellyfin `CollectionType=musicvideos` libraries as `LibraryMediaKind.MusicVideos` instead of dropping them.
- Adds Jellyfin MusicVideo item retrieval with `includeItemTypes=MusicVideo` and artist metadata support.
- Routes MusicVideo Jellyfin libraries through a new `IJellyfinMusicVideoLibraryScanner` implementation.
- Adds tests for library projection and sync-handler routing.
## Root cause
Jellyfin MusicVideo libraries were silently dropped because `JellyfinApiClient.Project()` only recognized `tvshows`, `movies`, and `boxsets`. Even if a MusicVideo library existed locally, the scanner handler only routed Movies and Shows; unsupported kinds returned success without scanning.
## Verification
- RED confirmed: `JellyfinApiClientTests.GetLibraries.Should_Project_MusicVideo_Libraries` failed with 0 projected libraries before implementation.
- RED confirmed: `SynchronizeJellyfinLibraryByIdHandlerTests.Handle.Should_Scan_MusicVideo_Libraries` failed because the MusicVideo scanner contract/route did not exist.
- `TZ=UTC dotnet test ErsatzTV.Infrastructure.Tests/ErsatzTV.Infrastructure.Tests.csproj -v minimal` passed: 16 tests.
- `TZ=UTC dotnet test ErsatzTV.Scanner.Tests/ErsatzTV.Scanner.Tests.csproj -v minimal` passed: 1467 tests.
- `TZ=UTC dotnet test ErsatzTV.Architecture.Tests/ErsatzTV.Architecture.Tests.csproj -v minimal` passed: 5 tests.
- `git diff --check` passed.
Note: attempted `dotnet build ErsatzTV.sln -v minimal` and `dotnet build ErsatzTV/ErsatzTV.csproj -v minimal`; both became silent/stuck in the local shell and the host build process was killed after process inspection. Project-level tests/builds above completed successfully.
## Docs
No docs updated; this is an ingestion behavior fix with no new operator-facing configuration.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
Implements Jellyfin MusicVideo library sync for issue #42.
CollectionType=musicvideoslibraries asLibraryMediaKind.MusicVideosinstead of dropping them.includeItemTypes=MusicVideoand artist metadata support.IJellyfinMusicVideoLibraryScannerimplementation.Root cause
Jellyfin MusicVideo libraries were silently dropped because
JellyfinApiClient.Project()only recognizedtvshows,movies, andboxsets. Even if a MusicVideo library existed locally, the scanner handler only routed Movies and Shows; unsupported kinds returned success without scanning.Verification
JellyfinApiClientTests.GetLibraries.Should_Project_MusicVideo_Librariesfailed with 0 projected libraries before implementation.SynchronizeJellyfinLibraryByIdHandlerTests.Handle.Should_Scan_MusicVideo_Librariesfailed because the MusicVideo scanner contract/route did not exist.TZ=UTC dotnet test ErsatzTV.Infrastructure.Tests/ErsatzTV.Infrastructure.Tests.csproj -v minimalpassed: 16 tests.TZ=UTC dotnet test ErsatzTV.Scanner.Tests/ErsatzTV.Scanner.Tests.csproj -v minimalpassed: 1467 tests.TZ=UTC dotnet test ErsatzTV.Architecture.Tests/ErsatzTV.Architecture.Tests.csproj -v minimalpassed: 5 tests.git diff --checkpassed.Note: attempted
dotnet build ErsatzTV.sln -v minimalanddotnet build ErsatzTV/ErsatzTV.csproj -v minimal; both became silent/stuck in the local shell and the host build process was killed after process inspection. Project-level tests/builds above completed successfully.Docs
No docs updated; this is an ingestion behavior fix with no new operator-facing configuration.