VideoHelp Forum




+ Reply to Thread
Results 1 to 25 of 25
  1. I just got a promising response from a license server and i'm pretty sure that the keys are under "contentKeyIds".
    While i'm aware that these are Base64 encoded (hex), i'm not sure how to get them into the <keyid>:<key> format.
    There's a DEFAULT_KID in the original mpd (
    Code:
    872DEBCC-B7C8-4B6F-91A1-7F69B2A13A24
    ) but it's above PlayReady, so i think it belongs to that.
    The Widevine PSSH (Box!) is:
    Code:
    AAAAeXBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAFkIARIQhy3rzLfIS2+RoX9psqE6JBoGYW1hem9uIjVjaWQ6TFk4N3Y1RnZRK1NqTkpVYXM2MnREUT09LGh5M3J6TGZJUzIrUm9YOXBzcUU2SkE9PSoCU0QyAA==
    whose Key ID then is:
    Code:
    872debcc-b7c8-4b6f-91a1-7f69b2a13a24
    I AM USING FREEVEE!
    Code:
    {
      "returnedTitleRendition": {
        "asin": "B0CLZ3RFDY",
        "assetBundleVideoQuality": "HD",
        "audioQuality": "Stereo",
        "contentId": "amzn1.dv.vcid.a6cd5789-8c99-4c15-8212-6aae570e2082",
        "pid": "com.amazon.playback.object.vod.19329F47-5ADF-42C1-8C8B-1487B6C254EA",
        "selectedEntitlement": {
          "benefit": "freewithads",
          "consumptionExpiration": "1710618721626",
          "entitlementType": "THIRD_PARTY_SUBSCRIPTION",
          "grantedByCustomerId": "A195Q9JBOPVNNR",
          "tierId": "amzn1.dv.spbcmd.d3b9f545-452a-4a08-8a00-f925e0929ea9"
        },
        "titleId": "B0CLZ3RFDY",
        "videoMaterialType": "Feature",
        "videoQuality": "HD",
        "videoResolution": "720p"
      },
      "widevine2License": {
        "license": "CAIShgMKLAoQocW0eC5dNw0veIdLIZ6+MBIIiY8Xhde8ur4gASgAOP/oD0AASPX6x68GEiAIARAAGAAg/+gPKAAw/+gPOABCAEgAUABYAGAAcAB4ARpiChC3cNW0u2tZTa+YWEWq6apfEhAdpEI4SSwtTlqxc3vo8hZvGhAzZev/1Jda5crlJom9VKJ0IAIoATIICAEQKhgAIAA6CAgBECoYACAAQhIKEGtjMTYAA/R/L4Z3luAAAgwaYgoQLY87v5FvQ+SjNJUas62tDRIQ9NMNMSDfAbPEL9/LLmAUlxoQ0CNyB1HYLBUxzROvZN1K9CACKAEyCAgAECoYACAAOggIARAqGAAgAEISChBrYzE2AAP0fy+Gd5agAAAIGmIKEIct68y3yEtvkaF/abKhOiQSEMumkaKgN/qH9qDx+2FjI0UaEOERx53ZTq8L9JFJ1aUuQNIgAigCMggIABAqGAAgADoICAEQKhgAIABCEgoQa2MxNgAD9H8vhneWpAAACCD1+sevBjgAUAIaIFH8+j5kxkeCuXSffcGbsO6DhNkCBEipq6NPfA/23YUhIoABleKJYF0/caA6GzxuKhv9PZVlfx9anGhC6QaJd5Q37/vFQelC8/4YVSiNk4Nair5cI2x3KMN44ZAPtQ88+1tpMuk9ZQvFBFJUxHb1lsqYbt4MkAXJrOHsLaV/+83eDwWuhBu4X+YYYHbDlp1SHCXGNSPpF45W5vJIgM8Vn2/Dmzg6CAoGMTYuNC40QAFKgAIAAAACAAABAAAFABAvhneWipJNlwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAD9H8AAAAAAAAAAAAAAAAAAAAAAAAAAwAAAFQAAAAQAAAAZgAAABAAAAB4AAAAEAAAAAAAAAAAAAAApAAAABAAAAC4AAAAEAAAAMoAAAAQAAAA3AAAABAAAAAAAAAAAAAAAQgAAAAQAAABHAAAABAAAAEuAAAAEAAAAUAAAAAQAAAAAAAAAAAAAAFsAAAAEPRnQirviRsKLjUY6zC534p70gwimNTsj6ka9zKmZXYgWAA=",
        "metadata": {
          "keyIds": {
            "contentKeyIds": [
              "LY87v5FvQ+SjNJUas62tDQ==",
              "hy3rzLfIS2+RoX9psqE6JA=="
            ],
            "hdcpTestKeyId": "t3DVtLtrWU2vmFhFqumqXw=="
          },
          "keyMetadata": [
            {
              "hdcp": {
                "hdcp": "HDCP_V1"
              },
              "id": "t3DVtLtrWU2vmFhFqumqXw==",
              "keyType": "HDCP_TEST"
            },
            {
              "hdcp": {
                "hdcp": "HDCP_NONE"
              },
              "id": "LY87v5FvQ+SjNJUas62tDQ==",
              "keyType": "CONTENT"
            },
            {
              "hdcp": {
                "hdcp": "HDCP_NONE"
              },
              "id": "hy3rzLfIS2+RoX9psqE6JA==",
              "keyType": "CONTENT"
            }
          ]
        }
      }
    }
    Quote Quote  
  2. The thing is, pywidevine/cdm.py is throwing an error when it's fed the request response, even though it seems to be correct:
    Code:
    Traceback (most recent call last):
      File ".\pywidevine\cdm.py", line 407, in parse_license
        signed_message.ParseFromString(license_message)
    google.protobuf.message.DecodeError: Error parsing message with type 'pywidevine_license_protocol.SignedMessage'
    and
    Code:
    Traceback (most recent call last):
      File "amazondl.py", line 24, in <module>
        cdm.parse_license(session_id, license.content)
      File ".\pywidevine\cdm.py", line 411, in parse_license
        raise InvalidLicenseMessage(f"Could not parse license_message as a SignedMessage, {e}")
    pywidevine.exceptions.InvalidLicenseMessage: Could not parse license_message as a SignedMessage, Error parsing message with type 'pywidevine_license_protocol.SignedMessage'
    Quote Quote  
  3. Well now i don't know what to do:
    Image
    [Attachment 77658 - Click to enlarge]

    the "keys" i obtained are just these in the EME Logger
    Quote Quote  
  4. Should be something like this in your L3 script:

    Code:
    response_json = json.loads(license.content)
    lic = response_json['widevine2License']['license']
    cdm.parse_license(session_id, lic)
    Quote Quote  
  5. (i implemented the changes from @white_snake)

    Code:
    InvalidContext: Cannot parse a license message without first making a license request
    The error is described as
    Code:
    If the Session has no Context Data. This is likely to happen
                    if the License Challenge was not made by this CDM instance, or was not
                    by this CDM at all. It could also happen if the Session is closed after
                    calling parse_license but not before it got the context data.
    in the cdm.py
    which makes sense i guess, but i have no idea what could fox this.
    ideas are welcome
    Quote Quote  
  6. You have to integrate my change correctly, post your full L3 script.
    Quote Quote  
  7. Sure
    Code:
    import glob
    import requests
    import headers
    import json
    from pywidevine.device import Device
    from pywidevine.cdm import Cdm
    from pywidevine.pssh import PSSH
    
    if __name__ == '__main__':
    	files = glob.glob('Device/*.wvd')
    
    	device = Device.load(files[0])
    	cdm = Cdm.from_device(device)
    	session_id = cdm.open()
    	
    	#pssh = PSSH(input("PSSH: "))
    	pssh = PSSH("AAAAeXBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAFkIARIQhy3rzLfIS2+RoX9psqE6JBoGYW1hem9uIjVjaWQ6TFk4N3Y1RnZRK1NqTkpVYXM2MnREUT09LGh5M3J6TGZJUzIrUm9YOXBzcUU2SkE9PSoCU0QyAA==")
    	#challenge = cdm.get_license_challenge(session_id, pssh)
    	lic_url	= input("License URL: ")
    
    	license = requests.post(url=lic_url, headers=headers.headers, params=headers.params, data=headers.data, cookies=headers.cookies)
    	license.raise_for_status()
    
    	print("\n" + str(license.content) + "\n")
    
    	response_json = json.loads(license.content)
    	lic = response_json['widevine2License']['license']
    	cdm.parse_license(session_id, lic)
    
    	#cdm.parse_license(session_id, license.content)
    
    	for key in cdm.get_keys(session_id):
    		if key.type != 'SIGNING':
    		   key_info = f"{key.kid.hex}:{key.key.hex()}\n"
    		   print(key_info)
    Quote Quote  
  8. Error message was right:

    This is likely to happen if the License Challenge was not made by this CDM instance, or was not by this CDM at all.
    in fact you're providing the challenge from data=headers.data, which means you're using the challenge from your browser CDM, not from your own dumped CDM. So to fix it your should first uncomment the line:
    Code:
    #challenge = cdm.get_license_challenge(session_id, pssh)
    and then in your request have:
    Code:
    data=challenge
    This is not guaranteed to work, because the challenge might need to be provided in a different form. Until I can see the license request payload I can't be sure of that.
    Quote Quote  
  9. when i feed the challenge as base64 into requests i just get this generic answer:
    i also tried just the pssh data as input, didn't work.
    i'm confused because the error is saying that the license challenge is correct, but it worked (got a license), so for it to actually work i'd have to get a license from the server with my own challenge?
    Code:
    {
      "errorsByResource": {
        "Widevine2License": {
          "errorCode": "PRS.InvalidRequest",
          "message": "Cannot complete request.",
          "type": "PRSInvalidRequestException"
        }
      },
      "returnedTitleRendition": {
        "asin": "B0CLZ3RFDY",
        "assetBundleVideoQuality": "HD",
        "audioQuality": "Stereo",
        "contentId": "amzn1.dv.vcid.a6cd5789-8c99-4c15-8212-6aae570e2082",
        "pid": "com.amazon.playback.object.vod.19329F47-5ADF-42C1-8C8B-1487B6C254EA",
        "selectedEntitlement": {
          "benefit": "freewithads",
          "consumptionExpiration": "1710692482031",
          "entitlementType": "THIRD_PARTY_SUBSCRIPTION",
          "grantedByCustomerId": "A195Q9JBOPVNNR",
          "tierId": "amzn1.dv.spbcmd.d3b9f545-452a-4a08-8a00-f925e0929ea9"
        },
        "titleId": "B0CLZ3RFDY",
        "videoMaterialType": "Feature",
        "videoQuality": "HD",
        "videoResolution": "720p"
      }
    }
    the script now:
    Code:
    challenge = cdm.get_license_challenge(session_id, pssh)
    license = requests.post(url=lic_url, headers=headers.headers, params=headers.params, data=base64.b64encode(challenge), cookies=headers.cookies)
    Quote Quote  
  10. You got a response, but not a license, in fact in the latter response the following is missing:

    Code:
    widevine2License": {
        "license"
    Yes, you need to use the challenge that comes from your dumped CDM.

    I suggest you post the license url request payload from your browser in raw/source form.
    Quote Quote  
  11. i know, i was referring to the first time i got a license (https://forum.videohelp.com/threads/413795-Extract-Keys-from-License-Server-response#post2727851)

    anyways, i think you're referring to the request headers of the license url?
    i left out my session token btw
    Code:
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:123.0) Gecko/20100101 Firefox/123.0',
        'Accept': '*/*',
        'Accept-Language': 'en-US,en;q=0.5',
        # 'Accept-Encoding': 'gzip, deflate, br',
        'Content-Type': 'application/x-www-form-urlencoded',
        'Origin': 'https://www.amazon.de',
        'Connection': 'keep-alive',
        'Referer': 'https://www.amazon.de/',
        'Cookie': 'session-id=260-1996516-3016232; session-id-time=2082787201l; ubid-acbde=257-8243882-7781813; session-token=',
        'Sec-Fetch-Dest': 'empty',
        'Sec-Fetch-Mode': 'cors',
        'Sec-Fetch-Site': 'same-site',
        'Sec-GPC': '1',
    }
    
    params = {
        'deviceID': '00c2942e-2382-4b60-875c-8f07d8765b85',
        'deviceTypeID': 'AOAGZA014O5RE',
        'gascEnabled': 'false',
        'marketplaceID': 'A1PA6795UKMFR9',
        'uxLocale': 'de_DE',
        'firmware': '1',
        'playerType': 'xp',
        'operatingSystemName': 'Windows',
        'operatingSystemVersion': '10.0',
        'deviceApplicationName': 'Firefox64',
        'asin': 'amzn1.dv.gti.21608621-f43f-41d6-a201-1b892868aca1',
        'consumptionType': 'Streaming',
        'desiredResources': 'Widevine2License',
        'resourceUsage': 'ImmediateConsumption',
        'videoMaterialType': 'Feature',
        'clientId': 'f22dbddb-ef2c-48c5-8876-bed0d47594fd',
        'userWatchSessionId': 'bbad1c56-0ea0-427d-a569-f191d724b898',
        'displayWidth': '1920',
        'displayHeight': '1080',
        'supportsVariableAspectRatio': 'true',
        'deviceProtocolOverride': 'Https',
        'vodStreamSupportOverride': 'Auxiliary',
        'deviceStreamingTechnologyOverride': 'DASH',
        'deviceDrmOverride': 'CENC',
        'deviceAdInsertionTypeOverride': 'SSAI',
        'deviceHdrFormatsOverride': 'None',
        'deviceVideoCodecOverride': 'H264',
        'deviceVideoQualityOverride': 'HD',
        'deviceBitrateAdaptationsOverride': 'CVBR,CBR',
        'playerAttributes': '{"middlewareName":"Firefox64","middlewareVersion":"123.0","nativeApplicationName":"Firefox64","nativeApplicationVersion":"123.0","supportedAudioCodecs":"AAC","frameRate":"HFR","H264.codecLevel":"4.2","H265.codecLevel":"0.0","AV1.codecLevel":"0.0"}',
    }
    
    data = {
        'widevine2Challenge': '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',
        'includeHdcpTestKeyInLicense': 'true',
    }
    this is how the leaked WV-AMZN-4K-RIPPER does it:
    Code:
    def _license(self, url, headers, pssh, cert, device = (None, False, None)):
            cert = 'CAUSwgUKvAIIAxIQCuQRtZRasVgFt7DIvVtVHBi17OSpBSKOAjCCAQoCggEBAKU2UrYVOSDlcXajWhpEgGhqGraJtFdUPgu6plJGy9ViaRn5mhyXON5PXmw1krQdi0SLxf00FfIgnYFLpDfvNeItGn9rcx0RNPwP39PW7aW0Fbqi6VCaKWlR24kRpd7NQ4woyMXr7xlBWPwPNxK4xmR/6UuvKyYWEkroyeIjWHAqgCjCmpfIpVcPsyrnMuPFGl82MMVnAhTweTKnEPOqJpxQ1bdQvVNCvkba5gjOTbEnJ7aXegwhmCdRQzXjTeEV2dO8oo5YfxW6pRBovzF6wYBMQYpSCJIA24ptAP/2TkneyJuqm4hJNFvtF8fsBgTQQ4TIhnX4bZ9imuhivYLa6HsCAwEAAToPYW1hem9uLmNvbS1wcm9kEoADETQD6R0H/h9fyg0Hw7mj0M7T4s0bcBf4fMhARpwk2X4HpvB49bJ5Yvc4t41mAnXGe/wiXbzsddKMiMffkSE1QWK1CFPBgziU23y1PjQToGiIv/sJIFRKRJ4qMBxIl95xlvSEzKdt68n7wqGa442+uAgk7CXU3uTfVofYY76CrPBnEKQfad/CVqTh48geNTb4qRH1TX30NzCsB9NWlcdvg10pCnWSm8cSHu1d9yH+2yQgsGe52QoHHCqHNzG/wAxMYWTevXQW7EPTBeFySPY0xUN+2F2FhCf5/A7uFUHywd0zNTswh0QJc93LBTh46clRLO+d4RKBiBSj3rah6Y5iXMw9N9o58tCRc9gFHrjfMNubopWHjDOO3ATUgqXrTp+fKVCmsGuGl1ComHxXV9i1AqHwzzY2JY2vFqo73jR3IElr6oChPIwcNokmNc0D4TXtjE0BoYkbWKJfHvJJihzMOvDicWUsemVHvua9/FBtpbHgpbgwijFPjtQF9Ldb8Swf'
            headers = (lambda .0: for k, v in .0:
    if k != 'User-Agent':
    continuev)(headers.items())
            wvdecrypt = WvDecrypt(pssh, cert, device)
            challenge = wvdecrypt.get_challenge()
            license_b64 = self.widevine_cert(challenge, url, headers)
            wvdecrypt.update_license(license_b64)
            (_, keyswvdecrypt) = wvdecrypt.start_process()
            KEYS = keyswvdecrypt
            return KEYS
    Last edited by larley; 14th Mar 2024 at 12:50.
    Quote Quote  
  12. Add/change this:
    Code:
    json_payload = {
        'widevine2Challenge': base64.b64encode(challenge).decode('utf-8'),
        'includeHdcpTestKeyInLicense': 'true',
    }
    
    license = requests.post(url=lic_url, json=json_payload, headers=headers.headers, params=headers.params, cookies=headers.cookies)
    Not sure if and what headers/params/cookies are needed, that's up to you to determine.
    Quote Quote  
  13. that actually helped (the error changed ):
    Code:
    {
      "errorsByResource": {
        "Widevine2License": {
          "downstreamReason": "vmp_validation_required",
          "errorCode": "PRS.Dependency.DRM.Widevine.HdContentNotAllowed.VmpValidationRequired",
          "message": "Cannot complete request.",
          "type": "PRSWidevine2LicenseDeniedException"
        }
      },
      "returnedTitleRendition": {
        "asin": "amzn1.dv.gti.21608621-f43f-41d6-a201-1b892868aca1",
        "assetBundleVideoQuality": "HD",
        "audioQuality": "Stereo",
        "contentId": "amzn1.dv.vcid.a6cd5789-8c99-4c15-8212-6aae570e2082",
        "pid": "com.amazon.playback.object.vod.19329F47-5ADF-42C1-8C8B-1487B6C254EA",
        "selectedEntitlement": {
          "benefit": "freewithads",
          "consumptionExpiration": "1710698799702",
          "entitlementType": "THIRD_PARTY_SUBSCRIPTION",
          "grantedByCustomerId": "A195Q9JBOPVNNR",
          "tierId": "amzn1.dv.spbcmd.d3b9f545-452a-4a08-8a00-f925e0929ea9"
        },
        "titleId": "amzn1.dv.gti.21608621-f43f-41d6-a201-1b892868aca1",
        "videoMaterialType": "Feature",
        "videoQuality": "HD",
        "videoResolution": "720p"
      }
    }
    i added the json payload under "data=" not "json=" in the requests parts
    i used a different cdm and got this:
    Code:
    {
      "errorsByResource": {
        "Widevine2License": {
          "downstreamReason": "untrusted_device",
          "errorCode": "PRS.Dependency.DRM.Widevine.UnsupportedCdmVersion",
          "message": "Cannot complete request.",
          "type": "PRSWidevine2LicenseDeniedException"
        }
      },
      "returnedTitleRendition": {
        "asin": "amzn1.dv.gti.21608621-f43f-41d6-a201-1b892868aca1",
        "assetBundleVideoQuality": "HD",
        "audioQuality": "Stereo",
        "contentId": "amzn1.dv.vcid.a6cd5789-8c99-4c15-8212-6aae570e2082",
        "pid": "com.amazon.playback.object.vod.19329F47-5ADF-42C1-8C8B-1487B6C254EA",
        "selectedEntitlement": {
          "benefit": "freewithads",
          "consumptionExpiration": "1710699036097",
          "entitlementType": "THIRD_PARTY_SUBSCRIPTION",
          "grantedByCustomerId": "A195Q9JBOPVNNR",
          "tierId": "amzn1.dv.spbcmd.d3b9f545-452a-4a08-8a00-f925e0929ea9"
        },
        "titleId": "amzn1.dv.gti.21608621-f43f-41d6-a201-1b892868aca1",
        "videoMaterialType": "Feature",
        "videoQuality": "HD",
        "videoResolution": "720p"
      }
    }
    Quote Quote  
  14. Originally Posted by larley View Post
    ok this is the end. i just read this:
    https://forum.videohelp.com/threads/401717-How-are-you-going-to-respond-to-widevine-l3...56#post2646535
    so it seems like this isn't going to work (i think)
    Yup I think so. More info here: https://github.com/Sandmann79/xbmc/issues/294#issuecomment-479558716 (maybe one can still grab sd content that way?)
    Quote Quote  
  15. i removed operatingSystemName and operatingSystemVersion from my license url and params but that didn't change anything ...
    Quote Quote  
  16. Here's a comparison of the GetPlaybackResources url from an Android Chrome Browser and Firefox on Windows:
    Quote Quote  
  17. Omg i got keys
    480p keys!!!!
    Code:
    b770d5b4bb6b594daf985845aae9aa5f:b0cb46d2d31cf044bc73db71e9865f6f
    14b5a91ed49c4beb85eaa79cc0fa4964:3a4ed70b8740c975c265e90640c3f7d7
    1ae09d8dbd5844dfac8318b5d9b060de:99d8be97ddadf993d2274db54b4dc6ae
    for:
    Code:
    https://s3-dub-ww.cf.dash.row.aiv-cdn.net/dm/2$dJgpc0RTkFXi2uQ7B3GE2RLwS-0~/8682/bc20/c6f3/4e7e-8d0b-5c919a962092/2cccd819-aa5d-4851-9438-47453c0a35e0_corrected.mpd?amznDtid=AOAGZA014O5RE&encoding=segmentBase
    i'll explain it in a sec (after i've tried decrypting it)

    license server response:
    Code:
    {
      "returnedTitleRendition": {
        "asin": "amzn1.dv.gti.21608621-f43f-41d6-a201-1b892868aca1",
        "assetBundleVideoQuality": "SD",
        "audioQuality": "Stereo",
        "audioTrackId": "all",
        "contentId": "amzn1.dv.vcid.a6cd5789-8c99-4c15-8212-6aae570e2082",
        "pid": "com.amazon.playback.object.vod.214C35C0-01C1-45E2-87CB-4EFD89665BC3",
        "selectedEntitlement": {
          "benefit": "freewithads",
          "consumptionExpiration": "1710856453499",
          "entitlementType": "THIRD_PARTY_SUBSCRIPTION",
          "grantedByCustomerId": "A195Q9JBOPVNNR",
          "tierId": "amzn1.dv.spbcmd.d3b9f545-452a-4a08-8a00-f925e0929ea9"
        },
        "titleId": "amzn1.dv.gti.21608621-f43f-41d6-a201-1b892868aca1",
        "videoMaterialType": "Feature",
        "videoQuality": "SD",
        "videoResolution": "480p"
      },
      "widevine2License": {
        "license": "CAISpwQKMAogRDU1NEU0NkQwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDASCLVNz93rTYZCIAEoABIgCAEQABgAIP/oDygAMP/oDzgAQgBIAFAAWABgAHAAeAEalgEKELdw1bS7a1lNr5hYRarpql8SEAlR/nhZYCXdpYN1OPssrJkaID0vhfEtoFXfSsE0J6K9+qa3GfgbAH0o8UNPmTc7E2eWIAIoATIICAEQKhgAIAA6CAgBECoYACAAQjQKIBPMDC/Itw7bkEM1ET6+h8pc+j+0Jz8Tp8DtHCY6SEerEhCEybbuXoamVsJJ4vw5qZY+YgAalgEKEBS1qR7UnEvrheqnnMD6SWQSEMJmJTJczYz9NVYa4g79Sr8aIMcft+u983ZV9pfo54EBoR8qalOY3gDzXh8N1MSxKWZ/IAIoATIICAAQKhgAIAA6CAgBECoYACAAQjQKIEYpy/5w3tWXq1+q2V9JORt0yvbKbJLWoojGKnEo0DhXEhAXpHSSzXkm3YPiD3iWojj8YgAalgEKEBrgnY29WETfrIMYtdmwYN4SEB/tdNi7T1jSGlxFhHkSfrUaIJXtK/F8RCmYDcdJ46ucWdBJy26a+kg00A7hwBkSz+/kIAIoAjIICAAQKhgAIAA6CAgBECoYACAAQjQKIEEqP/JIwfO5nPVmu92NNCSkz9oix/idbhmAON7gVipJEhBLO3NVWS/27q8tZd09ocpyYgAghMnWrwY4ABogRtDhc76si2d8RPUkRwXz/pLcUUtCxzuH7Kbv5d0//nsigAJ2nwLGFTguhXZpgpJKerWLuXi1AXs7ot40mdppC8DvFHiwlZd56kHgBfr+fkKk/lUcBAy1FiANcKcXHDPKrR0xwVYBOHhB27+QoECd/mvahu8+gWAHbTIiNFCHIQWDykLe9y9Yf7ziurniKi7xhRERhS1vBqjdUN1AVHSMze0LFi9B05oUr567pA862TOe6OhmJaw3hBpfsKEQb6O9GGOgjwmh+MbJoRSNWngOpa8VeBL+pDyF+sAHheA3BuIUYTkNPtgUtLhGAgITDIQgOZLLYYU9bRWMYapZT/8vukkfXN7vdb8wMFzS1B/ARnww1ikv519xA6G7jITGk0TwnL+wOggKBjE4LjAuMUABWAA=",
        "metadata": {
          "keyIds": {
            "contentKeyIds": [
              "FLWpHtScS+uF6qecwPpJZA==",
              "GuCdjb1YRN+sgxi12bBg3g=="
            ],
            "hdcpTestKeyId": "t3DVtLtrWU2vmFhFqumqXw=="
          },
          "keyMetadata": [
            {
              "hdcp": {
                "hdcp": "HDCP_V1"
              },
              "id": "t3DVtLtrWU2vmFhFqumqXw==",
              "keyType": "HDCP_TEST"
            },
            {
              "hdcp": {
                "hdcp": "HDCP_NONE"
              },
              "id": "FLWpHtScS+uF6qecwPpJZA==",
              "keyType": "CONTENT"
            },
            {
              "hdcp": {
                "hdcp": "HDCP_NONE"
              },
              "id": "GuCdjb1YRN+sgxi12bBg3g==",
              "keyType": "CONTENT"
            }
          ]
        }
      }
    }
    omg it's working

    just set your user agent to android
    send a request to the amazon webpage
    retrieve the pssh from the mpd file (doesn't need to be a pssh box)
    i found that you only need three cookie values in your headers.py:
    Code:
    ubid-acbde
    x-acbde
    at-acbde
    no headers, no params
    for the license URL, choose one of the "GetPlaybackResources" that contains "desiredResources=Widevine2License"
    then use this script:
    Code:
    import glob
    import requests
    import headers
    import json
    import base64
    from pywidevine.device import Device
    from pywidevine.cdm import Cdm
    from pywidevine.pssh import PSSH
    
    if __name__ == '__main__':
    	files = glob.glob('Device/*.wvd')
    
    	device = Device.load(files[0])
    	cdm = Cdm.from_device(device)
    	session_id = cdm.open()
    	
    	pssh = PSSH(input("PSSH: "))
    	challenge = cdm.get_license_challenge(session_id, pssh)
    	lic_url = input("License URL: ")
    
    	json_payload = {
    		'widevine2Challenge': base64.b64encode(challenge).decode('utf-8'),
    		'includeHdcpTestKeyInLicense': 'true'
    	}
    
    	license = requests.post(url=lic_url, data=json_payload, cookies=headers.cookies)
    	license.raise_for_status()
    
    	response_json = json.loads(license.content)
    	lic = response_json['widevine2License']['license']
    	cdm.parse_license(session_id, lic)
    
    	for key in cdm.get_keys(session_id):
    		if key.type != 'SIGNING':
    			key_info = f"--key {key.kid.hex}:{key.key.hex()} "
    			print(key_info, end="")
    in the widevine_keys folder (github) with your CDM in the .wvd format
    (i used an Android Studio L3 CDM)
    Last edited by larley; 16th Mar 2024 at 09:06.
    Quote Quote  
  18. Originally Posted by larley View Post
    Omg i got keys
    480p keys!!!!
    Code:
    b770d5b4bb6b594daf985845aae9aa5f:b0cb46d2d31cf044bc73db71e9865f6f
    14b5a91ed49c4beb85eaa79cc0fa4964:3a4ed70b8740c975c265e90640c3f7d7
    1ae09d8dbd5844dfac8318b5d9b060de:99d8be97ddadf993d2274db54b4dc6ae
    Well done, your perseverance was rewarded.
    Quote Quote  
  19. I read in the forum that you could use a ChromeCDM to obtain 1080p keys. is that true? i thought vmp validation was preventing that?
    Quote Quote  
  20. Originally Posted by larley View Post
    I read in the forum that you could use a ChromeCDM to obtain 1080p keys. is that true? i thought vmp validation was preventing that?
    I don't think vmp validation could prevent that since everything is being handled legitimately by Chrome, which gets the keys normally, only that you can see them if you have access to the chromecdm API.
    Quote Quote  
  21. can a device_vmp_blob only be used for a chrome cdm or does it work on an android cdm too?
    Quote Quote  
  22. Member
    Join Date
    Aug 2024
    Location
    United Kingdom
    Search Comp PM
    Hi, sorry, I'm new to this world could you please explain these steps clearly? I am going to use pywidevine, also explain the commands to use if you don't mind

    2. Drop the file in either of those folders (which folder?)
    3. Add an L3 CDM in the right folder (basically the .wvd file got from dump?)
    4. Add the 3 pre-defined cookies to the headers.py file (done)
    5. Add N_m3u8DL-RE to the folder if you wish to have the content downloaded, decrypted and muxed automatically (N_m3u8DL-RE.exe in the script folder I downloaded?)
    6. Change the TLD variable to you country's TLD (i.e: com = USA; de = Germany; co.uk = UK) (I'm using UK one, where do I need to change TLD?)
    7. Run the script and provide a Prime Video Link / [ASIN](https://en.wikipedia.org/wiki/Amazon_Standard_Identification_Number) / contentId. (okay)
    Quote Quote  



Similar Threads

Visit our sponsor! Try DVDFab and backup Blu-rays!