diff --git a/.gitignore b/.gitignore index 52e7cc2..91292f5 100644 --- a/.gitignore +++ b/.gitignore @@ -26,6 +26,7 @@ unshackle/PRDs/ temp/ logs/ Temp/ +binaries/ # Byte-compiled / optimized / DLL files __pycache__/ diff --git a/unshackle/services/Netflix/__init__.py b/unshackle/services/Netflix/__init__.py index 9ddd016..a4dc436 100644 --- a/unshackle/services/Netflix/__init__.py +++ b/unshackle/services/Netflix/__init__.py @@ -17,7 +17,7 @@ from Crypto.Random import get_random_bytes import jsonpickle from pymp4.parser import Box -from pywidevine import PSSH, Cdm, DeviceTypes +from pywidevine import PSSH, Cdm as WidevineCDM, DeviceTypes from pyplayready import PSSH as PlayReadyPSSH import requests from langcodes import Language @@ -563,13 +563,15 @@ class Netflix(Service): 'esn': esn, 'type': self.cdm.device_type } - if self.esn.data["esn"] != esn: - self.esn.set(self.config["esn_map"][self.cdm.system_id], 1 * 60 * 60) + cached_esn = self.esn.data.get("esn") if isinstance(self.esn.data, dict) else self.esn.data + cached_type = self.esn.data.get("type") if isinstance(self.esn.data, dict) else None + if cached_esn != esn or cached_type != DeviceTypes.ANDROID or (hasattr(self.esn, "expired") and self.esn.expired): + self.esn.set(esn_value, expiration=1 * 60 * 60) else: ESN_GEN = "".join(random.choice("0123456789ABCDEF") for _ in range(30)) generated_esn = f"NFCDIE-03-{ESN_GEN}" # Check if ESN is expired or doesn't exist - if self.esn.data is None or self.esn.data == {} or (hasattr(self.esn, 'expired') and self.esn.expired) or (self.esn.data["type"] != DeviceTypes.CHROME): + if not isinstance(self.esn.data, dict) or self.esn.data == {} or (hasattr(self.esn, 'expired') and self.esn.expired) or (self.esn.data.get("type") != DeviceTypes.CHROME): # Set new ESN with 6-hour expiration esn_value = { 'esn': generated_esn, @@ -579,7 +581,8 @@ class Netflix(Service): self.log.info(f"Generated new ESN with 1-hour expiration") else: self.log.info(f"Using cached ESN.") - self.log.info(f"ESN: {self.esn.data["esn"]}") + final_esn = self.esn.data.get("esn") if isinstance(self.esn.data, dict) else self.esn.data + self.log.info(f"ESN: {final_esn}") def get_metadata(self, title_id: str): @@ -1216,7 +1219,7 @@ class Netflix(Service): def get_drm_system(self) -> Literal["widevine", "playready"]: # This is widevine? - if isinstance(self.cdm, Widevine): + if isinstance(self.cdm, WidevineCDM): return "widevine" elif isinstance(self.cdm, PlayReady): return "playready" diff --git a/unshackle/services/Netflix/config.yaml b/unshackle/services/Netflix/config.yaml index 8a9b7e9..d904457 100644 --- a/unshackle/services/Netflix/config.yaml +++ b/unshackle/services/Netflix/config.yaml @@ -16,6 +16,7 @@ esn_map: 8159: "NFANDROID1-PRV-P-GOOGLEPIXEL" 8131: "HISETVK84500000000000000000000000007401422" 22590: "NFANDROID1-PXA-P-L3-XIAOMM2102J20SG-22590-0202084EBTP55D0HO2TOCSM3VR9MOSTTJT2L97EKVN9E8PFA1QQ439QC70QTTTV82LC7KUSD3O0HUB0HKH51DH0N7A7GFJKSJ5S6FFE0" + 12063: "NFANDROID1-PRV-P-SHENZHENKTC-49B1U-12063-2PAENERYJWY35H7F24163TMUCBBA4VRHQ2XZX4OBU4MUTKYFW50BMFBVGTUMN6IM0" endpoints: website: "https://www.netflix.com/nq/website/memberapi/{build_id}/pathEvaluator" manifest: "https://www.netflix.com/msl/playapi/cadmium/licensedmanifest/1" diff --git a/unshackle/unshackle.yaml b/unshackle/unshackle.yaml index 228b220..64427fa 100644 --- a/unshackle/unshackle.yaml +++ b/unshackle/unshackle.yaml @@ -57,18 +57,17 @@ credentials: default: ["user@email.com", ":PasswordWith:Colons"] Netflix: - default: ["sako.sako1109@gmail.com", "sako1109"] + default: ["ariel-prinsess828@ezweb.ne.jp", "AiNe892186"] # default: ["pbgarena0838@gmail.com", "Andhika1978"] # Override default directories used across unshackle directories: cache: Cache # cookies: Cookies dcsl: DCSL # Device Certificate Status List - downloads: Downloads + downloads: /home/kenzuya/Mounts/ketuakenzuya/Downloads logs: Logs temp: Temp # wvds: WVDs - prds: PRDs # Additional directories that can be configured: # commands: Commands # services: @@ -252,6 +251,9 @@ services: # External proxy provider services proxy_providers: + basic: + SG: + - "http://127.0.0.1:6004" surfsharkvpn: username: SkyCBP7kH8KqxDwy5Qw36mQn # Service credentials from https://my.surfshark.com/vpn/manual-setup/main/openvpn password: pcmewxKTNPvLENdbKJGh8Cgt # Service credentials (not your login password)