Files
unshackle/CHANGELOG.md
Andy bf9087a1ce chore(release): bump version to 3.0.0
BREAKING CHANGE: PlayReady users without explicit playready_devices no longer get access to all devices by default.

Key changes:
- feat(drm): add MonaLisa DRM support to core infrastructure
- feat(cdm): add remote PlayReady CDM support via pyplayready RemoteCdm
- feat(serve): add PlayReady CDM support alongside Widevine
- feat(gluetun): Gluetun VPN integration and Windscribe support
- feat(audio): codec lists and split muxing
- feat(tracks): prioritize Atmos audio tracks over higher bitrate non-Atmos
- feat(video): detect interlaced scan type from MPD manifests
- feat(cdm): normalize CDM detection for local and remote implementations
- fix(serve)!: make PlayReady users config consistently a mapping
- 50+ additional bug fixes across HLS/DASH, proxies, subtitles, and more
2026-02-15 13:04:42 -07:00

22 KiB

Changelog

All notable changes to this project will be documented in this file.

This project adheres to Semantic Versioning.

This changelog is automatically generated using git-cliff.

3.0.0 - 2026-02-15

Features

  • 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

2.3.0 - 2026-01-18

Features

  • config: Add unicode_filenames option to preserve native characters

Bug Fixes

  • drm: Correct PSSH system ID comparison in PlayReady
  • dash: Handle placeholder KIDs and improve DRM init from segments
  • dash: Handle N_m3u8DL-RE merge and decryption
  • drm: Include shaka-packager binary in error messages
  • subs: Strip whitespace from ASS font names
  • subs: Handle negative TTML values in multi-value attributes
  • drm: Filter Widevine PSSH by system ID instead of sorting
  • subs: Handle WebVTT cue identifiers and overlapping multi-line cues

2.2.0 - 2026-01-15

Features

  • debug: Add comprehensive debug logging for downloaders and muxing
  • drm: Add CDM-aware PlayReady fallback detection

Bug Fixes

  • util: Improve test command error detection and add natural sorting
  • vaults: Batch bulk key operations to avoid query limits
  • titles: Detect HDR10 in hybrid DV filenames correctly
  • vaults: Adaptive batch sizing for bulk key operations

2.1.0 - 2025-11-27

Features

  • export: Enhance track export with URL, descriptor, and hex-formatted keys
  • cdm: Add per-track quality-based CDM selection during runtime DRM switching
  • Merge upstream dev branch

Bug Fixes

  • deps: Pin pyplayready to <0.7 to avoid KID extraction bug
  • hls: Convert range_offset to int to prevent TypeError
  • video: Correct CICP enum values to match ITU-T H.273 specification
  • utilities: Handle space-hyphen-space separators in sanitize_filename
  • utilities: Make space-hyphen-space handling conditional on scene_naming
  • windscribevpn: Add error handling for unsupported regions in get_proxy method
  • Restrict WindscribeVPN to supported regions
  • dash: Add AdaptationSet-level BaseURL resolution
  • dl: Preserve attachments when rebuilding track list

2.0.0 - 2025-11-10

Features

  • Add REST API server with download management
  • Add comprehensive JSON debug logging system
  • cdm: Add highly configurable CustomRemoteCDM for flexible API support
  • proxies: Add WindscribeVPN proxy provider support
  • dl: Add --latest-episode option to download only the most recent episode
  • Add service-specific configuration overrides
  • Add retry handler to curl_cffi Session
  • dl: Add --audio-description flag to download AD tracks
  • api: Add url field to services endpoint response
  • api: Complete API enhancements for v2.0.0
  • api: Add default parameter handling and improved error responses
  • cache: Add TMDB and Simkl metadata caching to title cache
  • session: Add custom fingerprint and preset support
  • fonts: Add Linux font support for ASS/SSA subtitles
  • subtitle: Preserve original formatting when no conversion requested
  • dl: Add --no-video flag to skip video track downloads

