diff --git a/packages/envied/src/envied/commands/dl.py b/packages/envied/src/envied/commands/dl.py index 40b48d9..017e6d0 100644 --- a/packages/envied/src/envied/commands/dl.py +++ b/packages/envied/src/envied/commands/dl.py @@ -195,7 +195,7 @@ class dl: @click.option( "--sub-format", type=SubtitleCodecChoice(Subtitle.Codec), - default="srt", + default=None, help="Set Output Subtitle Format, only converting if necessary.", ) @click.option("-V", "--video-only", is_flag=True, default=False, help="Only download video tracks.") @@ -1542,11 +1542,15 @@ class dl: # All DecryptLabs CDMs use DecryptLabsRemoteCDM return None else: - del cdm_api["name"] - if "type" in cdm_api: - del cdm_api["type"] - return RemoteCdm(**cdm_api) - + return RemoteCdm( + device_type=cdm_api['Device Type'], + system_id=cdm_api['System ID'], + security_level=cdm_api['Security Level'], + host=cdm_api['Host'], + secret=cdm_api['Secret'], + device_name=cdm_api['Device Name'], + ) + prd_path = config.directories.prds / f"{cdm_name}.prd" if not prd_path.is_file(): prd_path = config.directories.wvds / f"{cdm_name}.prd" diff --git a/packages/envied/src/envied/commands/prd.py b/packages/envied/src/envied/commands/prd.py index 8c1c053..b656630 100644 --- a/packages/envied/src/envied/commands/prd.py +++ b/packages/envied/src/envied/commands/prd.py @@ -8,7 +8,7 @@ from Crypto.Random import get_random_bytes from pyplayready.cdm import Cdm from pyplayready.crypto.ecc_key import ECCKey from pyplayready.device import Device -from pyplayready.exceptions import InvalidCertificateChain, OutdatedDevice +from pyplayready import InvalidCertificateChain, OutdatedDevice from pyplayready.system.bcert import Certificate, CertificateChain from pyplayready.system.pssh import PSSH diff --git a/packages/envied/src/envied/core/__main__.py b/packages/envied/src/envied/core/__main__.py index e2aa2a4..15dad5e 100644 --- a/packages/envied/src/envied/core/__main__.py +++ b/packages/envied/src/envied/core/__main__.py @@ -1,10 +1,15 @@ import atexit import logging +import warnings from pathlib import Path import click import urllib3 from rich import traceback + +# Suppress SyntaxWarning from unmaintained tinycss package (dependency of subby) +warnings.filterwarnings("ignore", category=SyntaxWarning, module="tinycss") + from rich.console import Group from rich.padding import Padding from rich.text import Text diff --git a/packages/envied/src/envied/core/binaries.py b/packages/envied/src/envied/core/binaries.py index da31fb5..2ebee15 100644 --- a/packages/envied/src/envied/core/binaries.py +++ b/packages/envied/src/envied/core/binaries.py @@ -3,6 +3,8 @@ import sys from pathlib import Path from typing import Optional +from mypy.types import names + __shaka_platform = {"win32": "win", "darwin": "osx"}.get(sys.platform, sys.platform) @@ -15,16 +17,17 @@ def find(*names: str) -> Optional[Path]: for name in names: # First check local binaries folder if local_binaries_dir.exists(): - local_path = local_binaries_dir / name - if local_path.is_file() and local_path.stat().st_mode & 0o111: # Check if executable - return local_path - - # Also check with .exe extension on Windows + # On Windows, check for .exe extension first if sys.platform == "win32": - local_path_exe = local_binaries_dir / f"{name}.exe" + local_path_exe = local_binaries_dir / f"{name}" / f"{name}.exe" if local_path_exe.is_file(): return local_path_exe + # Check for exact name match with executable bit on Unix-like systems + local_path = local_binaries_dir / f"{name}" / f"{name}" + if local_path.is_file() and local_path.stat().st_mode & 0o111: # Check if executable + return local_path + # Fall back to system PATH path = shutil.which(name) if path: @@ -74,4 +77,4 @@ __all__ = ( "HDR10PlusTool", "Mp4decrypt", "find", -) +) \ No newline at end of file diff --git a/packages/envied/src/envied/core/config.py b/packages/envied/src/envied/core/config.py index 15bc21d..ad5af60 100644 --- a/packages/envied/src/envied/core/config.py +++ b/packages/envied/src/envied/core/config.py @@ -10,7 +10,7 @@ from appdirs import AppDirs class Config: class _Directories: # default directories, do not modify here, set via config - app_dirs = AppDirs("unshackle", False) + app_dirs = AppDirs("./", False) core_dir = Path(__file__).resolve().parent namespace_dir = core_dir.parent commands = namespace_dir / "commands" diff --git a/packages/envied/src/envied/core/manifests/dash.py b/packages/envied/src/envied/core/manifests/dash.py index 6aaab56..07a1d62 100644 --- a/packages/envied/src/envied/core/manifests/dash.py +++ b/packages/envied/src/envied/core/manifests/dash.py @@ -253,7 +253,7 @@ class DASH: ): if not session: session = Session() - elif not isinstance(session, Session): + elif not isinstance(session, (Session, CurlSession)): raise TypeError(f"Expected session to be a {Session}, not {session!r}") if proxy: diff --git a/packages/envied/src/envied/services/PLEX/__init__.py b/packages/envied/src/envied/services/PLEX/__init__.py index 4d5d14a..e1fa499 100644 --- a/packages/envied/src/envied/services/PLEX/__init__.py +++ b/packages/envied/src/envied/services/PLEX/__init__.py @@ -21,12 +21,12 @@ try: from devine.core.tracks import Chapter, Chapters, Tracks # type: ignore except ImportError: try: - from unshackle.core.credential import Credential - from unshackle.core.manifests import DASH, HLS - from unshackle.core.search_result import SearchResult - from unshackle.core.service import Service - from unshackle.core.titles import Episode, Movie, Movies, Series - from unshackle.core.tracks import Chapter, Chapters, Tracks + from envied.core.credential import Credential + from envied.core.manifests import DASH, HLS + from envied.core.search_result import SearchResult + from envied.core.service import Service + from envied.core.titles import Episode, Movie, Movies, Series + from envied.core.tracks import Chapter, Chapters, Tracks except ImportError: try: from envied.core.credential import Credential