Features
-
Download Integration Modes: Complete overhaul of download system with three pluggable integration modes
- Native Mode (default): Direct Radarr/Sonarr API integration for granular control
- Jellyseerr Mode: Centralized request management with approval workflows and multi-user tracking
- Webhook Mode: Custom HTTP webhooks for complete flexibility and external system integration
- Factory pattern (
DownloadProviderFactory) selects provider based on configuration - All modes support anime detection and per-season TV downloads
-
Jellyseerr Integration: Full integration with Jellyseerr request management system
- Automatic user import: Jellyfin users auto-imported to Jellyseerr on first request with REQUEST-only permissions
- Per-user attribution: All requests tracked per-user via
X-Api-Userheader - Approval workflows: Respects Jellyseerr approval settings and request quotas
- Configuration modes:
- Default mode: Uses Jellyseerr's default Radarr/Sonarr server and profile settings
- Manual mode: Explicit server and profile selection from UI dropdowns
- Server/profile selection: UI dynamically loads Radarr/Sonarr servers and quality profiles from Jellyseerr
- Anime support: Optional separate anime profile for TV shows detected via Trakt genres
- GUID normalization: Handles UUID format differences between Jellyseerr (no hyphens) and Jellyfin (standard format)
- Connection testing: Test Jellyseerr connection and validate API key from plugin settings
- New service:
JellyseerrServicefor API communication - New controller:
JellyseerrControllerfor UI configuration - New models:
MediaRequest,JellyseerrUser,RadarrServer,SonarrServer,QualityProfile
-
Webhook Integration: Custom HTTP webhook support for external integrations
- Flexible HTTP methods: GET, POST, PUT, PATCH support
- Dynamic placeholders: Replace variables in URLs, headers, and payloads
- Movies:
{tmdbId},{imdbId},{title},{year},{jellyfinUserId} - TV Shows: All movie placeholders +
{tvdbId},{seasonNumber},{isAnime}
- Movies:
- Custom headers: Add authentication, API keys, or any custom headers with placeholder support
- JSON payload templates: Fully customizable request body with default templates included
- Separate configurations: Independent settings for movies vs TV shows
- Use cases: Discord/Slack notifications, custom download systems, third-party automation
- New service:
WebhookDownloadProviderimplementingIDownloadProvider - New configuration fields:
WebhookMovieUrl,WebhookShowUrl,WebhookMethod,WebhookMovieHeaders,WebhookShowHeaders,WebhookMoviePayload,WebhookShowPayload - New model:
WebhookHeaderfor custom header configuration - Comprehensive documentation: New
WEBHOOK.mdguide with examples and troubleshooting
Improvements
-
Download Provider Architecture: Pluggable provider system for extensibility
IDownloadProviderinterface defines contract for all download providersNativeDownloadProvider: Implements direct Radarr/Sonarr integrationJellyseerrDownloadProvider: Implements Jellyseerr API integrationWebhookDownloadProvider: Implements custom HTTP webhook integrationDownloadProviderFactory: Factory pattern selects provider based onDownloadIntegrationenumPlaybackInterceptoruses factory to route download requests
-
Configuration UI Enhancements: Redesigned download integration section
- Visual integration selector: Card-based UI with icons and descriptions for each mode
- Dynamic sections: UI shows/hides relevant settings based on selected integration mode
- Webhook UI: Interactive payload editors with placeholder insertion buttons
- Header management: Add/remove custom headers dynamically for webhook requests
- Payload reset: Quick reset to default payload templates
- Real-time validation: Client-side validation for URLs, headers, and JSON payloads
-
Documentation: Comprehensive guides for all integration modes
- Updated README.md with three integration modes in setup guide
- New WEBHOOK.md with complete webhook integration guide including:
- Configuration examples (GET, POST, authentication, Discord/Slack)
- Building custom webhook endpoints (Python Flask, Node.js Express)
- Troubleshooting guide
- Security considerations
- Advanced usage patterns
- Updated CLAUDE.md with download provider architecture
- FAQ updates covering all three integration modes
Technical Changes
- New enum:
DownloadIntegrationTypewith values:Native = 0,Jellyseerr = 1,Webhook = 2 - Configuration migration: Changed from
UseJellyseerrboolean toDownloadIntegrationenum (backward compatible) - Service registration: All download providers registered in
PluginServiceRegistrator - API Controllers:
JellyseerrController: Connection testing, server/profile retrieval- Enhanced error handling and logging across all providers
- Models:
MediaRequest: Jellyseerr request model with media IDs and user trackingJellyseerrUser: User model for auto-import functionalityRadarrServer/SonarrServer: Server configuration modelsWebhookHeader: Custom header model for webhook requests
- HTTP Client: All providers use
NamedClient.Defaultfor Cloudflare bypass compatibility