Bug Fixes

  • Use keyword arguments for Attachment constructor in font attachment
  • Only exclude forced subs when --forced-subs flag is not set
  • Update lxml constraint and pyplayready import path
  • tags: Gracefully handle missing TMDB/Simkl API keys
  • config: Support config in user config directory across platforms
  • dl: Validate HYBRID mode requirements before download
  • drm: Add explicit UTF-8 encoding to mp4decrypt subprocess calls
  • subtitle: Resolve SDH stripping crash with VTT files
  • naming: Improve HDR detection with comprehensive transfer checks and hybrid DV+HDR10 support
  • dash: Correct segment count calculation for startNumber=0
  • session: Update OkHttp fingerprint presets
  • session: Remove padding extension from OkHttp JA3 fingerprints
  • dl: Prevent vault loading when --cdm-only flag is set
  • cdm: Resolve session key handling for partial cached keys
  • cdm: Apply session key fix to custom_remote_cdm
  • n_m3u8dl_re: Read lang attribute from DASH manifests correctly
  • subtitles: Fix closure bug preventing SDH subtitle stripping
  • Ensure subtitles use requests downloader instead of n_m3u8dl_re if Descriptor.URL
  • Suppress verbose fontTools logging when scanning system fonts
  • tags: Skip metadata lookup when API keys not configured

Documentation

  • Improve GitHub issue templates for better bug reports and feature requests
  • Add dev branch and update README
  • Update CHANGELOG for audio description feature
  • changelog: Complete v2.0.0 release documentation
  • changelog: Add --no-video flag and PR #38 credit
  • changelog: Set release date for version 2.0.0
  • readme: Remove dev branch warning for main merge

Changes

  • session: Modernize type annotations to PEP 604 syntax
  • binaries: Remove unused mypy import
  • Remove unnecessary underscore prefixes from function names
  • tags: Remove environment variable fallbacks for API keys

Maintenance

  • api: Fix import ordering in download_manager and handlers
  • Update CHANGELOG.md for version 2.0.0

1.4.8 - 2025-10-08

Features

  • Add AC4 codec support in Audio class and update mime/profile handling
  • Add pysubs2 subtitle conversion with extended format support
  • Add --no-mux flag to skip muxing tracks into container files
  • vaults: Add DecryptLabs API support to HTTP vault
  • Add --exact-lang flag for precise language matching

Bug Fixes

  • Optimize audio track sorting by grouping descriptive tracks and sorting by bitrate, fixes bug that does not identify ATMOS or DD+ as the highest quality available in filenaming.
  • Update lxml constraint and pyplayready import path
  • Dl.py
  • Upgrade pyplayready to 0.6.3 and resolve import compatibility issues
  • Suppress tinycss SyntaxWarning by initializing filter before imports
  • (subtitle): Move pysubs2 to not be auto while in "testing" phase.

Reverts

  • Remove tinycss SyntaxWarning suppression and fix isort

Documentation

  • Add pysubs2 conversion_method to configuration documentation

Maintenance

  • Bump version to 1.4.8

1.4.7 - 2025-09-25

Features

  • Add options for required subtitles and best available quality in download command
  • Add download retry count option to download function
  • Add decrypt_labs_api_key to Config initialization and change duplicate track log level to debug
  • Add curl_cffi session support with browser impersonation
  • Update changelog for version 1.4.7

1.4.6 - 2025-09-13

Features

  • Automatic audio language metadata for embedded audio tracks
  • Add quality-based CDM selection for dynamic CDM switching

Bug Fixes

  • Resolve service name transmission and vault case sensitivity issues
  • Improve import ordering and code formatting

Maintenance

  • Bump version to 1.4.6 and update changelog

1.4.5 - 2025-09-09

Features

  • changelog: Update changelog for version 1.4.4 with enhanced CDM support, configuration options, and various improvements
  • cdm: Enhance key retrieval logic and improve cached keys handling
  • Implement intelligent caching system for CDM license requests
  • tags: Enhance tag handling for TV shows and movies from Simkl data
  • kv: Enhance vault loading and key copying logic
  • dl: Truncate PSSH string for display in non-debug mode
  • cdm: Add fallback to Widevine common cert for L1 devices
  • cdm: Optimize get_cached_keys_if_exists for L1/L2 devices
  • cdm: Update User-Agent to use dynamic version

