From 09e03b47f76d78b09e3b72fc8efc89e3f1c1a4fe Mon Sep 17 00:00:00 2001 From: Aswin Date: Mon, 7 Apr 2025 00:45:16 +0530 Subject: [PATCH] Hotstar with DRM I forgot to test Hotstar with DRM. Made changes to support DRM correctly. --- vinetrimmer/commands/dl.py | 7 ++++--- vinetrimmer/key_store.db | Bin 290816 -> 323584 bytes vinetrimmer/objects/tracks.py | 2 ++ vinetrimmer/parsers/mpd.py | 32 ++++++++++++++++++++++++-------- vinetrimmer/utils/io.py | 8 +++----- 5 files changed, 33 insertions(+), 16 deletions(-) diff --git a/vinetrimmer/commands/dl.py b/vinetrimmer/commands/dl.py index 6270bb0..8332fb6 100644 --- a/vinetrimmer/commands/dl.py +++ b/vinetrimmer/commands/dl.py @@ -27,6 +27,7 @@ from vinetrimmer.utils.click import (AliasedGroup, ContextData, acodec_param, la from vinetrimmer.utils.collections import as_list, merge_dict from vinetrimmer.utils.io import load_yaml from pywidevine import Device, Cdm, RemoteCdm +from pywidevine import PSSH as PSSHWV from vinetrimmer.vendor.pymp4.parser import Box @@ -476,7 +477,7 @@ def result(ctx, service, quality, range_, wanted, alang, slang, audio_only, subs skip_title = True break if "common_privacy_cert" in dir(ctx.obj.cdm): - session_id = ctx.obj.cdm.open(track.pssh) + session_id = ctx.obj.cdm.open() log.info(f"CDM Session ID - {session_id.hex()}") ctx.obj.cdm.set_service_certificate( session_id, @@ -490,7 +491,7 @@ def result(ctx, service, quality, range_, wanted, alang, slang, audio_only, subs ctx.obj.cdm.parse_license( session_id, service.license( - challenge=ctx.obj.cdm.get_license_challenge(session_id), + challenge=ctx.obj.cdm.get_license_challenge(session_id=session_id, pssh=PSSHWV(track.pssh)), title=title, track=track, session_id=session_id @@ -515,7 +516,7 @@ def result(ctx, service, quality, range_, wanted, alang, slang, audio_only, subs content_keys = [ - (x.kid, x.key) for x in ctx.obj.cdm.get_keys(session_id, content_only=True) + (str(x.kid).replace("-", ""), x.key.hex()) for x in ctx.obj.cdm.get_keys(session_id) if x.type == "CONTENT" ] if "common_privacy_cert" in dir(ctx.obj.cdm) else [ (str(x.key_id).replace("-", ""), x.key.hex()) for x in ctx.obj.cdm.get_keys(session_id) ] diff --git a/vinetrimmer/key_store.db b/vinetrimmer/key_store.db index 9ab4f96445376db1466eff830108b89fedde88c7..e02d63cef4c9547b36024fcd7efbb32af1e21c50 100644 GIT binary patch delta 37545 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