Releases: unshackle-dl/unshackle
Releases · unshackle-dl/unshackle
Release list
5.3.0
Features
--merge-video: merge video language variants into one MKV per (resolution, range, codec) group- Native ExpressVPN HTTPS proxy provider (full OAuth PKCE flow, no external tools)
- Proton VPN proxy provider with country/city/server-number selection, plus ProtonVPN TV-code login
- Load service plugins from git repos (clone + TTL-pull cache,
refresh-servicescommand, dirty-clone guard) - Python 3.14 support (supported range widened to 3.11-3.14)
- Automatic Firefox cookie and localStorage extraction
- Nested directories in folder templates (
/treated as path separator) air_datefor date-based episode naming (daily/sports content named by date instead of SxxExx)- Per-vault network timeout for remote API/HTTP vaults
- Richer API job progress: active-track segment counts, transfer speed, title description/date/cover_url
Bug Fixes
- drm: don't switch to a mismatched CDM type during licensing; raise a clear error instead
- config: match per-service cdm keys case-insensitively
- dl: apply per-service decryption tool override before decrypt
- hls: stream segment merges to avoid OOM on large (multi-GB) tracks
- console: pause active live/spinner contexts during terminal input so prompts stay visible
- output: treat both
/and\as folder separators on any OS - env: only resolve
Pathitems in directory lists (git repo specs pass through)
Performance & Changes
- perf(hls): rename single decrypted range instead of re-copying a full track
- perf(tracks): skip redundant DV/VUI bitstream passes when VUI already matches range
- api: collapse route registration, dedup handlers, remove dead serve/remote code paths
Full Changelog: https://github.com/unshackle-dl/unshackle/blob/main/CHANGELOG.md
5.1.0
Features
- ip-info: Consolidate IP lookup, add ipinfo.io token support
- dl: Cache content keys in-memory to skip duplicate license requests
- mux: Add muxing.default_language to override default track per type
- hls: Detect DV-composite tracks and restore signaling post-mux
- video: Normalize SPS VUI to match manifest-derived range
- api: Sync /api/download with dl CLI flags and add serve.* defaults
- vaults: Tolerate vault failures during key get/add
- tracks: Configurable audio codec priority for tie-breaking
- dl: Live countdown for --slow delay
- dl: Gate s_lang/a_lang miss behind --best-available
- dl: Add real bitrate probing (-rvb/-rab)
- import: Reconstruct downloads from an --export sidecar
- naming: Per-service title_map remapping
- import: Include cover-art attachments in --export/--import
Bug Fixes
- manifests: Clean stale .!dev resume markers before merge
- sanitize: Preserve parentheses, strip unidecode bracket artifacts
- tracks: Honor --worst in hybrid range selection
- dl: Re-pick DV/HDR10 when HYBRID falls back under best_available
- proxies/nordvpn: Use *.proxy.nordvpn.com for HTTPS proxy
- template_formatter: Preserve dash separator around empty conditional
- dl: Prefer Atmos in -l best/all language selection
- title: Detect Atmos across all audio tracks for filename template
- title: Use original-language audio for filename metadata
- service: Render request_input prompt via rich console
- titles: Normalize odd resolutions in filename quality token
- api: Propagate Click default=None through service instantiation
- api: Load real CDM for service init in list/session/download flows
- vaults: Enable WAL on SQLite vault to fix concurrent locks
- hybrid: Correct static L6 source and reset stale L5 active area
- cli: Report broken command/service loads once and cleanly
- hls: Resolve per-rendition KID in no-EXT-X-KEY fallback
- dash: Inherit SegmentTemplate attributes across AdaptationSet/Representation
- dl: Mux all requested ranges and select highest DV alongside hybrid
- session: Proxy auth on http targets and string params support
Documentation
- Update docs to match current codebase
- output: Document muxing.default_language override
- Simplify README with demo and requirements
Changes
- routes, subtitle, track: Improve code readability by formatting list structures
- hybrid: Extract dovi_tool and run_step helpers
- ip_info: Simplify lookup and trim cache
- example: Showcase full unshackle feature surface
- dl: Declare hybrid_base_only flag and extract standalone mux helper
- Remove dead aria2c and n_m3u8dl_re downloader code
Maintenance
- pre-commit: Update hook versions in .pre-commit-config.yaml
4.0.0
Features
- hybrid: Add L5 active area and dynamic L6 luminance metadata
- debug: Add JSONL debug logging to decryption, muxing, and all downloaders
- debug: Log binary tool versions at session start
- dl: Add --repack flag to insert REPACK tag in output filenames
- core: Add TrackRequest system for multi-codec/multi-range support
- dl: Add --output option to override download directory
- tracks: Add edition tags to output filenames
- templates: [breaking] Add customizable output filename templates
- templates: Add configurable language tagging rule engine
- Update unshackle version to 4.0.0
- dl: Add --animeapi and --enrich options for anime metadata and tagging
- dl: Add skip messages for --no-audio and --no-chapters flags
- dl: Extract closed captions from HLS manifests and improve CC extraction
- dl: Add --worst flag and SHIELD OkHttp fingerprint preset
Bug Fixes
- n_m3u8dl_re: Pass all content keys for DualKey DRM decryption
- hybrid: Skip bitrate filter for DV tracks in HYBRID mode
- attachment: Sanitize filenames with illegal Windows characters
- hybrid: Accept HDR10+ tracks as valid base layer for HYBRID mode
- dl: Allow selection of audio tracks for 'all' languages in addition to 'best'
- dl: Overwrite existing files on re-download and use atomic replace
- dl: Handle cross-device moves when temp and downloads differ
- track: Fallback to requests downloader from n_m3u8dl_re for unsupported track types
- n_m3u8dl_re: Disable segment count validation for duration-based DASH
- Correct formatting and add missing newlines in selector and EXAMPLE service
- dependencies: Update pyplayready version to 0.8.3 and adjust dependencies
- drm: Update PlayReady KID extraction for pyplayready 0.8.3 compatibility
- api: Resolve Sentinel serialization, missing params, and add search endpoint
- dash: Pass period_filter to n_m3u8dl_re via filtered MPD file
- title: Add HDR Vivid Format HDR Tag
- ism: Prevent duplicate track IDs for audio tracks with same lang/codec/bitrate
- aria2c: Correct progress bar tracking for HLS downloads
- dl: Filter CC subtitle languages with --s-lang and extract all manifest CCs
Documentation
- Update and correct configuration documentation
Changes
- hybrid: Replace log.info with console status and add JSONL debug logging
- dl: Remove legacy multi-fetch loop for unmigrated services
- example: Migrate EXAMPLE service to track_request pattern
- providers: Extract metadata providers into modular system
3.0.0
[3.0.0] - 2026-02-15
Features
- Merge upstream dev branch
- titles: Use track source attribute for service name in filenames
- debug: Add download output verification logging
- Gluetun VPN integration and remote service enhancements
- gluetun: Improve VPN connection display and Windscribe support
- serve: Add PlayReady CDM support alongside Widevine
- cdm: Add remote PlayReady CDM support via pyplayready RemoteCdm
- env: Add ML-Worker binary for DRM licensing
- video: Detect interlaced scan type from MPD manifests
- drm: Add MonaLisa DRM support to core infrastructure
- audio: Codec lists and split muxing
- proxy: Add specific server selection for WindscribeVPN
- cdm: Normalize CDM detection for local and remote implementations
- HLS: Improve audio codec handling with error handling for codec extraction
- tracks: Prioritize Atmos audio tracks over higher bitrate non-Atmos
Bug Fixes
- subs: Update SubtitleEdit CLI syntax and respect conversion_method
- n_m3u8dl_re: Include language in DASH audio track selection
- hls: Prefer media playlist keys over session keys for accurate KID matching
- deps: Upgrade vulnerable dependencies for security alerts
- serve: Use correct pywidevine users config format
- cdm: Correct error key casing in Decrypt Labs API response parsing
- api: Validate Bearer prefix before extracting API key
- serve: Correct PlayReady RemoteCDM server validation
- n_m3u8dl_re: Remove duplicate --write-meta-json argument causing download failures
- manifests: Correct DRM type selection for remote PlayReady CDMs
- proxies: Fixes WindscribeVPN server authentication
- subs: Route pycaption-unsupported formats to pysubs2 in auto mode
- proxy: Remove regional restrictions from WindscribeVPN
- proxy: Collect servers from all locations in WindscribeVPN
- downloader: Correct progress bar tracking for segmented downloads
- binaries: Search subdirectories for binary files
- dash: Handle high startNumber in SegmentTimeline for DVR manifests
- drm: Hide Shaka Packager message for MonaLisa decryption
- dash: Add CENC namespace support for PSSH extraction
- dash: Preserve MPD DRM instead of overwriting from init segment
- subtitles: Preserve sidecar originals
- mux: Avoid audio codec suffix on split-audio outputs
- dl: Prevent attachment downloads during --skip-dl
- progress: Force track bar completion on terminal states
- progress: Bind per-track bars and force terminal completion
- dl: Keep descriptive and standard audio for requested langs
- dl: Always clean up hybrid temp hevc outputs
- hls: Finalize n_m3u8dl_re outputs
- downloader: Restore requests progress for single-url downloads
- dl: Invert audio codec suffixing when splitting
- dl: Support snake_case keys for RemoteCdm
- aria2c: Warn on config mismatch and wait for RPC ready
- serve: [breaking] Make PlayReady users config consistently a mapping
- dl: Preserve proxy_query selector (not resolved URI)
- gluetun: Stop leaking proxy/vpn secrets to process list
- monalisa: Avoid leaking secrets and add worker safety
- dl: Avoid selecting all variants when multiple audio codecs requested
- hls: Keep range offset numeric and align MonaLisa licensing
- titles: Remove trailing space from HDR dynamic range label
- config: Normalize playready_remote remote_cdm keys
- titles: Avoid None/double spaces in HDR tokens
- naming: Keep technical tokens with scene_naming off
- api: Log PSSH extraction failures
- proxies: Harden surfshark and windscribe selection
- service: Redact proxy credentials in logs
- monalisa: Harden wasm calls and license handling
- hls: Remove no-op encryption_data reassignment
- serve: Default PlayReady access to none
- tracks: Close temp session and improve path type error
- main: Update copyright year dynamically in version display
Reverts
- monalisa: Pass key via argv again
Documentation
- Add configuration documentation WIP
- changelog: Add 2.4.0 release notes
- changelog: Update cliff config and regenerate changelog
- changelog: Complete 2.4.0 notes
- config: Clarify sdh_method uses subtitle-filter
Performance Improvements
- aria2c: Improve download performance with singleton manager
Changes
- remote_auth: Remove unused requests.Session
- Remove remote-service code until feature is more complete
Maintenance
- api: Remove remote services
Chore
- release: [breaking] Bump version to 3.0.0
2.3.0
[2.3.0] - 2026-01-18
Added
- Unicode Filenames Option: New
unicode_filenamesconfig option to preserve native characters- Allows disabling ASCII transliteration in filenames
- Preserves Korean, Japanese, Chinese, and other native language characters
- Closes #49
Fixed
- WebVTT Cue Handling: Handle WebVTT cue identifiers and overlapping multi-line cues
- Added detection and sanitization for cue identifiers (Q0, Q1, etc.) before timing lines
- Added merging of overlapping cues with different line positions into multi-line subtitles
- Fixes parsing issues with pysubs2/pycaption on certain WebVTT files
- Widevine PSSH Filtering: Filter Widevine PSSH by system ID instead of sorting
- Fixes KeyError crash when unsupported DRM systems are present in init segments
- TTML Negative Values: Handle negative values in multi-value TTML attributes
- Fixes pycaption parse errors for attributes like
tts:extent="-5% 7.5%" - Closes #47
- Fixes pycaption parse errors for attributes like
- ASS Font Names: Strip whitespace from ASS font names
- Handles ASS subtitle files with spaces after commas in Style definitions
- Fixes #57
- Shaka-Packager Error Messages: Include shaka-packager binary path in error messages
- N_m3u8DL-RE Merge and Decryption: Handle merge and decryption properly
- Prevents audio corruption ("Box 'OG 2' size is too large") with DASH manifests
- Fixes duplicate init segment writing when using N_m3u8DL-RE
- DASH Placeholder KIDs: Handle placeholder KIDs and improve DRM init from segments
- Detects and replaces placeholder/test KIDs in Widevine PSSH
- Adds CENC namespace support for kid/default_KID attributes
- PlayReady PSSH Comparison: Correct PSSH system ID comparison in PlayReady
- Removes erroneous
.bytesaccessor from PSSH.SYSTEM_ID comparisons
- Removes erroneous
Full Changelog: https://github.com/unshackle-dl/unshackle/blob/main/CHANGELOG.md
2.2.0
[2.2.0] - 2026-01-15
Added
- CDM-Aware PlayReady Fallback Detection: Intelligent DRM fallback based on selected CDM
- Adds PlayReady PSSH/KID extraction from track and init data with CDM-aware ordering
- When PlayReady CDM is selected, tries PlayReady first then falls back to Widevine
- When Widevine CDM is selected (default), tries Widevine first then falls back to PlayReady
- Comprehensive Debug Logging: Enhanced debug logging for downloaders and muxing
Fixed
- Hybrid DV+HDR10 Filename Detection: Fixed HDR10 detection in hybrid Dolby Vision filenames
- Vault Adaptive Batch Sizing: Improved bulk key operations with adaptive batch sizing
- Test Command Improvements: Enhanced test command error detection and sorting
Full Changelog: https://github.com/unshackle-dl/unshackle/blob/main/CHANGELOG.md
2.1.0
Added
- Per-Track Quality-Based CDM Selection: Dynamic CDM switching during runtime DRM operations
- Enables quality-based CDM selection during runtime DRM switching
- Different CDMs can be used for different video quality levels within the same download session
- Example: Use Widevine L3 for SD/HD and PlayReady SL3 for 4K content
- Enhanced Track Export: Improved export functionality with additional metadata
- Added URL field to track export for easier identification
- Added descriptor information in export output
- Keys now exported in hex-formatted strings
Changed
- Dependencies: Upgraded to latest compatible versions
- Updated various dependencies to their latest versions
Fixed
- Attachment Preservation: Fixed attachments being dropped during track filtering
- Attachments (screenshots, fonts) were being lost when track list was rebuilt
- Fixes image files remaining in temp directory after muxing
- DASH BaseURL Resolution: Added AdaptationSet-level BaseURL support per DASH spec
- URL resolution chain now properly follows: MPD → Period → AdaptationSet → Representation
- WindscribeVPN Region Support: Restricted to supported regions with proper error handling
- Added error handling for unsupported regions in get_proxy method
- Prevents cryptic errors when using unsupported region codes
- Filename Sanitization: Fixed space-hyphen-space handling in filenames
- Pre-process space-hyphen-space patterns (e.g., "Title - Episode") before other replacements
- Made space-hyphen-space handling conditional on scene_naming setting
- Addresses PR #44 by fixing the root cause
- CICP Enum Values: Corrected values to match ITU-T H.273 specification
- Added Primaries.Unspecified (value 2) per H.273 spec
- Renamed Primaries/Transfer value 0 from Unspecified to Reserved for spec accuracy
- Simplified Transfer value 2 from Unspecified_Image to Unspecified
- Verified against ITU-T H.273, ISO/IEC 23091-2, H.264/H.265 specs, and FFmpeg enums
- HLS Byte Range Parsing: Fixed TypeError in range_offset conversion
- Converted range_offset to int to prevent TypeError in calculate_byte_range
- pyplayready Compatibility: Pinned to <0.7 to avoid KID extraction bug
Full Changelog: https://github.com/unshackle-dl/unshackle/blob/main/CHANGELOG.md
2.0.0
[2.0.0] - 2025-11-10
Breaking Changes
- REST API Integration: Core architecture modified to support REST API functionality
- Changes to internal APIs for download management and tracking
- Title and track classes updated with API integration points
- Core component interfaces modified for queue management support
- Configuration Changes: New required configuration options for API and enhanced features
- Added
simkl_client_idnow required for Simkl functionality - Service-specific configuration override structure introduced
- Debug logging configuration options added
- Added
- Forced Subtitles: Behavior change for forced subtitle inclusion
- Forced subs no longer auto-included, requires explicit
--forced-subsflag
- Forced subs no longer auto-included, requires explicit
Added
- REST API Server: Complete download management via REST API (early development)
- Implemented download queue management and worker system
- Added OpenAPI/Swagger documentation for easy API exploration
- Included download progress tracking and status endpoints
- API authentication and comprehensive error handling
- Updated core components to support API integration
- Early development work with more changes planned
- CustomRemoteCDM: Highly configurable custom CDM API support
- Support for third-party CDM API providers with maximum configurability
- Full configuration through YAML without code changes
- Fixes #26 for flexible CDM integration
- WindscribeVPN Proxy Provider: New VPN provider support
- Added WindscribeVPN following NordVPN and SurfsharkVPN patterns
- Fixes GitHub issue #29
- Latest Episode Download: New
--latest-episodeCLI option-le, --latest-episodeflag to download only the most recent episode- Automatically selects the single most recent episode regardless of season
- Fixes GitHub issue #28
- Video Track Exclusion: New
--no-videoCLI option-nv, --no-videoflag to skip downloading video tracks- Allows downloading only audio, subtitles, attachments, and chapters
- Useful for audio-only or subtitle extraction workflows
- Fixes GitHub issue #39
- Service-Specific Configuration Overrides: Per-service fine-tuned control
- Support for per-service configuration overrides in YAML
- Fine-tuned control of downloader and command options per service
- Fixes GitHub issue #13
- Comprehensive JSON Debug Logging: Structured logging for troubleshooting
- Binary toggle via
--debugflag ordebug: truein config - JSON Lines (.jsonl) format for easy parsing and analysis
- Comprehensive logging of all operations (session info, CLI params, CDM details, auth status, title/track metadata, DRM operations, vault queries)
- Configurable key logging via
debug_keysoption with smart redaction - Error logging for all critical operations
- Removed old text logging system
- Binary toggle via
- curl_cffi Retry Handler: Enhanced session reliability
- Added automatic retry mechanism to curl_cffi Session
- Improved download reliability with configurable retries
- Simkl API Configuration: New API key support
- Added
simkl_client_idconfiguration option - Simkl now requires client_id from https://simkl.com/settings/developer/
- Added
- Custom Session Fingerprints: Enhanced browser impersonation capabilities
- Added custom fingerprint and preset support for better service compatibility
- Configurable fingerprint presets for different device types
- Improved success rate with services using advanced bot detection
- TMDB and Simkl Metadata Caching: Enhanced title cache system
- Added metadata caching to title cache to reduce API calls
- Caches movie/show metadata alongside title information
- Improves performance for repeated title lookups and reduces API rate limiting
- API Enhancements: Improved REST API functionality
- Added default parameter handling for better request processing
- Added URL field to services endpoint response for easier service identification
- Complete API enhancements for production readiness
- Improved error responses with better detail and debugging information
Changed
- Binary Search Enhancement: Improved binary discovery
- Refactored to search for binaries in root of binary folder or subfolder named after the binary
- Better organization of binary dependencies
- Type Annotations: Modernized to PEP 604 syntax
- Updated session.py type annotations to use modern Python syntax
- Improved code readability and type checking
Fixed
- Audio Description Track Support: Added option to download audio description tracks
- Added
--audio-description/-adflag to optionally include descriptive audio tracks - Previously, audio description tracks were always filtered out
- Users can now choose to download AD tracks when needed
- Fixes GitHub issue #33
- Added
- Config Directory Support: Cross-platform user config directory support
- Fixed config loading to properly support user config directories across all platforms
- Fixes GitHub issue #23
- HYBRID Mode Validation: Pre-download validation for hybrid processing
- Added validation to check both HDR10 and DV tracks are available before download
- Prevents wasted downloads when hybrid processing would fail
- TMDB/Simkl API Keys: Graceful handling of missing API keys
- Improved error handling when TMDB or Simkl API keys are not configured
- Better user messaging for API configuration requirements
- Forced Subtitles Behavior: Correct forced subtitle filtering
- Fixed forced subtitles being incorrectly included without
--forced-subsflag - Forced subs now only included when explicitly requested
- Fixed forced subtitles being incorrectly included without
- Font Attachment Constructor: Fixed ASS/SSA font attachment
- Use keyword arguments for Attachment constructor in font attachment
- Fixes "Invalid URL: No scheme supplied" error
- Fixes GitHub issue #24
- Binary Subdirectory Checking: Enhanced binary location discovery
- Updated binaries.py to check subdirectories in binaries folders named after the binary
- Improved binary detection and loading
- HLS Manifest Processing: Minor HLS parser fix
- lxml and pyplayready: Updated dependencies
- Updated lxml constraint and pyplayready import path for compatibility
- DASH Segment Calculation: Corrected segment handling
- Fixed segment count calculation for DASH manifests with startNumber=0
- Ensures accurate segment processing for all DASH manifest configurations
- Prevents off-by-one errors in segment downloads
- HDR Detection and Naming: Comprehensive HDR format support
- Improved HDR detection with comprehensive transfer characteristics checks
- Added hybrid DV+HDR10 support for accurate file naming
- Better identification of HDR formats across different streaming services
- More accurate HDR/DV detection in filename generation
- Subtitle Processing: VTT subtitle handling improvements
- Resolved SDH (Subtitles for Deaf and Hard of hearing) stripping crash when processing VTT files
- More robust subtitle processing pipeline with better error handling
- Fixes crashes when filtering specific VTT subtitle formats
- DRM Processing: Enhanced encoding handling
- Added explicit UTF-8 encoding to mp4decrypt subprocess calls
- Prevents encoding issues on systems with non-UTF-8 default encodings
- Improves cross-platform compatibility for Windows and some Linux configurations
- Session Fingerprints: Updated OkHttp presets
- Updated OkHttp fingerprint presets for better Android TV compatibility
- Improved success rate with services using fingerprint-based detection
Documentation
- GitHub Issue Templates: Enhanced issue reporting
- Improved bug report template with better structure and required fields
- Enhanced feature request template for clearer specifications
- Added helpful guidance for contributors to provide complete information
Refactored
- Import Cleanup: Removed unused imports
- Removed unused mypy import from binaries.py
- Fixed import ordering in API download_manager and handlers
Contributors
This release includes contributions from:
- @Sp5rky - REST API server implementation, dependency updates
- @stabbedbybrick - curl_cffi retry handler (PR #31)
- @stabbedbybrick - n_m3u8dl-re refactor (PR #38)
- @TPD94 - Binary search enhancements, manifest parser fixes (PR #19)
- @ scene (Andy) - Core features, configuration system, bug fixes
Full Changelog: https://github.com/unshackle-dl/unshackle/blob/main/CHANGELOG.md
1.4.8
[1.4.8] - 2025-10-08
Added
- Exact Language Matching: New
--exact-langflag for precise language matching- Enables strict language code matching without fallbacks
- No-Mux Flag: New
--no-muxflag to skip muxing tracks into container files- Useful for keeping individual track files separate
- DecryptLabs API Integration for HTTP Vault: Enhanced vault support
- Added DecryptLabs API support to HTTP vault for improved key retrieval
- AC4 Audio Codec Support: Enhanced audio format handling
- Added AC4 codec support in Audio class with updated mime/profile handling
- pysubs2 Subtitle Conversion: Extended subtitle format support
- Added pysubs2 subtitle conversion with extended format support
- Configurable conversion method in configuration
Changed
- Audio Track Sorting: Optimized audio track selection logic
- Improved audio track sorting by grouping descriptive tracks and sorting by bitrate
- Better identification of ATMOS and DD+ as highest quality for filenaming
- pyplayready Update: Upgraded to version 0.6.3
- Updated import paths to resolve compatibility issues
- Fixed lxml constraints for better dependency management
- pysubs2 Conversion Method: Moved from auto to manual configuration
- pysubs2 no longer auto-selected during testing phase
Fixed
- Remote CDM: Fixed curl_cffi compatibility
- Added curl_cffi to instance checks in RemoteCDM
- Temporary File Handling: Improved encoding handling
- Specified UTF-8 encoding when opening temporary files
Reverted
- tinycss SyntaxWarning Suppression: Removed ineffective warning filter
- Reverted warnings filter that didn't work as expected for suppressing tinycss warnings
Full Changelog: 1.4.7...1.4.8
1.4.7
[1.4.7] - 2025-09-25
Added
- curl_cffi Session Support: Enhanced anti-bot protection with browser impersonation
- Added new session utility with curl_cffi support for bypassing anti-bot measures
- Browser impersonation support for Chrome, Firefox, and Safari user agents
- Full backward compatibility with requests.Session maintained
- Suppressed HTTPS proxy warnings for improved user experience
- Download Retry Functionality: Configurable retry mechanism for failed downloads
- Added retry count option to download function for improved reliability
- Subtitle Requirements Options: Enhanced subtitle download control
- Added options for required subtitles in download command
- Better control over subtitle track selection and requirements
- Quality Selection Enhancement: Improved quality selection options
- Added best available quality option in download command for optimal track selection
- DecryptLabs API Integration: Enhanced remote CDM configuration
- Added decrypt_labs_api_key to Config initialization for better API integration
Changed
- Manifest Parser Updates: Enhanced compatibility across all parsers
- Updated DASH, HLS, ISM, and M3U8 parsers to accept curl_cffi sessions
- Improved cookie handling compatibility between requests and curl_cffi
- Logging Improvements: Reduced log verbosity for better user experience
- Changed duplicate track log level to debug to reduce console noise
- Dynamic CDM selection messages moved to debug-only output
Fixed
- Remote CDM Reuse: Fixed KeyError in dynamic CDM selection
- Prevents KeyError when reusing remote CDMs in dynamic selection process
- Creates copy of CDM dictionary before modification to prevent configuration mutation
- Allows same CDM to be selected multiple times within session without errors
Full Changelog: 1.4.6...1.4.7