Bug Fixes

  • tags: Fix import order.
  • cdm: Add error message for missing service certificate in CDM session
  • tags: Fix formatting issues

Maintenance

  • Bump version to 1.4.5 and update changelog

1.4.4 - 2025-09-02

Features

  • ip-info: Add cached IP info retrieval with fallback tester to avoid rate limiting
  • ip-info: Fix few more issues with the get_ip_info make sure we failover to different provider on 429 errors and allow future for more API providers to be added later.
  • release: Bump version to 1.4.3 and update changelog with new features and improvements
  • config: Add new configuration options for device certificate status list and language preferences
  • cdm: Enhance DecryptLabsRemoteCDM to support cached keys and improve license handling
  • cdm: Enhance DecryptLabsRemoteCDM with improved session management and caching support and better support for remote WV/PR
  • cdm: Add DecryptLabs CDM configurations for Chrome and PlayReady devices with updated User-Agent and service certificate
  • cdm: Refactor DecryptLabsRemoteCDM full support for Widevine/Playready and ChromeCDM

Bug Fixes

  • dependencies: Remove unnecessary data extra requirement from langcodes
  • main: As requested old devine version removed from banner to avoid any confusion the developer of this software. Original GNU is still applys.
  • tags: Fix Matroska tag compliance with official specification

Changes

  • drm: Simplify decrypt method by removing unused parameter and streamline logic

1.4.2 - 2025-08-14

Features

  • dl: Add audio language option to override language for audio tracks
  • vault: Add no_push option to Vault and its subclasses to control key reception
  • hls: Enhance segment merging with recursive file search and fallback to binary concatenation
  • hls: Enhance segment retrieval by allowing all file types and clean up empty segment directories. Fixes issues with VTT files from HLS not being found correctly due to new HLS "changes"
  • config: Add series_year option to control year inclusion in titles and YAML configuration
  • tags: Implement session management for API requests with retry logic
  • release: Bump version to 1.4.2 and update changelog with new features and fixes

Bug Fixes

  • dl: Adjust per_language logic to ensure correct audio track selection and not download all tracks for selected language.

1.4.1 - 2025-08-08

Features

  • Implement title caching system to reduce API calls
  • dl: Update language option default to 'orig' if no -l is set, avoids hardcoded en
  • config: Add options for tagging with group name and IMDB/TMDB details and new API endpoint of simkl if no tmdb api key is added.
  • tags: Enhance tag_file function to prioritize provided TMDB ID if --tmdb is used
  • changelog: Update changelog with enhanced tagging configuration and improvements

Bug Fixes

  • subtitle: Handle ValueError in subtitle filtering for multiple colons in time references fixes issues with subtitles that contain multiple colons

Changes

  • Remove Dockerfile and .dockerignore from the repository
  • tags: Simplify Simkl search logic and soft-fail when no results found

1.4.0 - 2025-08-05

Features

  • update_checker: Enhance update checking logic and cache handling
  • dl: Add option to include forced subtitle tracks
  • subtitle: Add filtering for unwanted cues in WebVTT subtitles
  • tracks: Add support for HLG color transfer characteristics in video arguments
  • dl: Enhance language selection for video and audio tracks, including original language support
  • dl: Improve DRM track decryption handling
  • series: Enhance tree representation with season breakdown
  • hybrid: Enhance extraction and conversion processes with dymanic spinning bars to follow the rest of the codebase.
  • dl: Fix track selection to support combining -V, -A, -S flags
  • titles: Better detection of DV across all codecs in Episode and Movie classes dvhe.05.06 was not being detected correctly.
  • dl: Add support for services that do not support subtitle downloads
  • playready: Enhance KID extraction from PSSH with base64 support and XML parsing
  • Bump version to 1.4.0 and update changelog with new features and fixes

Maintenance

  • Update changelog with new features, enhancements, and fixes for version 1.3.0
  • Bump unshackle version to 1.3.0 in uv.lock

1.3.0 - 2025-08-03

