VideoHelp Forum


Try StreamFab Downloader and download from Netflix, Amazon, Youtube! Or Try DVDFab and copy Blu-rays!


Try StreamFab Downloader and download streaming video from Youtube, Netflix, Amazon! Download free trial.


+ Reply to Thread
Results 1 to 13 of 13
Thread
  1. Member
    Join Date
    Nov 2023
    Location
    USA
    Search Comp PM
    Good evening,
    I have a video :https://www.france.tv/enfants/six-huit-ans/tortues-ninja-les-chevaliers-d-ecaille/sais...chnodrome.html

    le mpd:https://cloudingest.ftven.fr/3c05cd49b9666/269ac3a6-efcc-4b89-8ed4-64810da8aa29-171820...m/manifest.mpd


    the ppsh:AAAAYXBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAEEIA RIQJprDpu/MS4mO1GSBDaiqKRoFTmFncmEiJDI2OWFjM2E2LWVmY2MtNGI4O S04ZWQ0LTY0ODEwZGE4YWEyOQ==

    I can't find the license (and maybe the headers) to use http://108.181.133.95:8080/
    Thank you for your help to explain me where to find license

    Translated with DeepL.com (free version)
    Quote Quote  
  2. Member aqzs's Avatar
    Join Date
    Mar 2024
    Location
    Paris
    Search Comp PM
    First time seeing DRM on francetv content. Here is the key :
    Code:
    269ac3a6efcc4b898ed464810da8aa29:c9fd40e2225059bf1c172ad56e7927bd
    Download command :
    Code:
    N_m3u8DL-RE "https://cloudingest.ftven.fr/3c05cd49b9666/269ac3a6-efcc-4b89-8ed4-64810da8aa29-1718205635_france-domtom_DRM.ism/manifest.mpd" --key 269ac3a6efcc4b898ed464810da8aa29:c9fd40e2225059bf1c172ad56e7927bd -M mkv --save-name "tortues.ninja.les.chevaliers.decaille.S01E61.1080p.WEB"
    Download link : https://www.swisstransfer.com/d/c9e7af25-174f-4152-9495-91fdc01e521c
    The license url :
    Code:
    https://api-drm.ftven.fr/v1/wvls/contentlicenseservice/v1/licenses
    You have to add nv-authorizations in the header. Getting keys with CDRM or others projects like those one might not work due to geo restrictions.
    Last edited by aqzs; 24th Jun 2024 at 17:24.
    Quote Quote  
  3. Member
    Join Date
    Nov 2023
    Location
    USA
    Search Comp PM
    I find the nv-authorizations but I have an error :ERROR
    Wrong headers: while scanning a simple key in "<unicode string>", line 2, column 1: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1 ... ^ could not find expected ':' in "<unicode string>", line 2, column 412: ... Eaz3rpGJmrfFFE14a_ciG4ayA1ZEUodM ^
    Quote Quote  
  4. Member aqzs's Avatar
    Join Date
    Mar 2024
    Location
    Paris
    Search Comp PM
    You are using http://108.181.133.95:8080/ to get keys ? I never used that sorry
    Quote Quote  
  5. Member
    Join Date
    Nov 2023
    Location
    USA
    Search Comp PM
    what tools do you use?
    Quote Quote  
  6. Member aqzs's Avatar
    Join Date
    Mar 2024
    Location
    Paris
    Search Comp PM
    I use pywidevine.

    Here is a small script that wll give you download command based on the video url (with or without DRM) :
    HTML Code:
    from pywidevine.cdm import Cdm
    from pywidevine.device import Device
    from pywidevine.pssh import PSSH
    import requests
    from slugify import slugify
    import xml.etree.ElementTree as ET
    import re
    
    def getpssh(url_mpd):
        psshs = []
        response = requests.get(url_mpd)
        root = ET.fromstring(response.content)
        for i in range(20):
            for j in range(20):
                for k in range(20):
                    for l in range(20):
                        try:
                            if root[i][j][k][l].text not in psshs and len(root[i][j][k][l].text) > 70 and len(root[i][j][k][l].text) < 190:
                                psshs.append(root[i][j][k][l].text)
                        except:
                            pass
        for pssh in psshs:
            return pssh
    
    def getkey(pssh, lic_token):
        headers = {'nv-authorizations': lic_token}
        pssh = PSSH(pssh)
        lic_url = 'https://api-drm.ftven.fr/v1/wvls/contentlicenseservice/v1/licenses'
        device = Device.load(DEVICEPATH)
        cdm = Cdm.from_device(device)
        session_id = cdm.open()
        challenge = cdm.get_license_challenge(session_id, pssh)
        licence = requests.post(lic_url, headers = headers, data=challenge)
        licence.raise_for_status()
        cdm.parse_license(session_id, licence.content)
        keys = []
        for key in cdm.get_keys(session_id):
            if key.type=='CONTENT':
                keys.append(f"{key.kid.hex}:{key.key.hex()}")
        cdm.close(session_id)
        return keys
    
    
    def getvideo(ID):
        headers = {'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36',}
        params = (('country_code', 'FR'),('w', '1084'),('h', '610'),('screen_w', '1774'),('screen_h', '1033'),('player_version', '5.113.5'),('domain', 'www.france.tv'),('device_type', 'desktop'),('browser', 'chrome'),('browser_version', '126'),('os', 'macos'),('os_version', '10_15_7'),('diffusion_mode', 'tunnel_first'),('gmt', '+0200'),('video_product_id', '6137147'),('capabilities', 'drm'),)
        data = requests.get(f'https://k7.ftven.fr/videos/{ID}', headers=headers, params=params).json()
        mpd_url = data['video']['url']
        name = slugify(data['meta']['title'] + '.' + data['meta']['pre_title'], separator='.', lowercase=False)
        if 'drm' in mpd_url:
            pssh = getpssh(mpd_url)
            TOKEN = requests.post('https://k7.ftven.fr/drm-token', headers=headers, params=(('v', '2'),), json={"id":ID,"drm_type":"widevine","license_type":"online"}).json()['token']
            key = getkey(pssh, TOKEN)
            print(f"""N_m3u8DL-RE "{mpd_url}" --save-name "{name}" --select-video best --select-audio all --select-subtitle all -mt -M format=mkv  --log-level OFF --key """ + ' --key '.join(key))
        else:
            print(f"""N_m3u8DL-RE "{mpd_url}" --save-name "{name}" --select-video best --select-audio all --select-subtitle all -mt -M format=mkv  --log-level OFF""")
    
    # urlvid = 'https://www.france.tv/enfants/six-huit-ans/tortues-ninja-les-chevaliers-d-ecaille/saison-1/6137147-irma-se-fait-remarquer.html'
    DEVICEPATH = "device.wvd"
    urlvid = input('Video url: ')
    r = requests.get(urlvid)
    matches = re.findall(r'"videoId":\s*"(.*?)"', r.text)
    if matches:
        videoid = matches[0]
        getvideo(videoid)
    Quote Quote  
  7. Member aqzs's Avatar
    Join Date
    Mar 2024
    Location
    Paris
    Search Comp PM
    You can use this much simpler script if you just want the keys :
    HTML Code:
    from pywidevine.cdm import Cdm
    from pywidevine.device import Device
    from pywidevine.pssh import PSSH
    import requests
    lic_token = input('token: ')
    headers = {'nv-authorizations': lic_token}
    pssh = input("PSSH? ")
    pssh = PSSH(pssh)
    lic_url = 'https://api-drm.ftven.fr/v1/wvls/contentlicenseservice/v1/licenses'
    device = Device.load("device.wvd")
    cdm = Cdm.from_device(device)
    session_id = cdm.open()
    challenge = cdm.get_license_challenge(session_id, pssh)
    licence = requests.post(lic_url, headers = headers, data=challenge)
    licence.raise_for_status()
    cdm.parse_license(session_id, licence.content)
    for key in cdm.get_keys(session_id):
        if key.type=='CONTENT':
            print(f"\n--key {key.kid.hex}:{key.key.hex()}")
    cdm.close(session_id)
    Quote Quote  
  8. Member
    Join Date
    Nov 2023
    Location
    USA
    Search Comp PM
    the script not work : python3.10 pywidevine.py
    Traceback (most recent call last):
    File "/home/Bureau/N_m3u8DL-RE_Beta_linux-x64/pywidevine.py", line 1, in <module>
    from pywidevine.cdm import Cdm
    File "/home/Bureau/N_m3u8DL-RE_Beta_linux-x64/pywidevine.py", line 1, in <module>
    from pywidevine.cdm import Cdm
    ModuleNotFoundError: No module named 'pywidevine.cdm'; 'pywidevine' is not a package
    Quote Quote  
  9. Member aqzs's Avatar
    Join Date
    Mar 2024
    Location
    Paris
    Search Comp PM
    The script works for sure. Rename it other than pywidevine, it's the name of the library you are using, you shouldn't name a file the same as a lib, it's confusing for python. Since you never used pywidevine before install it using :
    Code:
    pip install pywidevine
    In the code I provided you also have to change the path of device.wvd with your own one. You can get a CDM following this thread : https://forum.videohelp.com/threads/408031-Dumping-Your-own-L3-CDM-with-Android-Studio or grabbing one from here : https://forum.videohelp.com/threads/413719-Ready-to-use-CDMs-available-here%21
    Quote Quote  
  10. Member
    Join Date
    Nov 2023
    Location
    USA
    Search Comp PM
    I use second link I download private key client id
    the script :import sys

    from pywidevine import Device

    if len(sys.argv) < 2:
    print(f'usage: {sys.argv[0]} <private-key-file> <client-id-blob> or {sys.argv[0]} <file.wvd>')
    sys.exit(1)

    if len(sys.argv) >= 3:

    with open(sys.argv[1], 'rb') as f:
    private_key = f.read()
    with open(sys.argv[2], 'rb') as f:
    client_id = f.read()

    device = Device(
    private_key=private_key,
    client_id=client_id,
    type_=Device.Types['ANDROID'],
    security_level=3,
    flags=None)

    else:
    device = Device.load(sys.argv[1])

    print(device)

    I have an error: python3.10 device private_key.pem client_id.bin
    Traceback (most recent call last):
    File "/home/Bureau/N_m3u8DL-RE_Beta_linux-x64/device", line 19, in <module>
    type_=Device.Types['ANDROID'],
    AttributeError: type object 'Device' has no attribute 'Types'
    Quote Quote  
  11. Member
    Join Date
    Nov 2023
    Location
    USA
    Search Comp PM
    I use your script :
    python3 pywidevine.py
    token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImtpZCI6IjkxNT YyMCJ9.eyJ0eXAiOiJDb250ZW50QXV0aFoiLCJ2ZXIiOiIxLjA iLCJleHAiOjE3MTkyNjgxOTIsImNvbnRlbnRSaWdodHMiOlt7I mNvbnRlbnRJZCI6IjI2OWFjM2E2LWVmY2MtNGI4OS04ZWQ0LTY 0ODEwZGE4YWEyOSIsInN0YXJ0IjoiMjAyNC0wNi0xM1QyMjowM DowMFoiLCJlbmQiOiIyMDI0LTA2LTI1VDA0OjE5OjUyWiIsInV zYWdlUnVsZXNQcm9maWxlSWQiOiJIRF9IRENQMCIsInN0b3JhY mxlIjpmYWxzZX1dfQ.Zee7SRH20-NEaz3rpGJmrfFFE14a_ciG4ayA1ZEUodM
    PSSH? AAAAYXBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAEEIARIQJp rDpu/MS4mO1GSBDaiqKRoFTmFncmEiJDI2OWFjM2E2LWVmY2MtNGI4O S04ZWQ0LTY0ODEwZGE4YWEyOQ==
    Traceback (most recent call last):
    File "/home/ludo/Bureau/N_m3u8DL-RE_Beta_linux-x64/widevine.py", line 15, in <module>
    licence.raise_for_status()
    File "/home/ludo/.local/lib/python3.10/site-packages/requests/models.py", line 1021, in raise_for_status
    raise HTTPError(http_error_msg, response=self)
    requests.exceptions.HTTPError: 400 Client Error: Bad Request for url: https://api-drm.ftven.fr/v1/wvls/contentlicenseservice/v1/licenses
    Quote Quote  
  12. Probably token expired (decoded):
    Code:
    {
        "typ": "ContentAuthZ",
        "ver": "1.0",
        "exp": 1719268192,
        "contentRights": [
            {
                "contentId": "269ac3a6-efcc-4b89-8ed4-64810da8aa29",
                "start": "2024-06-13T22:00:00Z",
                "end": "2024-06-25T04:19:52Z",
                "usageRulesProfileId": "HD_HDCP0",
                "storable": false
            }
        ]
    }
    The "exp" timestamp resolves to Tue, 2024-06-25 00:29:52, and "end" is over as well.
    Quote Quote  
  13. Member
    Join Date
    Nov 2023
    Location
    USA
    Search Comp PM
    yes it's work.
    thanks
    Quote Quote  



Similar Threads

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