From 3b1bbdb7fdf0f315a719472f1dbe3f322e069354 Mon Sep 17 00:00:00 2001 From: chu23465 <130033130+chu23465@users.noreply.github.com> Date: Thu, 17 Apr 2025 14:03:47 +0530 Subject: [PATCH] Fixes for HULU 4K and HS AVC 4K --- .../hisense_smarttv_he55a7000euwts_sl3000.prd | Bin 2108 -> 2108 bytes vinetrimmer/key_store.db | Bin 356352 -> 389120 bytes vinetrimmer/services/hulu.py | 4 +- vinetrimmer/utils/io.py | 2 +- vinetrimmer/utils/pyhulu.py | 4 +- vinetrimmer/vendor/pyhulu/__init__.py | 3 + vinetrimmer/vendor/pyhulu/client.py | 176 ++++++++++++++++++ vinetrimmer/vendor/pyhulu/device.py | 31 +++ vinetrimmer/vinetrimmer.py | 7 +- vt.py | 7 +- 10 files changed, 222 insertions(+), 12 deletions(-) create mode 100644 vinetrimmer/vendor/pyhulu/__init__.py create mode 100644 vinetrimmer/vendor/pyhulu/client.py create mode 100644 vinetrimmer/vendor/pyhulu/device.py diff --git a/vinetrimmer/devices/hisense_smarttv_he55a7000euwts_sl3000.prd b/vinetrimmer/devices/hisense_smarttv_he55a7000euwts_sl3000.prd index cee30dc2d833d2f9f6c0da80498ccacbb835c644..ee3ee0dbed9119d90d9c11be77dc4934b5a304a4 100644 GIT binary patch delta 516 zcmdlZut#7*O8p$Zb*ZX;VGbPnj3>6vPv22~gyoiS{ex(cH(xJ)p0;wO>KcCMr5k62 z>3cp>O<4K&+2j=fK07)0 zyfVKB6TjTih$0EAX1AhC`i$IJzvXWp`0vinJLUP*+VBa?iQn}dHC#1jt=9f#v~GgP zl$4IIe_NWhGt{eB8>Ss{2tBfHgWkgbnh9T~ubG{5{bQ|4y+JP*JIAz5$)2hc5@#Nf zyZG?q?PmmIMkcUR zNDN9zjIe|n$TZo2#l@lYSc?AkSL_qT9$hIobhhBltjiOO`o3%2TG6Y)JBxMp;sd|D n&o6wj*GHXmmhr(4EB0LS+Y&J+ZI$a2S2^>bjy#r4%r>k5ssQD& delta 516 zcmdlZut#7*NOUtX}!EW3^zt0MHTq@Xoli$7YPF~yb=65?=53IhZdf#+I zNayR4oFBo4M`kZDJ|Z7HBe3P;#Xm}w^W3ziYdH7k})v6uh!`UfVa3?h_gZ zFFZS0bl9%KFyfPFr{(Odwf}*jDqMnV?RHcNn2`zW z6cU3{5+f|31~N@HU~zF+aPdK0%(Q)(vr}%UJ$}FRq4UD>6;hV3YQLQP?Gh*9w72rm oj`;!m-bkv89Vzyxg0Lu^cL;wH) diff --git a/vinetrimmer/key_store.db b/vinetrimmer/key_store.db index 56272c78184add030a5dbb7b6fe371e068dc20b5..8ccaeac72f03d577583ab94734b7a275524c21b6 100644 GIT binary patch delta 26428 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 S+?th+Rfv4iE|tiMl>Q$eW#tF} delta 334 zcmZp8Al~pmbb_?t3I+y-a3F>O)`>dCJS!OVk{NmVe=rEJE}EFFxLMIbjCJ!O)+8$) z7XAYa{P*}@^IzaUuw8Hh(+2*@2mECjpG>~zFUiKknUP;o-2B(S{jWbG5HkTW^Yp*| zEbKf_I3F?hcpCI<>APPdO>W#7JF0m~CMCPty@2ad3GOy^s{Vn1E<7>hfr z8;h?m)ASD?Ssb?CT*0C(E@900i-F0J!ZrNUN zfW?_{dfH1C_wBz9vT(`q7&6&2@Gazv<`dyPH(lrfi^g`F2P~zGlMNgufvjfT?(&G` XKrI_1|2hW#bs+CA;h(-PpEU>oHEC*T diff --git a/vinetrimmer/services/hulu.py b/vinetrimmer/services/hulu.py index 71cea62..30f2a80 100644 --- a/vinetrimmer/services/hulu.py +++ b/vinetrimmer/services/hulu.py @@ -222,7 +222,9 @@ class Hulu(BaseService): )) except KeyError: pass - + + for track in tracks: + track.needs_proxy = False return tracks def get_chapters(self, title): diff --git a/vinetrimmer/utils/io.py b/vinetrimmer/utils/io.py index 6bc7721..96a76ff 100644 --- a/vinetrimmer/utils/io.py +++ b/vinetrimmer/utils/io.py @@ -273,7 +273,7 @@ async def m3u8dl(uri, out, track, headers=None, proxy=None): arguments.extend(["--http-request-timeout", "8"]) if track.__class__.__name__ == "VideoTrack": from vinetrimmer.objects.tracks import Track - if track.height and not (track.descriptor == Track.Descriptor.M3U): + if track.height and not (track.descriptor == Track.Descriptor.M3U) and track.source != "HS": arguments.extend([ "-sv", f"res='{track.height}*':codec='{track.codec}':for=best" ]) diff --git a/vinetrimmer/utils/pyhulu.py b/vinetrimmer/utils/pyhulu.py index 330e44c..2df34fe 100644 --- a/vinetrimmer/utils/pyhulu.py +++ b/vinetrimmer/utils/pyhulu.py @@ -3,7 +3,7 @@ import hashlib import logging import random -import pyhulu +from vinetrimmer.vendor.pyhulu.client import HuluClient class Device: # pylint: disable=too-few-public-methods @@ -30,7 +30,7 @@ class Device: # pylint: disable=too-few-public-methods ) -class HuluClient(pyhulu.HuluClient): +class HuluClient(HuluClient): def __init__(self, device, session, version=1, **kwargs): self.logger = logging.getLogger(__name__) self.device = device diff --git a/vinetrimmer/vendor/pyhulu/__init__.py b/vinetrimmer/vendor/pyhulu/__init__.py new file mode 100644 index 0000000..a9957a1 --- /dev/null +++ b/vinetrimmer/vendor/pyhulu/__init__.py @@ -0,0 +1,3 @@ +"""pyhulu - Python library for interacting with the E2E encrypted Hulu API""" + +from vinetrimmer.vendor.pyhulu.client import HuluClient diff --git a/vinetrimmer/vendor/pyhulu/client.py b/vinetrimmer/vendor/pyhulu/client.py new file mode 100644 index 0000000..ea50d42 --- /dev/null +++ b/vinetrimmer/vendor/pyhulu/client.py @@ -0,0 +1,176 @@ +""" +Client module + +Main module for Hulu API requests +""" + +import base64 +import binascii +import hashlib +import json +import logging +import random +import requests + +from Cryptodome.Cipher import AES +from Cryptodome.Util import Padding + +from vinetrimmer.vendor.pyhulu.device import Device + + +class HuluClient(object): + """ + HuluClient class + + Main class for Hulu API requests + + __init__: + + @param device_code: Three-digit string or integer (doesn't matter) + denoting the device you will make requests as + + @param device_key: 16-byte AES key that corresponds to the device + code you're using. This is used to decrypt the + device config response. + + @param cookies: Either a cookie jar object or a dict of cookie + key / value pairs. This is passed to the requests library, + so whatever it takes will work. Examples here: + http://docs.python-requests.org/en/master/user/quickstart/#cookies + + @return: HuluClient object + """ + + def __init__(self, device_code, device_key, cookies, version=1, extra_playlist_params={}): + self.logger = logging.getLogger(__name__) + self.device = Device(device_code, device_key) + self.cookies = cookies + self.version = version + self.extra_playlist_params = extra_playlist_params + + self.session_key, self.server_key = self.get_session_key() + + def load_playlist(self, video_id): + """ + load_playlist() + + Method to get a playlist containing the MPD + and license URL for the provided video ID and return it + + @param video_id: String of the video ID to get a playlist for + + @return: Dict of decrypted playlist response + """ + + base_url = 'https://play.hulu.com/v4/playlist' + params = { + 'device_identifier': hashlib.md5().hexdigest().upper(), + 'deejay_device_id': int(self.device.device_code), + 'version': self.version, + 'content_eab_id': video_id, + 'rv': random.randrange(1E5, 1E6), + 'kv': self.server_key, + } + params.update(self.extra_playlist_params) + + resp = requests.post(url=base_url, json=params, cookies=self.cookies) + ciphertext = self.__get_ciphertext(resp.text, params) + + return self.decrypt_response(self.session_key, ciphertext) + + def decrypt_response(self, key, ciphertext): + """ + decrypt_response() + + Method to decrypt an encrypted response with provided key + + @param key: Key in bytes + @param ciphertext: Ciphertext to decrypt in bytes + + @return: Decrypted response as a dict + """ + + aes_cbc_ctx = AES.new(key, AES.MODE_CBC, iv=b'\0'*16) + + try: + plaintext = Padding.unpad(aes_cbc_ctx.decrypt(ciphertext), 16) + except ValueError: + self.logger.error('Error decrypting response') + self.logger.error('Ciphertext:') + self.logger.error(base64.b64encode(ciphertext).decode('utf8')) + self.logger.error( + 'Tried decrypting with key %s', + base64.b64encode(key).decode('utf8') + ) + + raise ValueError('Error decrypting response') + + return json.loads(plaintext.decode('latin-1')) + + def get_session_key(self): + """ + get_session_key() + + Method to do a Hulu config request and calculate + the session key against device key and current server key + + @return: Session key in bytes + """ + + random_value = random.randrange(1E5, 1E6) + + base = '{device_key},{device},{version},{random_value}'.format( + device_key=binascii.hexlify(self.device.device_key).decode('utf8'), + device=self.device.device_code, + version=self.version, + random_value=random_value + ).encode('utf8') + + nonce = hashlib.md5(base).hexdigest() + + url = 'https://play.hulu.com/config' + payload = { + 'rv': random_value, + 'mozart_version': '1', + 'region': 'US', + 'version': self.version, + 'device': self.device.device_code, + 'encrypted_nonce': nonce + } + + resp = requests.post(url=url, data=payload) + ciphertext = self.__get_ciphertext(resp.text, payload) + + config_dict = self.decrypt_response( + self.device.device_key, + ciphertext + ) + + derived_key_array = bytearray() + for device_byte, server_byte in zip(self.device.device_key, + bytes.fromhex(config_dict['key'])): + derived_key_array.append(device_byte ^ server_byte) + + return bytes(derived_key_array), config_dict['key_id'] + + def __get_ciphertext(self, text, request): + try: + ciphertext = bytes.fromhex(text) + except ValueError: + self.logger.error('Error decoding response hex') + self.logger.error('Request:') + for line in json.dumps(request, indent=4).splitlines(): + self.logger.error(line) + + self.logger.error('Response:') + for line in text.splitlines(): + self.logger.error(line) + + raise ValueError('Error decoding response hex') + + return ciphertext + + def __repr__(self): + return '' % base64.b64encode( + self.session_key + ).decode('utf8') diff --git a/vinetrimmer/vendor/pyhulu/device.py b/vinetrimmer/vendor/pyhulu/device.py new file mode 100644 index 0000000..dbf2655 --- /dev/null +++ b/vinetrimmer/vendor/pyhulu/device.py @@ -0,0 +1,31 @@ +""" +Device module + +Module containing Device data class +""" + +import base64 + + +class Device(object): # pylint: disable=too-few-public-methods + """ + Device() + + Data class used for containing device attributes + """ + + def __init__(self, device_code, device_key): + self.device_code = str(device_code) + self.device_key = device_key + + if len(self.device_code) != 3: + raise ValueError('Invalid device code length') + + if len(self.device_key) != 16: + raise ValueError('Invalid device key length') + + def __repr__(self): + return '' % ( + self.device_code, + base64.b64encode(self.device_key).decode('utf8') + ) diff --git a/vinetrimmer/vinetrimmer.py b/vinetrimmer/vinetrimmer.py index d31f166..54ddec0 100644 --- a/vinetrimmer/vinetrimmer.py +++ b/vinetrimmer/vinetrimmer.py @@ -54,7 +54,9 @@ def main(debug): log = logging.getLogger("vt") - log.info("vinetrimmer - Widevine DRM downloader and decrypter") + log.debug(sys.argv) + + log.info("vinetrimmer - Widevine and Playready DRM downloader and decrypter") log.info(f"[Root Config] : {filenames.user_root_config}") log.info(f"[Service Configs] : {directories.service_configs}") log.info(f"[Cookies] : {directories.cookies}") @@ -71,8 +73,5 @@ def main(debug): dl() -# D:\PlayReady-Amazon-Tool-main\.venv\Scripts\python.exe -X pycache_prefix=C:\Users\Aswin\AppData\Local\JetBrains\PyCharm2024.3\cpython-cache "C:/Program Files (x86)/JetBrains/PyCharm 2024.2.4/plugins/python-ce/helpers/pydev/pydevd.py" --port 42000 --module --multiprocess --save-signatures --qt-support=auto --file poetry run vt dl --no-cache --keys AMZN 0H7LY5ZKKBM1MIW0244WE9O2C4 -# Above seems to work if __name__ == "__main__": - #sys.argv = ["vinetrimmer", "dl", "--no-cache", "--keys", "AMZN", "0H7LY5ZKKBM1MIW0244WE9O2C4"] main() diff --git a/vt.py b/vt.py index d31f166..54ddec0 100644 --- a/vt.py +++ b/vt.py @@ -54,7 +54,9 @@ def main(debug): log = logging.getLogger("vt") - log.info("vinetrimmer - Widevine DRM downloader and decrypter") + log.debug(sys.argv) + + log.info("vinetrimmer - Widevine and Playready DRM downloader and decrypter") log.info(f"[Root Config] : {filenames.user_root_config}") log.info(f"[Service Configs] : {directories.service_configs}") log.info(f"[Cookies] : {directories.cookies}") @@ -71,8 +73,5 @@ def main(debug): dl() -# D:\PlayReady-Amazon-Tool-main\.venv\Scripts\python.exe -X pycache_prefix=C:\Users\Aswin\AppData\Local\JetBrains\PyCharm2024.3\cpython-cache "C:/Program Files (x86)/JetBrains/PyCharm 2024.2.4/plugins/python-ce/helpers/pydev/pydevd.py" --port 42000 --module --multiprocess --save-signatures --qt-support=auto --file poetry run vt dl --no-cache --keys AMZN 0H7LY5ZKKBM1MIW0244WE9O2C4 -# Above seems to work if __name__ == "__main__": - #sys.argv = ["vinetrimmer", "dl", "--no-cache", "--keys", "AMZN", "0H7LY5ZKKBM1MIW0244WE9O2C4"] main()