Releases: rdpharr/jellyfin-plugin-localrecs
v0.6.1 — Jellyfin 10.11.9+ compatibility
Local Recommendations v0.6.1
Requires Jellyfin 10.11.9 or newer (targetAbi 10.11.9.0).
Fixed
- Jellyfin 10.11.9+ compatibility (#17, fixes #21) — the refresh, benchmark, setup, and play-status sync tasks no longer crash with
MissingMethodException: IUserManager.get_Users(). Jellyfin 10.11.9 removed theIUserManager.Usersproperty in its EFCore refactor; all call sites now useGetUsers(). - TV series recency (#19) — a series is now weighted by the date of its most recently watched episode instead of always being treated as watched today.
- Config page numeric fields (#22) — numeric settings saved as
0no longer revert to their defaults.
Changed
- Recent-watch emphasis replaces rewatch boost (#20) — the unreliable play-count rewatch boost is replaced by a recency-driven
decay²amplification. TheRewatchBoostsetting becomesRecentWatchBoost(default1.0; set0to disable).
Upgrade notes
- Not compatible with Jellyfin 10.11.0–10.11.8 (the
GetUsers()API doesn't exist there). Jellyfin will only offer this update to servers on 10.11.9+. - Recommendation ranking shifts on upgrade and regenerates on the next scheduled refresh.
Credits
Huge thanks to @PascalGodin, who contributed the bulk of this release (#17, #19, #20, #22). 🙏
Full changelog: https://github.com/rdpharr/jellyfin-plugin-localrecs/blob/main/CHANGELOG.md
v0.6.0 - Symlink-based virtual libraries
Fixes transcoded playback on Jellyfin 10.11.7+ by migrating from .strm files to filesystem symlinks (#13).
Changed
- Virtual libraries now use filesystem symlinks instead of
.strmfiles. Jellyfin 10.11.7 tightened its.strmparser as part of GHSA-j2hf-x4q5-47j3 and silently rejected local paths, breaking transcoded playback. Symlinks carry the source file's real extension so the media pipeline treats them as regular media. - Artwork is symlinked from the source folder (
poster.jpg,folder.jpg,fanart.jpg,backdrop.jpg, etc.) instead of copied. Custom artwork on source items propagates automatically. - Trailer discovery is delegated to Jellyfin's native scanner.
Fixed
tvshow.nfois written for series folders so Jellyfin identifies them as Series instead of rendering individual episodes as standalone items.- Series poster rendering via
BaseItem.GetImagePath(works for metadata-cache storage). - Per-user/per-item progress logs demoted from INFO to DEBUG.
Removed
ImageSyncServiceand itsEnableImageSync/SyncBackdropssettings.- Custom trailer scanning logic and the video-extension heuristic.
Upgrade notes
- Linux / Docker-on-Linux: no action required. Virtual libraries regenerate on the next scheduled refresh.
- Windows hosts: Jellyfin must run as Administrator or Windows Developer Mode must be enabled (Settings → Privacy & security → For developers). Without one of these, the plugin logs
Access denied creating symlinkand the virtual libraries remain empty. See the README Troubleshooting section.
Closes #13
v0.5.3
v0.5.2
Fix playback freeze from recommendation libraries (#8)
Fixed
- Playing items from recommendation libraries no longer freezes playback. The plugin was causing a storm of database writes every ~10s during active playback.
Changed
- Virtual library items are never removed from event handlers — watched items stay until the next scheduled refresh
- Only meaningful events (PlaybackFinished, TogglePlayed, etc.) trigger sync; playback progress is ignored
- Removed dead removal code and reduced log noise
Known Issues
- Partially watched recommendations may appear twice in "Continue Watching" / "Next Up" until the next refresh. Trigger a manual refresh from Scheduled Tasks to clear sooner.
v0.5.1
Bug Fixes
- Fixed: Partially watched series not included in watch history (#7) —
UserProfileServicenow checks episode-level watch status for series instead of relying onuserData.Played(which only becomes true when ALL episodes are watched). This was causing all users to receive identical cold-start recommendations instead of personalized ones. - Fixed: Playback from recommendations crashes with database failures (#8) —
PlayStatusSyncServicenow defers virtual library item removal until playback stops, instead of removing immediately on playback start. This was causingResourceNotFoundExceptionand foreign key constraint failures during active playback.
v0.5.0 - Image Sync for Custom Posters
Image sync for custom posters and backdrops
This release preserves user-customized images (posters, backdrops) in recommendation libraries.
What's New
- Custom poster preservation - Posters set on source library items are now copied to recommendation libraries
- Backdrop sync - Background/fanart images are also synced (configurable)
- Configuration options - Enable/disable image sync and backdrop copying from plugin settings
Why This Matters
Previously, users who customized their posters (e.g., French posters, custom artwork) would see default TMDB/TVDB images in their recommendation libraries. This fix ensures your customizations are preserved.
Technical Details
- Copies
poster.jpgandbackdrop.jpgto virtual library folders - Graceful handling of missing images (won't fail the sync)
- Respects original file formats (jpg/png/webp)
Fixes #6
v0.4.0 - Decade-Based Temporal Similarity
What's New
🎯 Decade-Based Temporal Similarity
Recommendations now consider content from similar time periods! Instead of continuous year normalization, the plugin uses categorical decade grouping (1980s, 1990s, 2000s, etc.) to improve temporal relevance.
Impact:
- 24% of movie recommendations changed with decade feature
- 8% of TV recommendations changed
- ~12 decades extracted from production library (970 items)
- Temporal similarity now works alongside existing genre/actor/director features
🐛 Bug Fix
- In-Progress Series Filtering: TV series with unwatched episodes no longer appear in recommendations (prevents recommending shows you're currently watching)
Installation
-
Add this repository URL to Jellyfin's plugin catalog:
https://raw.githubusercontent.com/rdpharr/jellyfin-plugin-localrecs/main/manifest.json -
Go to Dashboard → Plugins → Catalog → Local Recommendations → Install
-
Restart Jellyfin
-
Follow the setup instructions in the plugin configuration page
Full Changelog
See CHANGELOG.md for details.
v0.3.0
What's Changed
Fixed
- Series Filtering: Fully watched series no longer appear in recommendations. Previously relied on unreliable
userData.Playedflag; now queries for unwatched episodes directly - Play Status Sync: Virtual library items now correctly reflect source library watch status when scanned by Jellyfin
Added
- Play Status Sync on Item Add: When Jellyfin scans new virtual library items, their play status is automatically synced from the source library via
ItemAddedevent - Play Status Sync on Startup: Existing virtual library items sync play status from source library when plugin initializes
- Rating Proximity Scoring: Optional feature to boost recommendations with similar community/critic ratings to user's watched content
Changed
- Refactored
PlayStatusSyncServiceto reduce code duplication with extracted helper methods - Reduced debug logging noise in production for cleaner logs
Removed
- NFO File Generation: Removed NFO metadata files as Jellyfin doesn't read NFO files for .strm content (metadata comes from the source library item)
Full Changelog: v0.2.1...v0.3.0
v0.2.1 - Fix NFO Metadata Parsing
What's Fixed
This release fixes Issue #2 - virtual library items now display complete metadata matching the source library.
Fixed
- NFO Encoding: Fixed XML encoding from UTF-16 to UTF-8 so Jellyfin properly parses metadata (runtime now displays correctly)
- Cast & Crew: NFO files now include actors with roles, directors, and writers from source media
- Stream Details: NFO files now include video/audio/subtitle stream information for proper stream selector display
Added
- FileInfo Section: NFO files now contain
<fileinfo><streamdetails>with:- Video: codec, bitrate, resolution, aspect ratio, framerate, scan type, duration
- Audio: codec, channels, sample rate, language
- Subtitles: language, default/forced flags
Installation
- Add this repository URL to your Jellyfin plugin repositories:
https://raw.githubusercontent.com/rdpharr/jellyfin-plugin-localrecs/main/manifest.json - Update the plugin from the plugin catalog
- Restart Jellyfin
- Run the Recommendation Refresh task to regenerate NFO files
See README for full setup instructions.
v0.2.0 - NFO Metadata and Trailer Support
What's New
Added
- NFO Metadata Support: Virtual library items now include NFO files with full metadata (runtime, ratings, genres, studios, tags, provider IDs)
- Local Trailer Support: Trailers from source media are now linked in virtual libraries using
-trailer.strmfiles - Movie Folder Structure: Movies now use proper folder structure with NFO files for better metadata support
Fixed
- Copy buttons on setup page now work with fallback clipboard support for broader browser compatibility
- Manifest now correctly references ZIP file instead of raw DLL
Changed
- Improved README with detailed installation instructions and algorithm documentation
- Simplified bug report template
Installation
- Add this repository URL to your Jellyfin plugin repositories:
https://raw.githubusercontent.com/rdpharr/jellyfin-plugin-localrecs/main/manifest.json - Install "Local Recommendations" from the plugin catalog
- Restart Jellyfin
See README for full setup instructions.