feat-recs - Incorporate JF12's Jellyfin Recommends and Speedy Server-Side Scoring (take 2) - #1456
Open
mattsigal wants to merge 5 commits into
Open
Conversation
mattsigal
force-pushed
the
feature/recommendations-unified-v2
branch
from
September 8, 2026 19:02
01a3a6f to
9f731f7
Compare
✅ Build SuccessfulAll platform builds and tests passed. You can download the test artifacts below. Tests ✅ 2039 passed, analyzer clean
|
…items pro…" This reverts commit e6752b5.
…ion engines regardless of toggle state.
…e starvation In Jellyfin 12, MovieSimilarItemsProvider applies Take(limit) to raw score matches before evaluating library membership and filtering played titles (IsPlayed = false). When querying with low limits (e.g. 30 for home rows or 15 on detail pages), the candidate pool is prematurely starved, often yielding only 1-4 accessible titles in real-world libraries. - Increase query limit to 100 for server similarity queries in RowDataSource and ItemDetailViewModel. - Update PluginSyncService.fetchSimilarItems default to 100 so server-side scoring via Moonbase returns a full set of recommendations. - Preserve bounded client-side candidate limits (40 per genre/tag, 10 per person) for local fallback when Moonbase is not installed, preventing network and memory exhaustion on constrained client devices.
In app_fi.arb, Weblate translated the ICU plural keyword 'other' to Finnish 'muu' in queuedMoreCount, causing flutter gen-l10n to fail across all CI build jobs with: "ICU Syntax Error: Plural expressions must have an 'other' case."
mattsigal
force-pushed
the
feature/recommendations-unified-v2
branch
from
September 8, 2026 19:40
16e0394 to
d8b9ce5
Compare
34 tasks
This was referenced Sep 8, 2026
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
JF12 did a lot of neat things with their recommendation system. This PR unifies the recommendation system source nomenclature across the Item Details screen and the "Since You Watched" home screen rows, introduces native support for Jellyfin 12's extensible similar items backend (
GET /Items/{id}/Similar), and adds client-side capability auto-detection for server-backed recommendations via Moonbase with graceful fallback to local client scoring. What this means is that if Moonbase is installed and the server is running JF12, we can fully utilize the new pathing for super quick recommendation results without straining clients. If Moonbase isn't installed or the server is not on JF12 yet, we have the following fallbacks:Related Issues
Link related issues or tickets separated by commas.
Type of Change
Changes Made
List the key changes included in this PR.
serversource handling to item_detail_view_model.dart and row_data_source.dart calling nativeGET /Items/{id}/Similar, utilizing Jellyfin 12's extensibleISimilarItemsProviderpipeline and built-in server disk/memory caching (TryReadSimilarItemsCacheAsync).recommendationsSupportedfrom/Moonfin/Ping. When "Moonfin Recommends" is chosen and connected to a server running Moonbase with the similar items provider active, recommendations are automatically offloaded to the server for near-instant response times; if the server lacks the capability, returns empty, or encounters errors, it seamlessly falls back to our client-side Dart scoring algorithm with zero disruption.dateCreatedgetter in aggregated_item.dart that was blocking test compilation.recommendationSystemJellyfinkey to app_en.arb and regenerated localization files across all supported languages.2nd Commit: Note a second commit was also made to this PR which does the following:
${client.baseUrl}/Moonfin/Items/$itemId/Similar.bypass: 'moonfin'when querying Jellyfin stock similarity.Basically, Jellyfin treats its stock suggestions as a "fallback" only if a custom one isn't selected. Since we want to give an option, it is important to allow the fetch to bypass Moonfin's algorithm.
3rd Commit: Candidate Pool Scaling for Server-Side Recommendations
MovieSimilarItemsProviderappliesTake(limit)to raw candidate score matches before filtering by library membership and played status (IsPlayed = false). In real-world libraries where users have watched many relevant movies, low query limits (such as 30 for home rows or 15 on details pages) severely starve the candidate pool down to 1–4 items.100in row_data_source.dart, item_detail_view_model.dart, and plugin_sync_service.dart.limit: 40per genre/tag,10per person) for the pure local fallback when Moonbase is not installed, preventing heavy network payloads on client devices while ensuring server-backed recommendations deliver full, rich rows.Platform
Testing
Describe how this change was tested.
Test Steps
Screenshots (if applicable)
Include screenshots or recordings for UI changes.
Previous Menus
Post-PR Menus
Jellyfin Recommends Search Results (with filter for "include previous watched items" OFF)
Jellyfin Recommends Search Results (with filter for "include previous watched items" ON)
Checklist