VideoHelp Forum
+ Reply to Thread
Page 1 of 2
1 2 LastLast
Results 1 to 30 of 45
Thread
  1. Good evening everyone.

    I have 2 more links here where I can't download the videos with yt-dlp:
    https://www.joyn.de/play/filme/das-feld-der-ehre-passchendaele-bp7cvcku569f
    https://www.joyn.de/filme/helden-von-hill-60

    Thanks very much,
    Heiko
    Quote Quote  
  2. https://www.joyn.de/play/filme/das-feld-der-ehre-passchendaele-bp7cvcku569f

    Code:
    yt-dlp -N "16" -f "bv,ba" --allow-u "MPD_LINK" -o "video.%(ext)s"
    
    mp4decrypt.exe --key 4a01c61f3ea655fc838fff8ffe166b58:418ec81f98b54bfc272deaca74b5b03b --key f79f1ab16f5d52a2bf2252c1d505a184:2b9452495df0b83e444d668faed99787 --key 220c69dc759853d7bed802903452eb0c:e08a2df60922b584fcf569ad05a8d6a3 --key 91a5ca35ecb353f69c933139d7f3923e:7f01f145dbf9e9aa41822e3c639ad711 "video.mp4" "dec_video.mp4"
    
    mp4decrypt.exe --key 4a01c61f3ea655fc838fff8ffe166b58:418ec81f98b54bfc272deaca74b5b03b --key f79f1ab16f5d52a2bf2252c1d505a184:2b9452495df0b83e444d668faed99787 --key 220c69dc759853d7bed802903452eb0c:e08a2df60922b584fcf569ad05a8d6a3 --key 91a5ca35ecb353f69c933139d7f3923e:7f01f145dbf9e9aa41822e3c639ad711 "video.m4a" "dec_audio.m4a"
    
    mkvmerge.exe -o "Das Feld der Ehre  Passchendaele.mkv" "dec_video.mp4" "dec_audio.m4a"
    Code:
    https://www.joyn.de/filme/helden-von-hill-60
    
    --key 0515a9b358806000c3132c78a807fb11:1117ec0ef9b930114f59146bf063e24d --key 5a5281678651540e88742f169ff1464e:d5eccdcee3e4380fc22d581284aa8ff5 --key 2c48aa168fb4523f9e8c098c00bfa25b:e5dad0a3a07a94b3b5d6b024457abe51 --key 5c70ce4307655fa1a1531d57ff1a3243:c942e849e566ae1aaf4343457a75a0f9
    Quote Quote  
  3. Thanks, that worked.

    At www.tele5.de I learned how to get the keys. But at joyn.de it has 4 keys. Where can I get them?

    Also via Network/Response and 4x pssh?

    Best regards
    Heiko
    Quote Quote  
  4. you need to give the mpd link and lic url bc is protected with generated signature..

    Code:
    from pathlib import Path
    import subprocess
    import requests
    import json
    import re
    import os
    
    files_to_delete = ["key.txt"]
    for file_name in files_to_delete:
        if os.path.exists(file_name):
            os.remove(file_name)
            print(f"{file_name} file successfully deleted.")
    
    m3u8DL_RE = 'N_m3u8DL-RE.exe'
    
    def replace_invalid_chars(title: str) -> str:
        invalid_chars = {'<': '\u02c2', '>': '\u02c3',
        ':': '\u02d0', '"': '\u02ba', '/': '\u2044',
        '\\': '\u29f9', '|': '\u01c0', '?': '\u0294',
        '*': '\u2217'}
        
        return ''.join(invalid_chars.get(c, c) for c in title)
    
    print('\ntest link: https://www.joyn.de/play/serien/navy-cis/19-12-wunden-bpgpi5skvhxh\ntest link: https://www.joyn.de/filme/das-feld-der-ehre-passchendaele-bp7cvcku569f\n')
    
    link = input('link: ')
    
    headers = {
        'authority': 'www.joyn.de',
        'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8',
        'upgrade-insecure-requests': '1',
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36',
    }
    
    response = requests.get(link, headers=headers).text
    
    json_data = re.findall(r'type=\"application/json\">({.*?)</script>', response)[0].strip()
    get_json = json.loads(json_data)
    
    try:
        ser_title = get_json['props']['pageProps']['page']['episode']['series']['title']
        ser_season_num = get_json['props']['pageProps']['page']['episode']['season']['number']
        ser_ep_num = get_json['props']['pageProps']['page']['episode']['number']
        ser_ep_title = get_json['props']['pageProps']['page']['episode']['title']
        
        title = f'{ser_title} - S{ser_season_num}E{ser_ep_num} - {ser_ep_title}'
    except KeyError:
        movie_title = get_json['props']['pageProps']['initialData']['page']['movie']['title']
        
        title = f'{movie_title}'
    
    
    title = replace_invalid_chars(title)
    print(f'\n{title}\n')
    
    mpd_link = input('mpd link: ')
    
    import requests
    
    headers03 = {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
        'Connection': 'keep-alive',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36',
    }
    
    response03 = requests.get(mpd_link, headers=headers03).text
    
    pssh = re.findall(r'<cenc:pssh>(.{20,170})</cenc:pssh>', response03)[0].strip()
    print(f'\n{pssh}\n')
    
    lic_url = input('license link: ')
    
    import requests
    
    headers_cdrm = {
        'Connection': 'keep-alive',
        'Content-Type': 'application/json',
        'Origin': 'https://cdrm-project.com',
        'Referer': 'https://cdrm-project.com/',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36',
    }
    
    json_data_cdrm = {
        'license': lic_url,
        'headers': f'Connection: keep-alive\n',
        'pssh': pssh,
        'buildInfo': '',
        'proxy': '',
        'cache': True,
    }
    
    cdrm_resp = requests.post('https://cdrm-project.com/wv', headers=headers_cdrm, json=json_data_cdrm).text
    
    from bs4 import BeautifulSoup
    
    soup = BeautifulSoup(cdrm_resp, 'html.parser')
    li_s = soup.find_all('li')
    keys = []
    
    for li in li_s:
        keys.append(li.text.strip())
    
    key_s = ' '.join(['--key ' + key for key in keys])
    print(f'\nkey(s):\n{key_s}')
    
    print(key_s, file=open("key.txt", "w"))
    
    with open("key.txt", "r") as fs:
     ke_ys = fs.readlines()
     ke_ys = ke_ys[0].strip().split()
    
    print()
    
    subprocess.run([m3u8DL_RE,
                    '-M', 'format=mkv:muxer=ffmpeg',
                    '--concurrent-download',
                    '--auto-select', 
                    '--del-after-done',
                    '--log-level', 'INFO',
                    '--save-name', 'video',
                    mpd_link, *ke_ys])
    
    try:
        Path('video.mkv').rename(''+title+'.mkv')
        print(f'{title}.mkv \nall done!\n')
    except FileNotFoundError:
        print("[ERROR] no mkv file")                
    
    for file_name in files_to_delete:
        if os.path.exists(file_name):
            os.remove(file_name)
            print(f"{file_name} file successfully deleted.")
    Quote Quote  
  5. Good day.

    Thanks for the program. Does this also run on Ubuntu Linux? I mostly use it for stuff like that.

    Script language is Python?

    Best regards
    Heiko
    Quote Quote  
  6. Hello.

    If I cannot use the program under Linux,
    how can i get the keys manually?

    Best regards
    Heiko
    Quote Quote  
  7. heiko@Worf:~/Ghost$ python3 dljoyn.py

    test link: https://www.joyn.de/play/serien/navy-cis/19-12-wunden-bpgpi5skvhxh
    test link: https://www.joyn.de/filme/das-feld-der-ehre-passchendaele-bp7cvcku569f

    link: https://hybrid-prd.ad-prd.s.joyn.de/stitcher/Co0BCgo0MDk1MTk2NTI0EAAaW2h0dHBzOi8vaHlic...pxBfWfveCpEOvY
    Traceback (most recent call last):
    File "dljoyn.py", line 37, in <module>
    json_data = re.findall(r'type=\"application/json\">({.*?)</script>', response)[0].strip()
    IndexError: list index out of range
    heiko@Worf:~/Ghost$
    Quote Quote  
  8. heiko@Worf:~/Ghost$ python3 dljoyn.py

    test link: https://www.joyn.de/play/serien/navy-cis/19-12-wunden-bpgpi5skvhxh
    test link: https://www.joyn.de/filme/das-feld-der-ehre-passchendaele-bp7cvcku569f

    link: https://www.joyn.de/filme/das-feld-der-ehre-passchendaele-bp7cvcku569f

    Das Feld der Ehre Passchendaele

    mpd link: https://joyn-vod-prd.akamaized.net/v1/CiRjMDM2ZWUzNy0wODdhLTQ5NjAtYWIyNy0yNTkxMWQ1M2Ni...7ZO-B2RXxrQ-HI

    AAAAQ3Bzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAACMIARIQSg HGHz6mVfyDj/+P/hZrWCINYV9wN2QwazR5MTY2cg==

    license link: https://api.vod-prd.s.joyn.de/v1/license?token=CiQ3ZjBmODc2Ny00NmViLTRlOWMtODI1OC04YTB...l8GQCGQ&keyId=
    Traceback (most recent call last):
    File "dljoyn.py", line 94, in <module>
    from bs4 import BeautifulSoup
    ModuleNotFoundError: No module named 'bs4'
    heiko@Worf:~/Ghost$
    Quote Quote  
  9. not tested the script above, anyway download your video from mpd with N_m3u8DL-RE

    and use this keys_
    Code:
    4a01c61f3ea655fc838fff8ffe166b58:418ec81f98b54bfc272deaca74b5b03b
    f79f1ab16f5d52a2bf2252c1d505a184:2b9452495df0b83e444d668faed99787
    220c69dc759853d7bed802903452eb0c:e08a2df60922b584fcf569ad05a8d6a3
    91a5ca35ecb353f69c933139d7f3923e:7f01f145dbf9e9aa41822e3c639ad711
    Quote Quote  
  10. Originally Posted by Data2006 View Post
    heiko@Worf:~/Ghost$ python3 dljoyn.py


    Traceback (most recent call last):
    File "dljoyn.py", line 94, in <module>
    from bs4 import BeautifulSoup
    ModuleNotFoundError: No module named 'bs4'
    open cmd window:
    Code:
    pip install bs4
    Quote Quote  
  11. Good day.
    Then the last command worked. just had to
    Change m3u8DL_RE = 'N_m3u8DL-RE.exe' to m3u8DL_RE = 'N_m3u8DL-RE'.

    Only at the end is the .mkv file named with an old file name. Can this still be changed? Either after the movie or universally Film.mkv.

    Best regards,
    Heiko
    Quote Quote  
  12. Sorry, but the title is correct.
    Quote Quote  
  13. I cannot get this link to work: https://www.joyn.de/serien/schlag-den-star/2023-5-duell-der-legenden-uwe-ochsenknecht-...h-bpc4l9r20xpd

    I tried the python script from #4 but this needs to connect to a foreign site which is offline.

    Using yt-dlp like in #2 downloads the encrypted video but does not show any keys.

    Using N_m3u8DL-RE (on a Mac) downloads the encrypted video but does not run mp4decrypt even though I ran it like
    Code:
    ./N_m3u8DL-RE _2023-09-20_22-45-31.en.mp4 --decryption-binary-path ./mp4decrypt
    How do I get the keys to run mp4decrypt manually?
    Last edited by MrJustMe; 21st Sep 2023 at 16:59.
    Quote Quote  
  14. why not?
    try adding more details to your comment than "it doesnt work"
    Quote Quote  
  15. Originally Posted by MrJustMe View Post
    I tried the python script from #4 but this needs to connect to a foreign site which is offline.
    replace cdrm-project with a working site
    eg. this site is currently working
    change line 92 to this
    Code:
    cdrm_resp = requests.post('http://162.19.74.212:8080/wv', headers=headers_cdrm, json=json_data_cdrm).text
    Quote Quote  
  16. Thank you... this works.
    Quote Quote  
  17. Well, this site is down again. Do you know another?
    Quote Quote  
  18. Why not use a local CDM - I've easily found four different working CDM's packed in various grabbing scripts in this forum within 15 minutes, simply by searching for "cdm zip" and inspecting, if the found zip archive contains a non empty folder cdm/devices.
    Quote Quote  
  19. Ok, that worked.

    Did someone already import l3.py into above script?
    Quote Quote  
  20. You mean the script from #4? Where are you stuck? That should be a simple task if you ever have written a line of python.

    Steps (haven't tested):

    Put the script into the same folder where your l3.py is.

    In the head of the script
    Code:
    import l3
    Later instead of calling cdrm_resp = requests.post(...) call the function from l3:

    Code:
    success, keys = l3.WV_Function(pssh, lic_url)
    and continue with the line starting with "key_s" (and delete everything between "cdrm_resp" and "key_s")

    You probably need to tweak WV_Function's call "request.post(...)" to include headers, params and cookies; mine looked like

    Code:
    widevine_license = requests.post(url=lic_url, 
        data=wvdecrypt.get_challenge(), 
        headers=headers.headers, 
        params=getattr(headers, 'params', {}), 
        cookies=getattr(headers, 'cookies', {})
    Last edited by Obo; 6th Oct 2023 at 05:53.
    Quote Quote  
  21. I changed retrieval of the keys but I didn't have to change the retrieval of widevine_license. But the process is still quite cumbersome:

    Code:
    # ./N_m3u8DL-RE $joyn_link
    <<< interrupt and copy PSSH >>>
    # ./dl_joyn
    PSSH: $PSSH
    License URL: $lic_url
    link: $joyn_link
    mpd link: $mpd_link
    license link: $lic_url
    <<< download & decrypting & merging happening >>>
    Quote Quote  
  22. Yes; but at least it works?

    To make to process smooth and easy you'd need to figure out how to create the graphql request signatures and what graphql requests are needed to obtain mpd and license url parameters. There is a Kodi plugin which does this, but I'm (yet) too lazy to figure it out. (I have my GUI application where I can paste in the mpd url, license request headers and download file name, the rest is done by the application.)
    Quote Quote  
  23. Yes, it works and thank you very much for your assistance.

    I was "grumbling" about yet lacking functionality in tools like yt-dlp/JD/... if the protection scheme is broken I'd have expected them to include this at the very first moment.
    Quote Quote  
  24. Did they update the .mpd files on joyn.de somehow? yt-dlp never finds any video files anymore it seems:

    https://www.joyn.de/play/serien/rosins-restaurants-ein-sternekoch-raeumt-auf/16-4-bist...batterien-leer

    WARNING: [generic] Falling back on generic information extractor
    WARNING: [generic] URL could be a direct video link, returning it as such.
    ERROR: [generic] .mpd\?filter\=CiRkMmRiNzQ5OS02MmU0LTQ0MjYtODRiZS1m YzA1NDBhYTA4NDY.Cg1hX3BuNHRhbTA0d2x0ElYodHlwZT09In ZpZGVvIiYmTWF4SGVpZ2h0PD01NzYpfHwodHlwZT09ImF1ZGlv IiYmRm91ckNDPT0iQUFDTCIpfHwodHlwZT09InRleHRzdHJlYW 0iKQ: Requested format is not available. Use --list-formats for a list of available formats
    --list-formats just prints
    ID EXT RESOLUTION │ PROTO │ VCODEC ACODEC
    ────────────────────────────────────────────────── ───
    0 unknown_video unknown │ https │ unknown unknown
    Quote Quote  
  25. No, they haven't - at least not for many months. If I ask yt-dlp to list the formats, I get:

    Code:
    yt-dlp --allow-u -F 'https://delivery.vod-prd.s.joyn.de/v1/CiRj.../.ism/.mpd?filter=CiRk...LWzE'
    WARNING: You have asked for UNPLAYABLE formats to be listed/downloaded. This is a developer option intended for debugging. 
             If you experience any issues while using this option, DO NOT open a bug report
    [generic] Extracting URL: https://delivery.vod-prd.s.joyn.de/v1/CiRj...LWzE
    [generic] .mpd?filter=CiRk...: Downloading webpage
    WARNING: [generic] Falling back on generic information extractor
    [generic] .mpd?filter=CiRk...: Extracting information
    [info] Available formats for .mpd?filter=CiRk...:
    ID                EXT RESOLUTION FPS │   TBR PROTO │ VCODEC        VBR ACODEC      ABR ASR MORE INFO
    ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
    audio_deu=157000  m4a audio only     │  157k dash  │ audio only        mp4a.40.2  157k 48k [de] DRM, DASH audio, m4a_dash
    video_eng=351000  mp4 768x432     25 │  351k dash  │ avc1.64001F  351k video only          [en] DRM, DASH video, mp4_dash
    video_eng=465000  mp4 1024x576    25 │  465k dash  │ avc1.64001F  465k video only          [en] DRM, DASH video, mp4_dash
    video_eng=610000  mp4 1024x576    25 │  610k dash  │ avc1.64001F  610k video only          [en] DRM, DASH video, mp4_dash
    video_eng=1088000 mp4 1024x576    25 │ 1088k dash  │ avc1.64001F 1088k video only          [en] DRM, DASH video, mp4_dash
    video_eng=1946000 mp4 1024x576    25 │ 1946k dash  │ avc1.64001F 1946k video only          [en] DRM, DASH video, mp4_dash
    The keys to decrypt the video are:
    Code:
    1a1f14dd6631e811e8d636d5635917d8:94b9fec34033433b1a3c001185e2fabb
    4af602a8662759dc9ce9850b980f7553:4ede744528a6fcdb3c88b65a19437737
    b29dee1a3147576c8de7c12a272759b7:f8e46896797ca957d84592df48c95b63
    fc942f3bd3c552a29fc6c5b4087e2b45:45e9ae65684e8734dcfc7d6ce7c442e2
    Quote Quote  
  26. Member
    Join Date
    Dec 2021
    Location
    england
    Search PM
    Originally Posted by resistor View Post
    Did they update the .mpd files on joyn.de somehow? yt-dlp never finds any video files anymore it seems:

    https://www.joyn.de/play/serien/rosins-restaurants-ein-sternekoch-raeumt-auf/16-4-bist...batterien-leer

    WARNING: [generic] Falling back on generic information extractor
    WARNING: [generic] URL could be a direct video link, returning it as such.
    ERROR: [generic] .mpd\?filter\=CiRkMmRiNzQ5OS02MmU0LTQ0MjYtODRiZS1m YzA1NDBhYTA4NDY.Cg1hX3BuNHRhbTA0d2x0ElYodHlwZT09In ZpZGVvIiYmTWF4SGVpZ2h0PD01NzYpfHwodHlwZT09ImF1ZGlv IiYmRm91ckNDPT0iQUFDTCIpfHwodHlwZT09InRleHRzdHJlYW 0iKQ: Requested format is not available. Use --list-formats for a list of available formats
    --list-formats just prints
    ID EXT RESOLUTION │ PROTO │ VCODEC ACODEC
    ────────────────────────────────────────────────── ───
    0 unknown_video unknown │ https │ unknown unknown
    look fine
    Image
    [Attachment 74724 - Click to enlarge]
    Quote Quote  
  27. Thank you all, I manged to download the video files. I however can't get the license with l3 as I seem to need a signature.
    Code:
    license response status: <Response [401]>
    server reports: {"message":"Invalid signature"}
    server did not issue license, make sure you have correctly pasted all the required headers in the headers.py. Also check json/raw params of POST request.
    I know how to use headers with other services to get the keys, but on joyn.de there don't seem to be any headers attached to the request to the license server.

    Originally Posted by Obo View Post
    The keys to decrypt the video are:
    Code:
    1a1f14dd6631e811e8d636d5635917d8:94b9fec34033433b1a3c001185e2fabb
    4af602a8662759dc9ce9850b980f7553:4ede744528a6fcdb3c88b65a19437737
    b29dee1a3147576c8de7c12a272759b7:f8e46896797ca957d84592df48c95b63
    fc942f3bd3c552a29fc6c5b4087e2b45:45e9ae65684e8734dcfc7d6ce7c442e2
    Could you eplain how you get them?
    Quote Quote  
  28. Member
    Join Date
    Dec 2021
    Location
    england
    Search PM
    no header need
    Code:
    C:\Users\Admins\WKS-KEYS>l3.py
    
    PSSH: AAAAQ3Bzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAACMIARIQGh8U3WYx6BHo1jbVY1kX2CINYV9wbjR0YW0wNHdsdA==
    License URL: https://api.vod-prd.s.joyn.de/v1/license?token=CiQ5NzNjYzc1ZC1kN2ZhLTQzNzgtYjhhMy1hMGYzYTYyM2QxODU.Cg1hX3BuNHRhbTA0d2x0EAEaEHNvZnR3YXJlLW5vbi12bXAg58GlqgYo8YewqgYyJDNmODU0NzdhLWNhOTEtNGRjOC1iODJiLTY4OTBlOTE2NWIzMjjABEIkYmE0YjBhMTYtYzRmYy00MDYwLWExMDItYWUyMTU2OTlkZmVhSgh3aWRldmluZVCxsqaqBlgA.ISnXAvcC7baF2Ea4Yfgg35g5Khf9q6HNvkkzAouPsG8&keyId=
    
    --key 1a1f14dd6631e811e8d636d5635917d8:94b9fec34033433b1a3c001185e2fabb
    --key 4af602a8662759dc9ce9850b980f7553:4ede744528a6fcdb3c88b65a19437737
    --key b29dee1a3147576c8de7c12a272759b7:f8e46896797ca957d84592df48c95b63
    --key fc942f3bd3c552a29fc6c5b4087e2b45:45e9ae65684e8734dcfc7d6ce7c442e2
    
    C:\Users\Admins\WKS-KEYS>
    Quote Quote  



Similar Threads

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