From 1244141df26bc05ec3acb1ecebde7266152f8e13 Mon Sep 17 00:00:00 2001 From: kenzuya Date: Tue, 10 Mar 2026 12:45:59 +0700 Subject: [PATCH] fix(netflix): align MSL manifest payload with Chrome Widevine Update Netflix manifest request construction to better match current Widevine-on-Chrome behavior by: - setting top-level and param `clientVersion` to `9999999` - sending `challenge` only for Chrome Widevine requests - removing hardcoded device/platform fields from params Also refresh Android TV ESN mappings in config by replacing ESN `7110` and adding ESN `16401` for Hisense devices to improve request validity. --- unshackle/services/Netflix/__init__.py | 22 +++++++++------------- unshackle/services/Netflix/config.yaml | 3 ++- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/unshackle/services/Netflix/__init__.py b/unshackle/services/Netflix/__init__.py index 81a7420..68e87a1 100644 --- a/unshackle/services/Netflix/__init__.py +++ b/unshackle/services/Netflix/__init__.py @@ -831,17 +831,17 @@ class Netflix(Service): "id": int(time.time()), "esn": self.esn.data["esn"], "languages": ["en-US"], - "clientVersion": "6.0026.291.011", + "clientVersion": "9999999", "params": { - "clientVersion": "6.0051.090.911", - "challenge": self.config["payload_challenge_pr"] if self.drm_system == 'playready' else self.config["payload_challenge"], - # "challenge": base64.b64encode(challenge).decode(), - "challanges": { - # "default": base64.b64encode(challenge).decode() - "default": self.config["payload_challenge_pr"] if self.drm_system == 'playready' else self.config["payload_challenge"] - }, + "clientVersion": "9999999", + **({ + "challenge": self.config["payload_challenge"] + } if self.drm_system == "widevine" and self.cdm.device_type == DeviceTypes.CHROME else {}), + # "challanges": { + # # "default": base64.b64encode(challenge).decode() + # "default": self.config["payload_challenge_pr"] if self.drm_system == 'playready' else self.config["payload_challenge"] + # }, "contentPlaygraph": ["v2"], - "deviceSecurityLevel": "3000", "drmVersion": 25, "desiredVmaf": "plus_lts", "desiredSegmentVmaf": "plus_lts", @@ -854,10 +854,6 @@ class Netflix(Service): "licenseType": "standard", "liveAdsCapability": "replace", "liveMetadataFormat": "INDEXED_SEGMENT_TEMPLATE", - "manifestVersion": "v2", - "osName": "windows", - "osVersion": "10.0", - "platform": "145.0.0.0", "profilesGroups": [{ "name": "default", "profiles": video_profiles diff --git a/unshackle/services/Netflix/config.yaml b/unshackle/services/Netflix/config.yaml index a872f28..712e045 100644 --- a/unshackle/services/Netflix/config.yaml +++ b/unshackle/services/Netflix/config.yaml @@ -22,7 +22,8 @@ esn_map: 8131: "HISETVK84500000000000000000000000007401422" 22590: "NFANDROID1-PXA-P-L3-XIAOMM2102J20SG-22590-020NTB086HJPGG70MDDMR0306MR0NNO5G3DJGFCKS9HJF58ER9QA21VFG4I0246JRN6TF16L9I627EPK708SH42UUMG1ASFVG20F3" 12063: "NFANDROID1-PRV-P-SHENZHENKTC-49B1U-12063-2PAENERYJWY35H7F24163TMUCBBA4VRHQ2XZX4OBU4MUTKYFW50BMFBVGTUMN6IM0" - 7110: "NFANDROID1-PRV-P-MSD6886602GUHDANDROIDTV-HISENHISMARTTV-A4-7110-D34E1ECACCDBE518DBA0CCE8A4D1D48248ACB5C1A2BAEB2ADFF1040C5AE3FF42" + 7110: "NFANDROID1-PRV-P-MSD6886602GUHDANDROIDTV-HISENHISMARTTV-A4-7110-5EAE417AE3DB234B5FFC4EFC289A1B11D4475CC5949186C83F4C3D20FF203972" + 16401: "NFANDROID1-PRV-P-MSD6886602GUHDANDROIDTV-HISENHISMARTTV-A4-16401-FA2CF15C2E3A00BDDC3B6811C210893F0CD2C062471A62C2A0DD8C28BAE8DF42" endpoints: website: "https://www.netflix.com/nq/website/memberapi/{build_id}/pathEvaluator" manifest: "https://www.netflix.com/msl/playapi/cadmium/licensedmanifest/1"