Linux support WIP

This commit is contained in:
Aswin 2025-03-21 00:39:48 +05:30
parent f8c4accd54
commit 13a9a72b80
11 changed files with 58 additions and 18 deletions

View File

@ -6,15 +6,45 @@ Modified to remove Playready DRM instead of Widevine.
- Progress Bars for decryption ([mp4decrypt](https://github.com/chu23465/bentoOldFork), Shaka)
- Refresh Token fixed for Amazon service
- Reprovision .prd after a week
- ISM manifest support (Microsoft Smooth Streaming) (Few features to be added)
- ISM manifest support (Microsoft Smooth Streaming) (WIP/Experimental)
- N_m3u8DL-RE downloader support
## Broken
- `--bitrate CVBR+CBR` is currently broken
- Atmos audio with ISM manifest (Amazon) is currently broken (Needs a working init.mp4). If the title has the atmos audio in MPD then it should work.
- ATVP service is currently broken in dev branch
- Netflix service is currently broken (will probably be fixed Soon™)
If anyone has any idea how to fix above issues, feel free to open a pull request.
## Usage
1. Run `install.bat`
1. Make sure git is installed in your system by running `git --version`. If not refer to [link](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)
2. Activate venv using `venv.cmd`.
2. Choose a branch, either `dev` or `main`. Use below command to download. (Recommended instead of downloading zip)
```bash
git clone -b <branch-name> --single-branch https://github.com/chu23465/VT-PR
```
3. Navigate and find `install.bat`
4. Run `install.bat`
5. Activate venv using `venv.cmd`.
6. Run desired command using poetry.
## Updating
1. Backup your `vinetrimmer/Cookies/`, `vinetrimmer/Cache/`, `/Downloads` directories just in case.
2. Open a command prompt and navigate your `VT-PR` directory.
3. Recall the branch you downloaded and modify below command accordingly:
```bash
git pull origin <branch-name>
```
### Config
@ -124,7 +154,7 @@ Below flags to be passed after the `AMZN` or `Amazon` keyword in command.
| -ism, --ism | Set manifest override to SmoothStreaming. Defaults to DASH w/o this flag. |
| -?, -h, --help | Show this message and exit. |
To get UHD/4k with Amazon, navigate to -
To get Atmos/UHD/4k with Amazon, navigate to -
```
https://www.primevideo.com/region/eu/ontv/code?ref_=atv_auth_red_aft

BIN
linux_binaries/N_m3u8DL-RE Normal file

Binary file not shown.

Binary file not shown.

BIN
linux_binaries/mp4decrypt Normal file

Binary file not shown.

BIN
linux_binaries/mp4dump Normal file

Binary file not shown.

BIN
linux_binaries/packager Normal file

Binary file not shown.

View File

@ -98,7 +98,7 @@ def get_cdm(log, service, profile=None, cdm_name=None):
device = Device.load(os.path.join(directories.devices, f"{cdm_name}.wvd"))
except:
device_path = os.path.abspath(os.path.join(directories.devices, f"{cdm_name}.prd"))
if ( int( time.time() ) - int( os.path.getmtime( device_path ) ) ) > 600000: #roughly a week
if ( int( time.time() ) - int( os.path.getmtime( device_path ) ) ) > 160000: #roughly 2 days
try:
reprovision_device(device_path)
log.info(f" + Reprovisioned Playready Device (.prd) file, {cdm_name}")

View File

@ -217,6 +217,7 @@ def parse(*, url=None, data=None, source, session=None, downloader=None):
# extra
extra=(list(quality_level), list(stream_info),) # Either set size as a attribute of VideoTrack or append to extra here.
))
"""
elif type_info == 'audio':
atmos = ( str( quality_level.get('@HasAtmos', 'N/A') ).lower() == "true" ) or ( "ATM" in stream_info.get('@Name', 'N/A') )
tracks.append(AudioTrack(
@ -224,7 +225,7 @@ def parse(*, url=None, data=None, source, session=None, downloader=None):
source=source,
url=url,
# metadata
codec=(codec or "").split(".")[0],
codec="E-AC3" if codec == "EC-3" else (codec or "").split(".")[0],
language=lang,
bitrate=bitrate,
channels=quality_level.get('@Channels', 'N/A'),
@ -232,11 +233,12 @@ def parse(*, url=None, data=None, source, session=None, downloader=None):
# switches/options
descriptor=Track.Descriptor.ISM,
# decryption
needs_repack=False, # Necessary
needs_repack=True, # Necessary
encrypted=encrypted,
pssh=pssh,
kid=kid,
# extra
extra=(dict(quality_level), dict(stream_info),)
))
"""
return tracks

View File

@ -1,5 +1,7 @@
from __future__ import annotations
from sys import platform
import base64
import hashlib
import json
@ -75,7 +77,7 @@ class Amazon(BaseService):
@click.option("-c", "--cdn", default=None, type=str,
help="CDN to download from, defaults to the CDN with the highest weight set by Amazon.")
# UHD, HD, SD. UHD only returns HEVC, ever, even for <=HD only content
@click.option("-vq", "--vquality", default="UHD",
@click.option("-vq", "--vquality", default="HD",
type=click.Choice(["SD", "HD", "UHD"], case_sensitive=False),
help="Manifest quality to request.")
@click.option("-s", "--single", is_flag=True, default=False,
@ -83,7 +85,7 @@ class Amazon(BaseService):
@click.option("-am", "--amanifest", default="H265",
type=click.Choice(["CVBR", "CBR", "H265"], case_sensitive=False),
help="Manifest to use for audio. Defaults to H265 if the video manifest is missing 640k audio.")
@click.option("-aq", "--aquality", default="SD",
@click.option("-aq", "--aquality", default="HD",
type=click.Choice(["SD", "HD", "UHD"], case_sensitive=False),
help="Manifest quality to request for audio. Defaults to the same as --quality.")
@click.option("-ism", "--ism", is_flag=True, default=False,
@ -115,7 +117,11 @@ class Amazon(BaseService):
self.cdm = ctx.obj.cdm
self.profile = ctx.obj.profile
if "linux" in platform:
import yaml
#Read YAML file
with open("/content/vinetrimmer/config/Services/amazon.yml", 'r') as stream:
self.config = yaml.safe_load(stream)
self.region: dict[str, str] = {}
self.endpoints: dict[str, str] = {}
self.device: dict[str, str] = {}
@ -411,6 +417,7 @@ class Amazon(BaseService):
video_codec="H265" if manifest_type == "H265" else "H264",
bitrate_mode="CVBR" if manifest_type != "CBR" else "CBR",
quality=self.aquality or self.vquality,
manifest_type="DASH",
hdr=None,
ignore_errors=True
)
@ -506,6 +513,7 @@ class Amazon(BaseService):
# replace the audio tracks with DV manifest version if atmos is present
if any(x for x in uhd_audio_mpd.audios if x.atmos):
print("Hello")
tracks.audios = uhd_audio_mpd.audios
for video in tracks.videos:

View File

@ -62,6 +62,7 @@ class Max(BaseService):
self.acodec = ctx.parent.params["acodec"]
self.range = ctx.parent.params["range_"]
self.alang = ctx.parent.params["alang"]
self.quality = ctx.parent.params["quality"] or 1080
# self.api_region = self.config.get(ctx.obj.profile, {}).get('api_region', 'comet-latam')
# self.license_api = None

View File

@ -15,6 +15,7 @@ import yaml
from vinetrimmer import config
from vinetrimmer.utils.collections import as_list
from sys import platform
def load_yaml(path):
if not os.path.isfile(path):
@ -239,12 +240,11 @@ async def saldl(uri, out, headers=None, proxy=None):
async def m3u8dl(uri: str, out: str, track):
executable = shutil.which("N_m3u8DL-RE") or shutil.which("m3u8DL")
executable = shutil.which("N_m3u8DL-RE") or shutil.which("m3u8DL") or "/usr/bin/N_m3u8DL-RE"
if not executable:
raise EnvironmentError("N_m3u8DL-RE executable not found...")
ffmpeg_binary = shutil.which("ffmpeg")
ffmpeg_binary = shutil.which("ffmpeg") or "/usr/bin/ffmpeg"
arguments = [
executable,
uri,
@ -257,11 +257,10 @@ async def m3u8dl(uri: str, out: str, track):
"--download-retry-count", "8",
"--ffmpeg-binary-path", ffmpeg_binary,
"--binary-merge",
"--decryption-engine", "SHAKA_PACKAGER",
"--http-request-timeout", "8",
"--live-real-time-merge"
]
if not ("linux" in platform):
arguments.append("--http-request-timeout")
arguments.append("8")
if track.__class__.__name__ == "VideoTrack":
if track.height:
arguments.extend([