mirror of
https://github.com/unshackle-dl/unshackle.git
synced 2025-10-23 15:11:08 +00:00
Compare commits
4 Commits
1c48b282de
...
bdd219d90c
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bdd219d90c | ||
|
|
07574d8d02 | ||
|
|
9b5d233c69 | ||
|
|
98d4bb4333 |
104
CHANGELOG.md
104
CHANGELOG.md
@@ -5,6 +5,108 @@ All notable changes to this project will be documented in this file.
|
|||||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
||||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
|
## [2.0.0] - 2025-10-25
|
||||||
|
|
||||||
|
### 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_id` now required for Simkl functionality
|
||||||
|
- Service-specific configuration override structure introduced
|
||||||
|
- Debug logging configuration options added
|
||||||
|
- **Forced Subtitles**: Behavior change for forced subtitle inclusion
|
||||||
|
- Forced subs no longer auto-included, requires explicit `--forced-subs` flag
|
||||||
|
|
||||||
|
### 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
|
||||||
|
- Addresses GitHub issue #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-episode` CLI option
|
||||||
|
- `-le, --latest-episode` flag to download only the most recent episode
|
||||||
|
- Automatically selects the single most recent episode regardless of season
|
||||||
|
- Fixes GitHub issue #28
|
||||||
|
- **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 `--debug` flag or `debug: true` in 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_keys` option with smart redaction
|
||||||
|
- Error logging for all critical operations
|
||||||
|
- Removed old text logging system
|
||||||
|
- **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_id` configuration option
|
||||||
|
- Simkl now requires client_id from https://simkl.com/settings/developer/
|
||||||
|
|
||||||
|
### 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
|
||||||
|
|
||||||
|
- **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-subs` flag
|
||||||
|
- Forced subs now only included when explicitly requested
|
||||||
|
- **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 (by @TPD94, PR #19)
|
||||||
|
- 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 (by @TPD94, PR #19)
|
||||||
|
- **lxml and pyplayready**: Updated dependencies (by @Sp5rky)
|
||||||
|
- Updated lxml constraint and pyplayready import path for compatibility
|
||||||
|
|
||||||
|
### 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)
|
||||||
|
- @TPD94 - Binary search enhancements, manifest parser fixes (PR #19)
|
||||||
|
- @scene (Andy) - Core features, configuration system, bug fixes
|
||||||
|
|
||||||
## [1.4.8] - 2025-10-08
|
## [1.4.8] - 2025-10-08
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
@@ -179,7 +281,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
- **Matroska Tag Compliance**: Enhanced media container compatibility
|
- **Matroska Tag Compliance**: Enhanced media container compatibility
|
||||||
- Fixed Matroska tag compliance with official specification
|
- Fixed Matroska tag compliance with official specification
|
||||||
- **Application Branding**: Cleaned up version display
|
- **Application Branding**: Cleaned up version display
|
||||||
- Removed old devine version reference from banner to avoid developer confusion
|
- Removed old devine version reference from banner to avoid developer confusion
|
||||||
|
|||||||
@@ -1002,6 +1002,29 @@ class dl:
|
|||||||
selected_videos.append(match)
|
selected_videos.append(match)
|
||||||
title.tracks.videos = selected_videos
|
title.tracks.videos = selected_videos
|
||||||
|
|
||||||
|
# validate hybrid mode requirements
|
||||||
|
if any(r == Video.Range.HYBRID for r in range_):
|
||||||
|
hdr10_tracks = [v for v in title.tracks.videos if v.range == Video.Range.HDR10]
|
||||||
|
dv_tracks = [v for v in title.tracks.videos if v.range == Video.Range.DV]
|
||||||
|
|
||||||
|
if not hdr10_tracks and not dv_tracks:
|
||||||
|
available_ranges = sorted(set(v.range.name for v in title.tracks.videos))
|
||||||
|
self.log.error("HYBRID mode requires both HDR10 and DV tracks, but neither is available")
|
||||||
|
self.log.error(
|
||||||
|
f"Available ranges: {', '.join(available_ranges) if available_ranges else 'none'}"
|
||||||
|
)
|
||||||
|
sys.exit(1)
|
||||||
|
elif not hdr10_tracks:
|
||||||
|
available_ranges = sorted(set(v.range.name for v in title.tracks.videos))
|
||||||
|
self.log.error("HYBRID mode requires both HDR10 and DV tracks, but only DV is available")
|
||||||
|
self.log.error(f"Available ranges: {', '.join(available_ranges)}")
|
||||||
|
sys.exit(1)
|
||||||
|
elif not dv_tracks:
|
||||||
|
available_ranges = sorted(set(v.range.name for v in title.tracks.videos))
|
||||||
|
self.log.error("HYBRID mode requires both HDR10 and DV tracks, but only HDR10 is available")
|
||||||
|
self.log.error(f"Available ranges: {', '.join(available_ranges)}")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
# filter subtitle tracks
|
# filter subtitle tracks
|
||||||
if require_subs:
|
if require_subs:
|
||||||
missing_langs = [
|
missing_langs = [
|
||||||
|
|||||||
@@ -3,8 +3,6 @@ import sys
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
from mypy.types import names
|
|
||||||
|
|
||||||
__shaka_platform = {"win32": "win", "darwin": "osx"}.get(sys.platform, sys.platform)
|
__shaka_platform = {"win32": "win", "darwin": "osx"}.get(sys.platform, sys.platform)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -118,8 +118,8 @@ POSSIBLE_CONFIG_PATHS = (
|
|||||||
Config._Directories.namespace_dir / Config._Filenames.root_config,
|
Config._Directories.namespace_dir / Config._Filenames.root_config,
|
||||||
# The Parent Folder to the unshackle Namespace Folder (e.g., %appdata%/Python/Python311/site-packages)
|
# The Parent Folder to the unshackle Namespace Folder (e.g., %appdata%/Python/Python311/site-packages)
|
||||||
Config._Directories.namespace_dir.parent / Config._Filenames.root_config,
|
Config._Directories.namespace_dir.parent / Config._Filenames.root_config,
|
||||||
# The AppDirs User Config Folder (e.g., %localappdata%/unshackle)
|
# The AppDirs User Config Folder (e.g., ~/.config/unshackle on Linux, %LOCALAPPDATA%\unshackle on Windows)
|
||||||
Config._Directories.user_configs / Config._Filenames.root_config,
|
Path(Config._Directories.app_dirs.user_config_dir) / Config._Filenames.root_config,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user