A Jellyfin plugin that automatically updates your Sonarr and Radarr monitoring based on what you watch. Keep your media organised and automatic without manual intervention.
- Automatic Episode Monitoring: Monitors next N episodes after watching
- Smart File Detection: Skip re-downloading episodes that already exist
- Season Control: Limit monitoring to current season only
- Dynamic Buffer: Maintains minimum unwatched episode queue
- Automatic Search: Triggers Sonarr searches for newly monitored episodes
- Future Episode Monitoring: Automatically monitor episodes when they air
- Automatic Movie Unmonitoring: Unmonitor movies after watching
- Percentage-Based Logic: Only unmonitor if watched past configurable threshold (default 90%)
- Quality Cutoff Checking: Only unmonitor movies that have reached their quality target
- Upgrade Prevention: Keep monitoring movies that can still be upgraded
- Execute Python scripts on Jellyfin events
- Flexible event triggers (PlaybackStart, PlaybackStop, etc.)
- Custom environment variables and data attributes
- Conditional execution based on media properties
- Encrypted API Keys: Automatic AES-256 encryption for Sonarr/Radarr API keys
- Test Connections: Built-in connection testing for API endpoints
- Server-Bound Encryption: API keys encrypted with Jellyfin server-specific keys
- System-Independent: Encryption survives OS updates, machine renames, and user changes
- Jellyfin: 10.10.0 or higher
- Sonarr: v3 API (optional)
- Radarr: v3 API (optional)
- Open Jellyfin Dashboard → Plugins → Repositories
- Add repository:
https://raw.githubusercontent.com/caleb-venner/jellypy/main/manifest.json - Go to Catalog → Search "JellyPy"
- Click Install → Restart Jellyfin
- Download the latest
Jellyfin.Plugin.JellyPy.dllfrom Releases - Copy to your Jellyfin plugins directory;
- Linux:
/var/lib/jellyfin/plugins/Jellypy/ - Windows:
C:\ProgramData\Jellyfin\Server\plugins\Jellypy\ - Docker:
/config/data/plugins/Jellypy/
- Linux:
- Restart Jellyfin
For script execution features, use the linuxserver.io Jellyfin image with Python support enabled.
Docker Compose Example:
services:
jellyfin:
image: lscr.io/linuxserver/jellyfin:latest
container_name: jellyfin
environment:
- PUID=1000
- PGID=1000
- TZ=Australia/Sydney
- DOCKER_MODS=linuxserver/mods:universal-package-install
- INSTALL_PIP_PACKAGES=requests
volumes:
- /path/to/config:/config
- /path/to/media:/data
ports:
- 8096:8096
restart: unless-stoppedDocker Run Example:
docker run -d \
--name=jellyfin \
-e PUID=1000 \
-e PGID=1000 \
-e TZ=Australia/Sydney \
-e DOCKER_MODS=linuxserver/mods:universal-package-install \
-e INSTALL_PIP_PACKAGES=requests \
-p 8096:8096 \
-v /path/to/config:/config \
-v /path/to/media:/data \
--restart unless-stopped \
lscr.io/linuxserver/jellyfin:latestConfiguration Options:
• DOCKER_MODS: Enables package installation support
- Use
linuxserver/mods:universal-package-installfor most systems - For Intel hardware transcoding:
linuxserver/mods:jellyfin-opencl-intel|linuxserver/mods:universal-package-install
• INSTALL_PIP_PACKAGES: Comma-separated list of Python packages to install
- Example:
requests,discord.py,pyyaml - Packages install automatically on container start
Note: The linuxserver.io image includes Python 3 by default. The universal-package-install mod enables pip package installation for your custom scripts.
-
Navigate to Dashboard → Plugins → JellyPy → Settings → Native Integration
-
Configure Sonarr:
Enable Sonarr Integration: ✓ Sonarr URL: http://localhost:8989 Sonarr API Key: [Your API Key from Sonarr → Settings → General → Security] -
Click Test Sonarr Connection to verify your settings
-
Configuration Options:
Setting Default Description Episodes to Monitor 5 Number of upcoming episodes to keep monitored Auto-Search Episodes ✓ Automatically trigger searches for monitored episodes Monitor Future Episodes ✓ Auto-monitor episodes when they become available Skip Episodes With Files ✓ Don't re-monitor episodes that already have files Unmonitor Watched Episodes ✓ Unmonitor episodes after watching them Monitor Only Current Season ✗ Only monitor episodes in the current season Minimum Episode Buffer 2 Minimum unwatched episodes to maintain
-
Navigate to Dashboard → Plugins → JellyPy → Settings → Native Integration
-
Configure Radarr:
Enable Radarr Integration: ✓ Radarr URL: http://localhost:7878 Radarr API Key: [Your API Key from Radarr → Settings → General → Security] -
Click Test Radarr Connection to verify your settings
-
Configuration Options:
Setting Default Description Unmonitor Watched Movies ✓ Set movies to unmonitored after watching Unmonitor Only If Watched ✗ Only unmonitor if watch percentage exceeds threshold Minimum Watch Percentage 90% Percentage required to consider movie "watched" Unmonitor After Quality Cutoff ✗ Only unmonitor movies at their quality target
For detailed script execution usage, refer to the Script Execution Usage Guide.
When you watch an episode:
- Current episode is unmonitored (if enabled)
- Plugin calculates next episodes to monitor based on:
- Episode buffer setting
- Minimum unwatched episode count
- Season filtering (if enabled)
- Existing file check (if enabled)
- Next N episodes are monitored in Sonarr
- Automatic searches are triggered (if enabled)
- Future episodes are set to auto-monitor (if enabled)
Example Workflow:
You watch: The Office S03E05
Result:
- S03E05 unmonitored
- S03E06, S03E07, S03E08, S03E09, S03E10 monitored
- Searches triggered for episodes without files
- Future episodes set to auto-monitor when released
When you finish watching a movie:
- Plugin calculates watch percentage (position ÷ runtime)
- Checks if percentage meets threshold (default 90%)
- If "Unmonitor After Quality Cutoff" enabled:
- Queries Radarr for movie quality details
- Checks if current file quality meets cutoff
- Keeps monitoring if upgrade possible
- Unmonitors movie in Radarr if all checks pass
Example Workflow:
You watch: The Matrix (1999) - 85% complete
Result: Movie stays monitored (below 90% threshold)
You watch: The Matrix (1999) - 95% complete
Result:
- Check quality: 1080p Bluray vs cutoff (1080p)
- Quality met → Movie unmonitored
- Prevents unnecessary upgrade searches
- Watch S01E01 of a new show
- Plugin automatically queues next 5 episodes
- Continue watching seamlessly
- Disable "Skip Episodes With Files"
- Re-monitor episodes for quality upgrades
- Sonarr automatically upgrades to better quality
- Watch movies from your library
- Movies automatically unmonitor after watching
- Only keep unwatched movies monitored
- Reduce unnecessary Radarr activity
-
Check Jellyfin Logs:
Dashboard → Logs → Filter: "JellyPy"Look for configuration errors or API connection issues
-
Verify API Keys:
- Test in Sonarr/Radarr directly
- Check network connectivity from Jellyfin server
-
Confirm Integration Enabled:
- Native Integration tab → Checkboxes enabled
- URLs correctly formatted (include http://)
- Verify "Episodes to Monitor" > 0
- Check "Skip Episodes With Files" setting
- Ensure series exists in Sonarr
- Check Sonarr logs for API errors
- Verify "Unmonitor Watched Movies" enabled
- Check watch percentage in logs
- Confirm movie exists in Radarr
- Review quality cutoff settings if enabled
Enable verbose logging:
Dashboard → Plugins → JellyPy → Global Settings
Enable Verbose Logging: ✓
Contributions welcome! Please:
- Fork the repository
- Create a feature branch
- Make your changes with tests
- Submit a pull request
This project is licensed under the GNU General Public License v3.0 - see LICENSE file for details.
Why GPLv3? Jellyfin is licensed under GPLv3, and to ensure compatibility and maintain the free and open-source nature of the ecosystem, this plugin uses the same license.
