diff --git a/unshackle/core/binaries.py b/unshackle/core/binaries.py index da31fb5..e3b04aa 100644 --- a/unshackle/core/binaries.py +++ b/unshackle/core/binaries.py @@ -3,27 +3,30 @@ 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) def find(*names: str) -> Optional[Path]: """Find the path of the first found binary name.""" - # Get the directory containing this file to find the local binaries folder - current_dir = Path(__file__).parent.parent + current_dir = Path(__file__).resolve().parent.parent local_binaries_dir = current_dir / "binaries" - 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 + ext = ".exe" if sys.platform == "win32" else "" - # Also check with .exe extension on Windows - if sys.platform == "win32": - local_path_exe = local_binaries_dir / f"{name}.exe" - if local_path_exe.is_file(): - return local_path_exe + for name in names: + if local_binaries_dir.exists(): + candidate_paths = [ + local_binaries_dir / f"{name}{ext}", + local_binaries_dir / name / f"{name}{ext}" + ] + + for path in candidate_paths: + if path.is_file(): + # On Unix-like systems, check if file is executable + if sys.platform == "win32" or (path.stat().st_mode & 0o111): + return path # Fall back to system PATH path = shutil.which(name) diff --git a/unshackle/core/manifests/hls.py b/unshackle/core/manifests/hls.py index d48d96e..0bb1c9b 100644 --- a/unshackle/core/manifests/hls.py +++ b/unshackle/core/manifests/hls.py @@ -439,7 +439,7 @@ class HLS: elif len(files) != range_len: raise ValueError(f"Missing {range_len - len(files)} segment files for {segment_range}...") - if isinstance(drm, Widevine): + if isinstance(drm, (Widevine, PlayReady)): # with widevine we can merge all segments and decrypt once merge(to=merged_path, via=files, delete=True, include_map_data=True) drm.decrypt(merged_path)