VideoHelp Forum




+ Reply to Thread
Results 1 to 17 of 17
  1. Hello, I am trying to download a free course but it has some hidden widevine encryption which blocks the keys. Can someone help me?
    Quote Quote  
  2. Member
    Join Date
    Dec 2021
    Location
    england
    Search Comp PM
    we cant help you without video URL
    Quote Quote  
  3. In case you didn't see me earlier here, let me ask again.

    What do you stand to gain by downloading a course that's already free? Give me a valid reason.
    Quote Quote  
  4. Originally Posted by pram0dm View Post
    In case you didn't see me earlier here, let me ask again.

    What do you stand to gain by downloading a course that's already free? Give me a valid reason.
    The courses are available for free only for a limited time hence they cannot be used later for revision or if you cannot complete them then they become paid hence why if I can store it then I can use them again when I want.
    Quote Quote  
  5. Originally Posted by iamghost View Post
    we cant help you without video URL
    https://maang.in/
    This site uses vdocipher which is impossible to break.
    Quote Quote  
  6. ['bd896923358f50318c64abc98fb86357:4e22d9d1b5b689eb bd157012b3c84df3', '51d763d2542e528bb8e9e290e372ec44:264998d3799b6316 c0086e7062f22715', '52d99926f26d5fd58d4f49b49bfe1a67:dab3d77e680aa6c6 aeacdbad06b10208', 'bac9f053f0de57139e6dc85952f83a7a:9352fcbfb654c009 a258f437b892f207']
    https://d1v1gqjht5uu1.cloudfront.net/media/z4yngqi7bl5Wj/5063bdd8/stream.mpd
    Quote Quote  
  7. Originally Posted by TatsP View Post
    This site uses vdocipher which is impossible to break
    nothing is impossible. if you can play, you can down
    Quote Quote  
  8. Originally Posted by TatsP View Post
    https://maang.in/
    This site uses vdocipher which is impossible to break.
    Novia just cracked it !

    Originally Posted by Novia View Post
    ...
    Use code blocks to make them look even cooler.

    Code:
    bd896923358f50318c64abc98fb86357:4e22d9d1b5b689ebbd157012b3c84df3
    51d763d2542e528bb8e9e290e372ec44:264998d3799b6316c0086e7062f22715
    52d99926f26d5fd58d4f49b49bfe1a67:dab3d77e680aa6c6aeacdbad06b10208
    bac9f053f0de57139e6dc85952f83a7a:9352fcbfb654c009a258f437b892f207
    https://d1v1gqjht5uu1.cloudfront.net/media/z4yngqi7bl5Wj/5063bdd8/stream.mpd
    Last edited by pram0dm; 11th May 2024 at 02:17.
    Quote Quote  
  9. Originally Posted by Novia View Post
    ['bd896923358f50318c64abc98fb86357:4e22d9d1b5b689eb bd157012b3c84df3', '51d763d2542e528bb8e9e290e372ec44:264998d3799b6316 c0086e7062f22715', '52d99926f26d5fd58d4f49b49bfe1a67:dab3d77e680aa6c6 aeacdbad06b10208', 'bac9f053f0de57139e6dc85952f83a7a:9352fcbfb654c009 a258f437b892f207']
    https://d1v1gqjht5uu1.cloudfront.net/media/z4yngqi7bl5Wj/5063bdd8/stream.mpd
    How did you obtain this keys? Does every video on the site have different keys or same?
    Quote Quote  
  10. each video have proper keys ... this is basic stuff dude
    Quote Quote  
  11. Originally Posted by Novia View Post
    ['bd896923358f50318c64abc98fb86357:4e22d9d1b5b689eb bd157012b3c84df3', '51d763d2542e528bb8e9e290e372ec44:264998d3799b6316 c0086e7062f22715', '52d99926f26d5fd58d4f49b49bfe1a67:dab3d77e680aa6c6 aeacdbad06b10208', 'bac9f053f0de57139e6dc85952f83a7a:9352fcbfb654c009 a258f437b892f207']
    https://d1v1gqjht5uu1.cloudfront.net/media/z4yngqi7bl5Wj/5063bdd8/stream.mpd
    How did you manage to obtain this? Can you show me? There are plenty of videos I want to download but I cannot due to this restriction.
    Quote Quote  
  12. Originally Posted by lomero View Post
    each video have proper keys ... this is basic stuff dude
    yeah I know that but vdocipher has no working tool online. It sends 2 requests which I am not able to figure out for license. The first request has token which gives response which is somehow fumbled into the token for second request which gives the license.
    Quote Quote  
  13. Originally Posted by TatsP View Post
    Originally Posted by Novia View Post
    ['bd896923358f50318c64abc98fb86357:4e22d9d1b5b689eb bd157012b3c84df3', '51d763d2542e528bb8e9e290e372ec44:264998d3799b6316 c0086e7062f22715', '52d99926f26d5fd58d4f49b49bfe1a67:dab3d77e680aa6c6 aeacdbad06b10208', 'bac9f053f0de57139e6dc85952f83a7a:9352fcbfb654c009 a258f437b892f207']
    https://d1v1gqjht5uu1.cloudfront.net/media/z4yngqi7bl5Wj/5063bdd8/stream.mpd
    How did you manage to obtain this? Can you show me? There are plenty of videos I want to download but I cannot due to this restriction.
    You need a proper cdm first
    Code:
    import base64
    import json
    import re
    from urllib.parse import urlparse
    from urllib.parse import parse_qs
    import requests
    import xmltodict
    from pywidevine.L3.cdm import deviceconfig
    from pywidevine.L3.decrypt.wvdecryptcustom import WvDecrypt
    
    
    def download(otp, playbackInfo):
        url = "https://player.vdocipher.com/v2/?otp={}&playbackInfo={}".format(otp, playbackInfo)
        html = requests.get(url, headers=headers).text
        title = re.search(r'"title":"(.*?)"', html).group(1)
        manifest = re.search(r'"manifest":"(.*?)"', html).group(1)
        cmd = "N_m3u8DL-RE.exe \"" + manifest + "\" --tmp-dir ./cache --save-name \"" + title + "\" --save-dir \"./vdocipher/" + "\" --thread-count 16 --download-retry-count 30 --auto-select --check-segments-count -M format=mp4"
        mpd_data = requests.get(url=manifest).text
        mpd = xmltodict.parse(mpd_data)
        pssh = mpd['MPD']['Period']['AdaptationSet'][0]['ContentProtection'][1]['cenc:pssh']
        data = {
            "playbackInfo": playbackInfo,
            "otp": otp,
            "href": url,
            "tech": "wv",
            "licenseRequest": "CAQ=",
        }
        stra = json.dumps(data, separators=(',', ':'))
        data = {
            "token": base64.b64encode(stra.encode("utf-8")).decode("utf-8")
        }
        widevine_license = requests.post(url="https://license.vdocipher.com/auth", data=data, headers=headers)
        license = widevine_license.json()["license"]
        decrypt = WvDecrypt(init_data_b64=pssh, cert_data_b64=license, device=deviceconfig.device_android_generic)
        data = {
            "playbackInfo": playbackInfo,
            "otp": otp, "href": url,
            "tech": "wv",
            "licenseRequest": base64.b64encode(decrypt.get_challenge()).decode("utf-8"),
        }
        stra = json.dumps(data, separators=(',', ':'))
        data = {
            "token": base64.b64encode(stra.encode("utf-8")).decode("utf-8")
        }
        widevine_license = requests.post(url="https://license.vdocipher.com/auth", data=data, headers=headers)
        if widevine_license.status_code != 200:
            print("Error", widevine_license.text)
        data = widevine_license.json()
        license = data.get("license")
        if not license:
            print("Error", data)
        decrypt.update_license(license)
        Correct, keys = decrypt.start_process()
        if Correct:
            print("获取key成功")
            key_string = ' '.join([f"--key {key}" for key in keys])
            cmd = cmd + " " + key_string + " --decryption-binary-path ./mp4decrypt.exe"
        print(cmd)
    
    
    def get_otp(id):
        url = f"https://azbackend.com/resources/user/videos/{id}/otp"
        response = requests.get(url, headers=headers)
    
        data = response.json()["data"]
        otp = data.get("otp")
        playbackInfo = data.get("playbackInfo")
        return otp, playbackInfo
    
    
    def get_vids(cid =7784):
        url = f"https://azbackend.com/resources/user/readings/{cid}"
        response = requests.get(url, headers=headers)
        data = response.json()["data"]
        content = data["content"]
        for i in content:
            data = i["data"]
            type = i["type"]
            if type == "VIDEO":
                video_id = data["video_id"]
                otp, playbackInfo = get_otp(video_id)
                download(otp, playbackInfo)
    
    if __name__ == '__main__':
        authorization = "Bearer"
        headers = {
            "vdo-sdk": "VdoWeb/2.4.29",
            "authorization": authorization,
            "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0"
        }
        get_vids()
    Quote Quote  
  14. Member aqzs's Avatar
    Join Date
    Mar 2024
    Location
    Paris
    Search Comp PM
    Okay I figured out that the code was using the old source code for pywidevine (which I never used before since I learned about CDM only 2 months ago). I'll try make the script work on my own thanks !
    Last edited by aqzs; 11th May 2024 at 09:08.
    Quote Quote  
  15. Member aqzs's Avatar
    Join Date
    Mar 2024
    Location
    Paris
    Search Comp PM
    I have a working script now but I can't get the license back
    I collected every vdocipher error I think

    Code:
    widevine_license:  {"code":2042,"message":"This device is not supported. Please try on another device."}
    widevine_license:  {"code":2021,"message":"Update browser/OS to watch video"}
    widevine_license:  {"code":2042,"message":"Android system updates or update Chrome browser to play this video"}
    widevine_license:  {"code":2046,"message":"Authentication failed"}
    widevine_license:  {"code":2079,"message":"Device not supported"}
    Quote Quote  
  16. Originally Posted by aqzs View Post
    I have a working script now but I can't get the license back
    I collected every vdocipher error I think

    Code:
    widevine_license:  {"code":2042,"message":"This device is not supported. Please try on another device."}
    widevine_license:  {"code":2021,"message":"Update browser/OS to watch video"}
    widevine_license:  {"code":2042,"message":"Android system updates or update Chrome browser to play this video"}
    widevine_license:  {"code":2046,"message":"Authentication failed"}
    widevine_license:  {"code":2079,"message":"Device not supported"}
    You must use a CDM that was extracted from a REAL device. Emulator CDMs are not going to work with VdoCipher.
    Quote Quote  
  17. Originally Posted by Novia View Post
    Originally Posted by TatsP View Post
    Originally Posted by Novia View Post
    ['bd896923358f50318c64abc98fb86357:4e22d9d1b5b689eb bd157012b3c84df3', '51d763d2542e528bb8e9e290e372ec44:264998d3799b6316 c0086e7062f22715', '52d99926f26d5fd58d4f49b49bfe1a67:dab3d77e680aa6c6 aeacdbad06b10208', 'bac9f053f0de57139e6dc85952f83a7a:9352fcbfb654c009 a258f437b892f207']
    https://d1v1gqjht5uu1.cloudfront.net/media/z4yngqi7bl5Wj/5063bdd8/stream.mpd
    How did you manage to obtain this? Can you show me? There are plenty of videos I want to download but I cannot due to this restriction.
    You need a proper cdm first
    Code:
    import base64
    import json
    import re
    from urllib.parse import urlparse
    from urllib.parse import parse_qs
    import requests
    import xmltodict
    from pywidevine.L3.cdm import deviceconfig
    from pywidevine.L3.decrypt.wvdecryptcustom import WvDecrypt
    
    
    def download(otp, playbackInfo):
        url = "https://player.vdocipher.com/v2/?otp={}&playbackInfo={}".format(otp, playbackInfo)
        html = requests.get(url, headers=headers).text
        title = re.search(r'"title":"(.*?)"', html).group(1)
        manifest = re.search(r'"manifest":"(.*?)"', html).group(1)
        cmd = "N_m3u8DL-RE.exe \"" + manifest + "\" --tmp-dir ./cache --save-name \"" + title + "\" --save-dir \"./vdocipher/" + "\" --thread-count 16 --download-retry-count 30 --auto-select --check-segments-count -M format=mp4"
        mpd_data = requests.get(url=manifest).text
        mpd = xmltodict.parse(mpd_data)
        pssh = mpd['MPD']['Period']['AdaptationSet'][0]['ContentProtection'][1]['cenc:pssh']
        data = {
            "playbackInfo": playbackInfo,
            "otp": otp,
            "href": url,
            "tech": "wv",
            "licenseRequest": "CAQ=",
        }
        stra = json.dumps(data, separators=(',', ':'))
        data = {
            "token": base64.b64encode(stra.encode("utf-8")).decode("utf-8")
        }
        widevine_license = requests.post(url="https://license.vdocipher.com/auth", data=data, headers=headers)
        license = widevine_license.json()["license"]
        decrypt = WvDecrypt(init_data_b64=pssh, cert_data_b64=license, device=deviceconfig.device_android_generic)
        data = {
            "playbackInfo": playbackInfo,
            "otp": otp, "href": url,
            "tech": "wv",
            "licenseRequest": base64.b64encode(decrypt.get_challenge()).decode("utf-8"),
        }
        stra = json.dumps(data, separators=(',', ':'))
        data = {
            "token": base64.b64encode(stra.encode("utf-8")).decode("utf-8")
        }
        widevine_license = requests.post(url="https://license.vdocipher.com/auth", data=data, headers=headers)
        if widevine_license.status_code != 200:
            print("Error", widevine_license.text)
        data = widevine_license.json()
        license = data.get("license")
        if not license:
            print("Error", data)
        decrypt.update_license(license)
        Correct, keys = decrypt.start_process()
        if Correct:
            print("获取key成功")
            key_string = ' '.join([f"--key {key}" for key in keys])
            cmd = cmd + " " + key_string + " --decryption-binary-path ./mp4decrypt.exe"
        print(cmd)
    
    
    def get_otp(id):
        url = f"https://azbackend.com/resources/user/videos/{id}/otp"
        response = requests.get(url, headers=headers)
    
        data = response.json()["data"]
        otp = data.get("otp")
        playbackInfo = data.get("playbackInfo")
        return otp, playbackInfo
    
    
    def get_vids(cid =7784):
        url = f"https://azbackend.com/resources/user/readings/{cid}"
        response = requests.get(url, headers=headers)
        data = response.json()["data"]
        content = data["content"]
        for i in content:
            data = i["data"]
            type = i["type"]
            if type == "VIDEO":
                video_id = data["video_id"]
                otp, playbackInfo = get_otp(video_id)
                download(otp, playbackInfo)
    
    if __name__ == '__main__':
        authorization = "Bearer"
        headers = {
            "vdo-sdk": "VdoWeb/2.4.29",
            "authorization": authorization,
            "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0"
        }
        get_vids()
    Hi, your script was working fine but now it has stopped working, can you please check PM and help me?
    Quote Quote  



Similar Threads

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