feat-recs - Moonbase + Jellyfin 12 Super Search - #278
Merged
RadicalMuffinMan merged 3 commits intoSep 8, 2026
Merged
Conversation
…th full library scoring and stock bypass
- Implement MoonfinSimilarItemsProviderManager using dynamic Reflection.Emit
to implement Jellyfin 12's ILocalSimilarItemsProvider interface at runtime.
This allows Moonfin Recommends to compile cleanly against net8.0 without
breaking on older Jellyfin versions.
- Implement MoonfinSimilarItemsService with 9-factor scoring (genres, tags,
actors, directors, writers, studios, release year, community rating, premiere date).
- Support full library scoring on the server side without artificial candidate
caps, leveraging in-process SQLite indexes and Jellyfin 12's 24-hour disk/memory
cache (SimilarItemsManager.TryReadSimilarItemsCacheAsync).
- Add support for bypass=moonfin query parameter, enabling direct invocation
of stock Jellyfin providers with boosted candidate limits (5,000) so stock
recommendations do not starve after played/permission filtering.
- Add GET /Moonfin/Items/{itemId}/Similar endpoint and announce
recommendationsSupported capability flag in /Moonfin/Ping.
Build SuccessfulBoth plugins compiled against .NET 8, and both test suites passed.
|
…n with IsAssignableFrom Ensure stock provider invocation checks whether the provider type implements ILocalSimilarItemsProvider before attempting to invoke interface methods, preventing TargetException when iterating third-party or non-local similarity providers.
This was referenced Sep 8, 2026
…access, preserve the stock providers when registering Moonfin ahead of them, cache the reflection lookups at emit time, use GetPeopleByItems on Jellyfin 12 with per-item reads as the fallback, and add the RecommendationsProviderEnabled toggle plus scoring tests.
RadicalMuffinMan
added a commit
that referenced
this pull request
Sep 9, 2026
…Ping, and send UserData on Moonfin cards
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.
Pull Request
Summary
Implements native support for Jellyfin 12's new extensible recommendation provider backend (
ILocalSimilarItemsProvider) in Moonbase. This enables Jellyfin 12 servers running Moonbase to register "Moonfin Recommends" directly into Jellyfin's similarity pipeline with built-in server-side 24-hour disk/memory caching (SimilarItemsManager.TryReadSimilarItemsCacheAsync).Additionally, this PR provides:
bypass=moonfinquery parameters, allowing Moonfin clients to selectively invoke Jellyfin's stock recommendation engine with a boosted candidate pool (5,000 items) so stock similarity does not starve from played/permission filtering.GET /Moonfin/Items/{itemId}/Similarendpoint andrecommendationsSupportedcapability flag in/Moonfin/Pingfor clean client auto-detection.Related Issues
Link related issues or tickets separated by commas.
Type of Change
Area
Changes Made
List the key changes included in this PR.
TypeBuilder). This dynamically defines and registers anILocalSimilarItemsProviderimplementation if running on Jellyfin 12 without hard compile-time dependencies that would break backwards compatibility on Jellyfin 10.x.Limit = 50) on the server. Because Moonbase runs in-process with direct access to SQLite and Entity Framework Core indexes, candidate gathering across the entire library executes in milliseconds. The resulting scored list is cached by Jellyfin 12'sSimilarItemsManagerfor 24 hours, making repeat queries instant (< 5 ms).bypass=moonfin, Moonbase directly delegates to stock Jellyfin providers while boosting the internal candidate query limit to 5,000, preventing Jellyfin's stockTake(limit)from prematurely starving candidate pools in libraries where users have already watched many matching titles.GET /Moonfin/Items/{itemId}/Similarin MoonfinController.cs and announcedrecommendationsSupported = truein/Moonfin/Pingvia PluginServiceRegistrator.cs.Client Impact
Does this need matching changes in a client repo (Core, Smart-TV, Roku)?
Compatibility
bool?, an int toint?)Testing
Describe how this change was tested.
Test Steps
ILocalSimilarItemsProvider.GET /Moonfin/Items/{id}/Similardirectly to verify 9-factor scored output for movies and series.GET /Items/{id}/Similar?bypass=moonfinto verify clean delegation to stock Jellyfin similarity.mfdbW -q) and verified all recommendation sources ("Moonfin Recommends", "Jellyfin Recommends", "TMDb Similarity") render distinct, full lists on both Home screen rows and Details pages.Screenshots (if applicable)
Include config page screenshots or request/response samples where relevant.
Moonfin Recommends as Vanilla Search Provider!
Checklist