Vinetrimmer-DRM-TOOL/CHANGELOG.md

314 lines
20 KiB
Markdown
Raw Permalink Normal View History

2022-01-01 13:33:38 +01:00
# Changelog
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.0.0), and this project adheres
to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [0.0.7] - 2021-08-09
### Added
- New Service: Showtime (<https://www.showtime.com>).
- New dependency: `lxml`.
- New Dev dependencies: `types-protobuf`, and `types-PyMySQL`.
- Tracks.from_m3u8: Detect HDR10 using SupplementalProperty values if available.
- Tracks.from_mpds: Detect Dolby Vision by checking for `dvhe` at the start of the codec.
- Tracks.get_pssh: Add support for v4.1.0.0 PlayReady PSSH boxes.
- BaseTrack: Create function `move` allowing one to move the file at `_location` (if available) to another location
then set the new location as the new `_location`.
- BaseTrack: Create function `swap` allowing one to delete the current file at `_location` (if available) then move
a different file to `_location`.
- AMZN: When using a non-chrome CDM device, Warn if no device information was available.
### Changed
- Tracks.from_mpds: Replace xmltodict with lxml for a very noticeable speed boost. Anything from Tracks.from_mpds
that expected a xmltodict result has been updated to expect and work with lxml.
- Tracks.get_pssh: Replace xmltodict with lxml.
- Credential: Username and Password arguments can no longer be None. A string value must be set.
- Credential: Due to the above change, Credential.load will now raise a ValueError instead of returning an empty
initialized class with no arguments.
- mypy: Incomplete and/or Untyped Definitions are no longer allowed.
- Title: Renamed Title.title_id to Title.id (`id_` in the args list as to not shadow built-in `id`).
- Title: Renamed Title.title_type to Title.type (`type_` in the args list as to not shadow built-in `type`).
- PMTP: Replace xmltodict with lxml.
- AMZN: Replace requests with aria2c when downloading the MPD manifest due to the sheer size of manifests from Amazon.
They have thousands upon thousands of segment index information making the file size up to 60 MB in some cases.
Using aria2c's multithreading to download these manifests gives a moderate speed boost.
- NF: Service privacy certificate has been moved to its config.
### Removed
- Removed `xmltodict` dependency.
- Removed unused `cdmapi.py` file in the utils folder. It had its core code reworked as RemoteDevice in `Cdm.py`
but forgot to be removed once finished.
- NF: Removed unused `android_login()` function that did not work when it was put in, and has no plans to be fixed
or updated as it isn't needed.
### Fixed
- Tracks.get_pssh: Heavily improve (and outright fix in most scenarios) PlayReady PSSH parsing.
- Tracks.mux: Fix IndexError on the default track check when there's no audio tracks to mux, e.g., with `--subs-only`.
- Tracks.mux: Raise ValueError if the track being muxed is not yet downloaded.
- Tracks.mux: Remove unnecessary mkdir on all available tracks. mkvmerge will create the parent directories of the
output muxed file if necessary.
- Tracks.`__str__`: Fix count of MenuTrack's after the change in v0.0.3 where MenuTracks were removed from the Tracks
`__iter__`.
- VideoTrack & AudioTrack `__str__`: Fix bitrate print when bitrate is not specified, or 0.
- Tracks.sort_subtitles: Sort forced subtitles to be at the top of the list, but top of each language group, not top
of the entire subtitles list.
- Tracks.from_mpds: Prefer the frameRate in the Representation over the AdaptationSet for more accuracy.
- TextTrack.download: Return the save path on the override method to match the signature of the super method.
- TextTrack.get_track_name: Fix type error with flag if flag is `false`.
- Title.Types: Create as a numeric Enum for all type-hinting and mypy checks to correctly work in relation to the
title.Types class.
- config: Fix type error if no `tag` was specified by the user in the config, or it was a false-y value.
- AMZN: Fix casing of the HDR10 range check for the bitrate mode preparation check.
- AMZN: Tag descriptive audio based on audioTrackSubtype instead of filtering it out entirely.
- HULU: Fix type error of the original_lang value of the Title objects in get_titles.
- CORE: Fix Title id used in get_playlist.
## [0.0.6] - 2021-08-08
### Added
- LocalVault: Support expanding user (`~`) on the vault path.
- VUDU: Cache session key data per-profile. They only last for one hour, but caching can still help.
- VUDU: Get original title language.
- ALL4: Add Android API Key IV token protection values.
- ALL4: Add a list of all(?) available Client name values. These were returned from the API response if you were to
provide an invalid client name value. (lol)
- Title: Add `original_lang` class attribute. Expects a langcodes Language object. This should be set to the titles
original language, just like BaseTrack.original_lang.
- constants: Added `none` -> `und` language mapping to LANGUAGE_MUX_MAP.
### Changed
- README: Update information for the latest changes with configs, credentials, data, and commands.
- Set and use `Title.original_lang` instead of `BaseTrack.original_lang` on ALL4, AMZN, ATVP, CRAV, CTV, CORE, DSNP,
FO, HMAX, HS, HULU, iT, NF, PLAY.
- BaseTrack: Rename `original_lang` attribute to `is_original_lang`. This is to reduce confusion between Title's
`original_lang`, and BaseTrack's `original_lang` (which is a bool, not a language object).
- ATVP: Use v3 title API to get originalSpeakingLanguages value for titles.
- VUDU: Use browser login for consistency since the rest of the code is browser-based calls.
- VUDU: Endpoints and service privacy certificate has been moved to its config.
- BaseService: All services now only need to provide the click Context (ctx) variable in a super call, instead of
cookies, credentials, and so on.
- Track get_track_name: Display territory name in English.
- Track `__str__`: Display bitrate in kb/s. However, It still stores bitrate as bytes/sec.
### Fixed
- AMZN, HMAX, HULU, NF, PLAY: Use is_close_match over `startswith()` and `==` when checking language equality.
- ALL4: Using the Android API token protection values over the Browser values, only non-upscaled streams will be
available.
- ALL4: Strip whitespace from the decrypted token and license API values.
- ALL4: Mark `alternative` role audio tracks as descriptive.
- VUDU: Fix runtime error on titles that do not have a `bestDashVideoQuality` value.
- HMAX: Use Android Device values for `[client]` config as Browser values now have recaptcha on login. It still uses
Browser values for `[device]` as HEVC fails to return otherwise.
- HMAX: Fix possible KeyError on get_tracks manifest call error handling.
- PMTP: Fix License call `content_id` KeyError.
- PMTP: Fix get_auth_bearer request url join.
- PMTP: Fix missing episode titles from get_titles by adding support for `Promo Full Episode` titles.
- PMTP: Make sure TV show title ID is a number, not a slug.
- DSNP: Fix token expiration check. The file creation time was incorrectly using as nanoseconds in int form.
- DSNP: Fix token refreshing request. It used an invalid grant_type.
- BaseService: Service Log now correctly honors vt root option `--debug` when deciding the log level.
- dl: Vault Caching logs are now more verbose, and more accurate when an error occurs. It no longer always states it
cached when it might not have.
- Track.from_mpds & Tracks.from_m3u8: Support `lang` argument to be a langcodes Language object.
- Track.from_mpds & Tracks.from_m3u8: Use is_close_match over startswith() when checking language equality.
- Tracks.from_m3u8: Allow `lang` argument to be optional.
- Tracks.from_m3u8: Assuming Video tracks as original_lang=True (if lang is provided) as there is no language
information provided to videos in the M3U spec.
## [0.0.5] - 2021-08-08
### Added
- Credential: A SHA1 is now generated on the `username:password` as a HEX string. Like Basic Authorization format
but as HEX instead of Base64.
- Tracks.from_m3u8: Check for `descriptive` and `sdh` using `describes-video` and `describes-music-and-sound`
accessibility characteristics respectively. Removes the duplicate manual checks from ATVP and iT.
- BamSDK: Implement the `session` service endpoint. All (2) known functions/endpoints have been implemented.
- DSNP: Add token caching and refreshing capability. Cached Tokens are per-region and per-account. The per-region
is necessary as Disney+ ties the initial IP region to the tokens, and ignores any further region changes since.
- DSNP: Print information about the Access Token using the new BamSDK session functions.
- DSNP: Get chapters based on milestone data.
- HULU: Add new device id and keys. Specifically ones for: PC (159), Chrome (190), FireTV (188), and Shield (109).
### Changed
- Tracks.repackage: When repackaging, no extra metadata on the stream will be kept, and no additional metadata will
be added by FFmpeg, allowing each repackage to be bit-identical to previous or next repacks.
- AudioTrack & TextTrack get_track_name: Remove the language name from the track title, only have the territory and
flag information, e.g. `Latin America (SDH)` not `Spanish (Latin America) (SDH)`.
- DSNP: The service privacy certificate has been moved to its config.
- HULU: Moved the device id and key configuration from the user service config to the app service config. The device
ID and Key used should not need to be changed often by the user as it isn't unique to a device or account.
- HULU: Change the device configuration structure to a device key name approach. Use FireTV4K.
- VUDU: Now uses Tracks.from_mpd directly instead of Tracks.from_mpds.
- NF: Optimize get_manifest profiles list code.
### Removed
- Track.set_language has been removed. All uses of it has been appropriately changed to directly set the `language`
attribute.
- scripts/GetItunesManifestFree.py: Already implemented (differently) within the iTunes service.
### Fixed
- dl: Keys obtained from vaults, are now cached to all available vaults, not just local vaults. Let's say you have
a cached key in your 2nd local vault only. Then it will be saved to your 1st local vault, as well as your remote
vault too.
- Tracks.mux: Set first video track as default.
- Tracks.mux: Set extra compression to None on ALL tracks, not just subtitle tracks. Even though mkvmerge help docs
state it only does anything on subtitle tracks, I've confirmed this is not true as the latest MKVToolNix GUI allows
you to set zlib for audio tracks. To play it safe, I've disabled it on all track types.
- Tracks.mux: Use is_close_match on default subtitle check instead of a direct equality comparison.
- BaseTrack & TextTrack \_\_str__: Filter out `None` objects.
- BamSDK: The internal python-requests session within the BamSDK class has been privatized. This is due to the
attribute name conflict between the python-requests session, and the BamSDK `session` service endpoint.
- DSNP: Return error if the account has not yet subscribed to Disney+.
- utils.click: Fix accuracy of syntax regex on SeasonRange. You can no longer do e.g. `-w S01_any_text_after_sxx`.
It now strictly requires the entire -w string (or rather entire parts of the -w string) to be correct and valid.
- scripts/UpdateLocalKeyVault: Now creates tables with the correct `TEXT NULL` constraint for `title` column.
## [0.0.4] - 2021-08-07
### Added
- New Service: Vudu (<https://www.vudu.com>).
- Tracks.from_mpds: Check for content type using mimeType and contentType per-representation if available.
- Tracks.from_mpds: Pass the URL HTTP query string (if available) from the MPD Manifest URL to the final track URLs.
- config: File allocation in aria2c is now configurable using `aria2c.file_allocation = ...`. The value must be a
string, and `'none'` can be used to disable file allocation. It defaults to `'falloc'` if not set.
### Changed
- Tracks.sort_subtitles: Sort forced subtitles above non-forced subtitles instead of after non-forced subtitles.
This is to follow the newer P2P release recommendations. The idea is that the less text it's going to have, the
first it comes in the order. Previously it would do Normal (Medium), SDH (Large), Forced (Small).
- Tracks.mux: Determine default subtitle track based on matching language with the first audio tracks language
instead of using its `original_lang` flag. It must still be a forced track to be considered for default.
- Tracks.from_m3u8: Use 7 characters in the video track `id_` MD5 HEX string rather than 6. This is to fix potential
hash collision. It was encountered in Apple TV at least once.
### Removed
- utils.url utilities have been removed and replaced with more ample `urllib.parse.urljoin` and `posixpath.join`
calls. `posixpath.join` may be necessary in some scenarios over `urllib.parse.urljoin`.
### Fixed
- Tracks.from_mpds: Raise ValueError if XML document is not an MPD document.
- AMZN: Fix -q quality param check, a runtime error would occur if -q was not set.
- AMZN: Force CVBR+CBR Bitrate Mode for UHD HDR10 as it would otherwise return ISM.
- AMZN: Force CVBR Bitrate Mode for UHD CBR (that isn't HDR10) as it would otherwise return ISM.
- AMZN: Force H265 Codec, CVBR Bitrate Mode, and HD Manifest for the Audio streams if the wanted codec is not
H265, or the wanted stream is UHD HDR10.
- NF: Fix the cache file mkdir. It tried to make a directory named the file itself, not the directory of the file.
- ATVP, CORE, HULU, iT: Revert changes made to the license functions regarding the position of the `_` and `__`
arguments.
- mypy: Mark `CTV` (Service class) and `FPS` (Frames-per-second Parser class) as classes. Mypy assumed they were
constants due to their casing.
- dl: Replace Python 3.9 only function `Path.is_relative_to` with `Path.relative_to`.
- config: Fix the default download directory in the example config. Add information about the default temp directory.
## [0.0.3] - 2021-08-04
### Added
- New Dev dependencies: `mypy-protobuf`, and `types-requests`.
- Print Temp Files directory on startup along with the other directories.
- Temp and Downloads directories are now configurable in the main configuration file.
- Added support for more than one video track when muxing. However, it is not yet possible to select multiple video
tracks for download.
- Generated `.pyi` files for the widevine protobuf files for mypy.
- Created is_close_match helper function that will help with comparing language tags for close equality.
- You can now map which CDM to use by both the service and profile.
### Changed
- NF: Improved and clarified the Netflix MPL vs. HPL Security notes in doc-string.
- VideoTrack: The width and height fields are no longer optional and must be a valid integer.
- MenuTrack: No longer considered part of the BaseTrack family of classes. It is no longer directly related
to VideoTrack, AudioTrack, and TextTrack classes. This is because most of the attributes of BaseTrack are
unnecessary for MenuTrack objects.
- MenuTrack: No longer part of the `Tracks.__iter__` iterable. Any code that expected the MenuTracks to be
in this iterable have been altered.
- mux: Moved the function to Tracks.mux. This allows a smaller function signature and easier access to the tracks.
- mux: Now directly calls Tracks.export_chapters instead of assuming that the caller has done it beforehand.
- mux: Moved the LANGUAGE_MUX_MAP dict from BaseService to constants.
- mux: Moved the CalledProcessError catch out of the muxing function. It is now done by the caller for greater control.
- config: A new Config class object initialised as `config` is now used instead of `main` as the main config variable.
- config: Moved the get_vaults function to the Config object as `load_vault(vault: dict)`.
- SERVICE_MAP and get_service_key has been moved from constants to `/services/__init__.py` and imported separately.
- Use an ast-based FPS parser that supports `num/den` format that returns as float.
- Moved the user_configs files from `/user_configs/*` to `/example_configs/*` and removed the `.example` from
their filenames.
### Removed
- Removed `numpy` dependency.
- Removed `LICENSE` and `README.md` from poetry source and wheel builds.
### Fixed
- pyinstaller will no longer delete the entire `/dist` folder when executed.
- Naming of CEA and EIA Closed Caption typos and incorrect usages.
- AMZN: Corrected the Meaning of CVBR as Constrained Variable Bitrate, not Capped Variable Bitrate.
- AMZN: Fix an assignment to an incorrect variable in Amazon.get_chapters.
- NF: Fix possible runtime error during audio profile selection.
- PMTP: Use their Android Movies API for get_titles due to the web API being incredibly buggy to use outside of
JavaScript. It would often out right fail to respond, or respond absolutely empty. Not a single byte response.
- PMTP: Use their Android TV API for get_titles as the Movies API change results in different response information
compared to what's expected by get_tracks.
- PMTP: Skip M3U8 manifests and ClearKey manifests as they are very low bitrate, and seemingly a temporary test.
## [0.0.2] - 2021-07-19
### Future Warnings
#### Vaults now create new tables without the `NOT NULL` constraint on the title column.
Vaults no longer use `NOT NULL` constraint on the `title` column. The code might change in the future to take
advantage of this, so be sure to update your vaults SQL condition before then.
You may manually update your table column to remove the NOT NULL constraint by executing the following SQL:
```sql
ALTER TABLE servicename ADD COLUMN title_ TEXT NULL;
UPDATE servicename SET title_ = TITLE;
ALTER TABLE servicename DROP COLUMN title;
ALTER TABLE servicename RENAME COLUMN title_ TO title;
```
where `servicename` is the table you wish to alter, e.g. `amazon`.
### Added
- Temporary ICON `.ico` file.
- Python Script to create a pyinstaller build, `pyinstaller.py`. Can also be called via new `make` shell scripts.
- Inno Setup `.iss` script to create a Windows installer setup file, that installs the pyinstaller build.
- PowerShell `make.ps1` and Bash `make.sh` scripts to build various distribution files easily and quickly.
They will build a wheel package, pyinstaller build, and an Inno Setup build (on Windows only).
- Switches `--audio-only`, `--subs-only`, and `--chapters-only` can be used together. However, it may be an error
to use all three together.
### Changed
- Vaults now create new tables without the `NOT NULL` constraint on the `title` column.
- Amazon now strictly uses a Device DRM override of `CENC`, removing it from the user config. There doesn't
seem to be any other useful value to use.
- Amazon's manifest quality option in the user config has been moved to `-q`/`--quality` service option with a
default of `HD`. `UHD` will automatically be forced if `-q` (`vt dl` global argument) is greater than `1080`.
- `pathlib`'s `read_text` and `read_bytes` functions replaced `io`/`os` read/write functions where possible.
### Removed
- Chrome CDM dll's, so's, and Chrome CDM Key Extractor code have been removed from the codebase as it filled up the
git size, yet none of it is particularly useful. The Key Extractor code was for old revoked Chrome CDM dlls.
### Fixed
- Downloads/Muxing output folder is now correctly pre-created.
- UTF-8 text-encoding is now specifically set when reading or writing text files. Windows used a default of CP1252.
- Amazon's get_original_language check on audioTrackMetadata is now correctly iterated.
- AddKeysToKeyVault now correctly checks by kid instead of accidentally by key.
- The correct version is now in the first log print in the root code. The retrieved version is from the
`tool.poetry` section of `pyproject.toml`.
## [0.0.1] - 2021-07-18
### Added
- Initial versioned release.
[Unreleased]: https://github.com/rlaphoenix/vinetrimmer/compare/v0.0.7...HEAD
[0.0.7]: https://github.com/rlaphoenix/vinetrimmer/releases/tag/v0.0.7
[0.0.6]: https://github.com/rlaphoenix/vinetrimmer/releases/tag/v0.0.6
[0.0.5]: https://github.com/rlaphoenix/vinetrimmer/releases/tag/v0.0.5
[0.0.4]: https://github.com/rlaphoenix/vinetrimmer/releases/tag/v0.0.4
[0.0.3]: https://github.com/rlaphoenix/vinetrimmer/releases/tag/v0.0.3
[0.0.2]: https://github.com/rlaphoenix/vinetrimmer/releases/tag/v0.0.2
[0.0.1]: https://github.com/rlaphoenix/vinetrimmer/releases/tag/v0.0.1