Skip to content

Releases: rdpharr/jellyfin-plugin-localrecs

v0.6.1 — Jellyfin 10.11.9+ compatibility

30 May 19:57
b1c6a5d

Choose a tag to compare

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 the IUserManager.Users property in its EFCore refactor; all call sites now use GetUsers().
  • 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 0 no 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. The RewatchBoost setting becomes RecentWatchBoost (default 1.0; set 0 to 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

15 Apr 21:55

Choose a tag to compare

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 .strm files. Jellyfin 10.11.7 tightened its .strm parser 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.nfo is 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

  • ImageSyncService and its EnableImageSync / SyncBackdrops settings.
  • 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 symlink and the virtual libraries remain empty. See the README Troubleshooting section.

Closes #13

v0.5.3

24 Mar 00:07

Choose a tag to compare

Fixed

  • User Library Access Filtering (#10): Recommendations now respect per-user library access. Items from libraries a user cannot access (including disabled libraries) are excluded from both personalized and cold-start recommendation paths.

v0.5.2

08 Feb 22:58

Choose a tag to compare

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

06 Feb 15:29

Choose a tag to compare

Bug Fixes

  • Fixed: Partially watched series not included in watch history (#7) — UserProfileService now checks episode-level watch status for series instead of relying on userData.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) — PlayStatusSyncService now defers virtual library item removal until playback stops, instead of removing immediately on playback start. This was causing ResourceNotFoundException and foreign key constraint failures during active playback.

v0.5.0 - Image Sync for Custom Posters

28 Jan 20:02

Choose a tag to compare

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.jpg and backdrop.jpg to 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

28 Dec 19:48

Choose a tag to compare

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

  1. Add this repository URL to Jellyfin's plugin catalog:

    https://raw.githubusercontent.com/rdpharr/jellyfin-plugin-localrecs/main/manifest.json
    
  2. Go to Dashboard → Plugins → Catalog → Local Recommendations → Install

  3. Restart Jellyfin

  4. Follow the setup instructions in the plugin configuration page


Full Changelog

See CHANGELOG.md for details.

v0.3.0

28 Dec 01:06

Choose a tag to compare

What's Changed

Fixed

  • Series Filtering: Fully watched series no longer appear in recommendations. Previously relied on unreliable userData.Played flag; 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 ItemAdded event
  • 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 PlayStatusSyncService to 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

27 Dec 03:52

Choose a tag to compare

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

  1. Add this repository URL to your Jellyfin plugin repositories:
    https://raw.githubusercontent.com/rdpharr/jellyfin-plugin-localrecs/main/manifest.json
    
  2. Update the plugin from the plugin catalog
  3. Restart Jellyfin
  4. Run the Recommendation Refresh task to regenerate NFO files

See README for full setup instructions.

v0.2.0 - NFO Metadata and Trailer Support

27 Dec 03:29

Choose a tag to compare

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.strm files
  • 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

  1. Add this repository URL to your Jellyfin plugin repositories:
    https://raw.githubusercontent.com/rdpharr/jellyfin-plugin-localrecs/main/manifest.json
    
  2. Install "Local Recommendations" from the plugin catalog
  3. Restart Jellyfin

See README for full setup instructions.