Package Exports
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (unwatched-jellyfin) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
unwatched-jellyfin
A CLI tool to identify and optionally delete old, unwatched TV series from Sonarr based on Jellyfin playback data.
Features
- Identifies series with 0% watched episodes older than a threshold (default: 365 days)
- Calculates disk space that would be freed
- Deletes episode files from Sonarr (not entire series)
- Unmonitors series to prevent re-downloading
- Dry-run mode for safe testing
Installation
bun installUsage
Via npx (recommended):
# Dry run (default) - shows what would be deleted
npx unwatched-jellyfin --dry-run
# Execute deletions with custom age threshold
npx unwatched-jellyfin --days=180 --execute
# Show help
npx unwatched-jellyfin --helpVia bun run (for development):
bun run index.ts --help
bun run index.ts --days=365 --dry-run
bun run index.ts --executeCLI Options
--sonarr-url <url>- Sonarr server URL (default: SONARR_URL env var)--sonarr-api-key <key>- Sonarr API key (default: SONARR_API_KEY env var)--jellyfin-url <url>- Jellyfin server URL (default: JELLYFIN_URL env var)--jellyfin-username <user>- Jellyfin username (default: JELLYFIN_USERNAME env var)--jellyfin-password <pass>- Jellyfin password (default: JELLYFIN_PASSWORD env var)--days <number>- Age threshold in days (default: 365)--dry-run, -d- Dry run mode (default)--execute, -e- Execute deletions (not dry run)--help, -h- Show help message
Environment Variables
All sensitive credentials can be set via environment variables (see .env.example for template):
SONARR_URL- Sonarr server URLSONARR_API_KEY- Sonarr API keyJELLYFIN_URL- Jellyfin server URLJELLYFIN_USERNAME- Jellyfin usernameJELLYFIN_PASSWORD- Jellyfin passwordAGE_THRESHOLD_DAYS- Age threshold in days (default: 365)DRY_RUN- Set to "false" to execute deletions (default: "true")
How It Works
- Authenticates with Jellyfin to fetch all episodes and their watch status
- Groups episodes by series to identify fully unwatched series (0% watched)
- Filters series where the oldest episode is older than the threshold
- Cross-references with Sonarr to find matching series
- Calculates disk space that would be freed
- If not dry-run: deletes all episode files and unmonitors each series
Requirements
- Bun runtime
- Jellyfin server with Playback Reporting plugin (or standard API)
- Sonarr server
License
MIT