Features

  • Add update check interval configuration and implement rate limiting for update checks
  • Implement terminal cleanup on exit and signal handling in ComfyConsole
  • Add Unspecified_Image option to Transfer enum in Video class.
  • Enhance credential management and CDM configuration in unshackle.yaml
  • Update path of update_check.json to .gitignore
  • Add scene naming option to configuration and update naming logic in titles
  • Add unshackle-example.yaml to replace the unshackle.yaml file, you can now make changes to the unshackle.yaml file and pull from the the repo without issues.
  • drm: Add support for mp4decrypt as a decryption method

Bug Fixes

  • Correct URL handling and improve key retrieval logic in HTTP vault
  • Rename 'servers' to 'server_map' for proxy configuration in unshackle.yaml to resolve nord/surfshark incorrect named config

Changes

  • Replace log.exit calls with ValueError exceptions for error handling in Hybrid class

Maintenance

  • Bump version to 1.3.0 and update changelog with mp4decrypt support and enhancements

1.2.0 - 2025-07-30

Features

  • dl: Enhance hybrid processing to handle HDR10 and DV tracks separately by resolution, Hotfix for -q 2160,1080 both tracks will have Hybrid correctly now.
  • hybrid: Display resolution of HDR10 track in hybrid mode console output and clean up unused code
  • subtitle: Add information into unshackle.yaml on how to use new Subby subtitle conversion.
  • vaults: Enhance vault loading with success status
  • attachment: Ensure temporary directory is created for downloads
  • tracks: Add duration fix handling for video and hybrid tracks
  • hybrid: Add HDR10+ support for conversion to Dolby Vision and enhance metadata extraction
  • Update version to 1.1.1 and add update checking functionality
  • Bump version to 1.2.0 and update changelog, I'll eventually learn symantic versioning.

Changes

  • env: Enhance dependency check with detailed categorization and status summary

Maintenance

  • workflow: Remove Docker build and publish workflow, its too messy at the moment doing manual builds for now.

1.1.0 - 2025-07-30

Features

  • Update version display in main.py
  • proxies: Add SurfsharkVPN support
  • binaries: Add support for MKVToolNix and mkvpropedit
  • subtitles: Integrate subby library for enhanced subtitle processing and conversion methods
  • hybrid: Implement HDR10+DV hybrid processing and injection support
  • EXAMPLE: Add support for HDR10 and DV tracks in hybrid mode

Bug Fixes

  • cfg: Update services directory handling
  • binaries: Improve local binary search functionality
  • env: Update binary search functionality to use binaries.find
  • env: Update Shaka-Packager binary retrieval method
  • env: Improve handling of directory paths in info command
  • install: Improve UV installation process and error handling
  • download: Skip Content-Length validation for compressed responses in curl_impersonate and requests. The fix ensures that when Content-Encoding indicates compression, we skip the validation by setting content_length = 0, allowing the downloads to complete successfully.
  • dl: Check for dovi_tool availability in hybrid mode
  • download: Skip Content-Length validation for compressed responses in curl_impersonate and requests

Maintenance

  • Bump version to 1.1.0 in pyproject.toml, init.py, and uv.lock to follow correct Semantic Versioning.
  • Add CHANGELOG.md to document notable changes and version history

[1.0.1] - 2025-07-20

Features

  • Enhance CONFIG.md with new configuration options for curl_impersonate, filenames, n_m3u8dl_re, and nordvpn
  • Update .gitignore and enhance README with planned features
  • Add .github/ to .gitignore to exclude GitHub-related files
  • Implement VideoCodecChoice for enhanced codec selection
  • Add Dockerfile and GitHub Actions workflow for building and publishing Docker image
  • Update GitHub Actions workflow for Docker image build and add Docker installation instructions to README

Bug Fixes

  • Change default value of set_terminal_bg to False
  • Add video_only condition to subtitle track selection logic fixes issues where ccextractor would run even with -V enabled
  • Add SubtitleCodecChoice for resolving issues with config clicktype selection, using names like VTT or SRT was not working as expected
  • Update shaka packager version and enhance Docker run command with additional volume mounts

Changes

  • Streamline README by removing outdated service and legal information and moved it directly to the WIKI
  • Reorganize Planned Features section in README for clarity
  • Improve track selection logic in dl.py