mirror of
https://github.com/unshackle-dl/unshackle.git
synced 2026-03-18 09:07:30 +00:00
Compare commits
2 Commits
cacb695093
...
c83b7a853e
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c83b7a853e | ||
|
|
b70c350d0b |
40
CHANGELOG.md
40
CHANGELOG.md
@@ -5,6 +5,46 @@ 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).
|
||||||
|
|
||||||
|
## [Unreleased]
|
||||||
|
|
||||||
|
## [2.4.0] - 2026-02-03
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- **MonaLisa DRM**: Added MonaLisa DRM support in the core infrastructure
|
||||||
|
- Includes MonaLisa CDM module and decryption path
|
||||||
|
- Suppresses noisy Shaka Packager message specific to MonaLisa decryption
|
||||||
|
- **Remote PlayReady CDM**: Added PlayReady CDM support via pyplayready `RemoteCdm`
|
||||||
|
- `serve` now supports PlayReady alongside Widevine
|
||||||
|
- Adds server-side validation improvements for RemoteCDM
|
||||||
|
- **DRM Licensing Binary**: Added `ML-Worker` to environment dependency checks for DRM licensing
|
||||||
|
- **VPN**: Added Gluetun VPN integration
|
||||||
|
- Improved connection display
|
||||||
|
- Expanded Windscribe support through Gluetun
|
||||||
|
- **Audio**: Added codec lists and split muxing
|
||||||
|
- **Video**: Detect interlaced scan type from MPD manifests
|
||||||
|
- **Documentation**: Expanded configuration docs (CONFIG.md and new docs/* guides)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- **Downloader**: Improved `aria2c` performance via singleton manager
|
||||||
|
- **Titles**: Use track source attribute for service name in filenames
|
||||||
|
- **Remote Auth**: Removed unused `requests.Session`
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- **DASH DRM**: Preserve MPD DRM and avoid overwriting from init segments
|
||||||
|
- Added CENC namespace support for PSSH extraction
|
||||||
|
- **DASH DVR**: Handle high `startNumber` values in SegmentTimeline
|
||||||
|
- **Manifests**: Correct DRM type selection for remote PlayReady CDMs
|
||||||
|
- **Downloader**: Correct progress bar tracking for segmented downloads
|
||||||
|
- **N_m3u8DL-RE**: Remove duplicate `--write-meta-json` argument causing download failures
|
||||||
|
- **Subtitles**: Preserve original sidecar subtitle files
|
||||||
|
- **Binaries**: Search subdirectories when locating binaries
|
||||||
|
- **Proxies**: Fix WindscribeVPN server authentication and aggregate servers across all locations
|
||||||
|
- **Serve**: Correct PlayReady RemoteCDM server validation
|
||||||
|
- **API**: Validate `Bearer` prefix before extracting API keys
|
||||||
|
|
||||||
## [2.3.1] - 2026-01-22
|
## [2.3.1] - 2026-01-22
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|||||||
@@ -1800,6 +1800,7 @@ class dl:
|
|||||||
|
|
||||||
muxed_paths = []
|
muxed_paths = []
|
||||||
muxed_audio_codecs: dict[Path, Optional[Audio.Codec]] = {}
|
muxed_audio_codecs: dict[Path, Optional[Audio.Codec]] = {}
|
||||||
|
append_audio_codec_suffix = True
|
||||||
|
|
||||||
if no_mux:
|
if no_mux:
|
||||||
# Skip muxing, handle individual track files
|
# Skip muxing, handle individual track files
|
||||||
@@ -1820,6 +1821,7 @@ class dl:
|
|||||||
merge_audio = not split_audio
|
merge_audio = not split_audio
|
||||||
else:
|
else:
|
||||||
merge_audio = config.muxing.get("merge_audio", True)
|
merge_audio = config.muxing.get("merge_audio", True)
|
||||||
|
append_audio_codec_suffix = merge_audio
|
||||||
|
|
||||||
multiplex_tasks: list[tuple[TaskID, Tracks, Optional[Audio.Codec]]] = []
|
multiplex_tasks: list[tuple[TaskID, Tracks, Optional[Audio.Codec]]] = []
|
||||||
|
|
||||||
@@ -2055,7 +2057,7 @@ class dl:
|
|||||||
final_dir = config.directories.downloads
|
final_dir = config.directories.downloads
|
||||||
final_filename = title.get_filename(media_info, show_service=not no_source)
|
final_filename = title.get_filename(media_info, show_service=not no_source)
|
||||||
audio_codec_suffix = muxed_audio_codecs.get(muxed_path)
|
audio_codec_suffix = muxed_audio_codecs.get(muxed_path)
|
||||||
if audio_codec_suffix:
|
if audio_codec_suffix and append_audio_codec_suffix:
|
||||||
final_filename = f"{final_filename}.{audio_codec_suffix.name}"
|
final_filename = f"{final_filename}.{audio_codec_suffix.name}"
|
||||||
|
|
||||||
if not no_folder and isinstance(title, (Episode, Song)):
|
if not no_folder and isinstance(title, (Episode, Song)):
|
||||||
|
|||||||
Reference in New Issue
Block a user