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
+ Reply to Thread
Results 1 to 30 of 136
-
-
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
-
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 -
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.")
-
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 -
Hello.
If I cannot use the program under Linux,
how can i get the keys manually?
Best regards
Heiko -
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$ -
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$ -
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
-
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 -
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 likeCode:./N_m3u8DL-RE _2023-09-20_22-45-31.en.mp4 --decryption-binary-path ./mp4decrypt
Last edited by MrJustMe; 21st Sep 2023 at 15:59.
-
-
-
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.
-
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
Code:success, keys = l3.WV_Function(pssh, lic_url)
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 04:53.
-
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 >>>
-
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.) -
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. -
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
ID EXT RESOLUTION │ PROTO │ VCODEC ACODEC
────────────────────────────────────────────────── ───
0 unknown_video unknown │ https │ unknown unknown -
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
Code:1a1f14dd6631e811e8d636d5635917d8:94b9fec34033433b1a3c001185e2fabb 4af602a8662759dc9ce9850b980f7553:4ede744528a6fcdb3c88b65a19437737 b29dee1a3147576c8de7c12a272759b7:f8e46896797ca957d84592df48c95b63 fc942f3bd3c552a29fc6c5b4087e2b45:45e9ae65684e8734dcfc7d6ce7c442e2
-
look fine
[Attachment 74724 - Click to enlarge] -
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.
Could you eplain how you get them? -
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>
Similar Threads
-
How can i decrypt a stream from Joyn?
By PyNoob in forum Video Streaming DownloadingReplies: 7Last Post: 29th Jan 2025, 04:48 -
DOWNLOAD protected DRM video separated video and audio from (learnyst)
By yassin in forum Video Streaming DownloadingReplies: 4Last Post: 8th Jan 2024, 04:36 -
Cannot download encrypted m3u8 video, the video works on the website
By krestek in forum Video Streaming DownloadingReplies: 6Last Post: 21st Feb 2022, 14:27 -
Download HLS video using FFMPEG with separate video and audio URLs?
By oschrndz in forum Video Streaming DownloadingReplies: 2Last Post: 15th Dec 2020, 13:53 -
how to download a portion of video from m3u8 that has separate video audio.
By adi111 in forum Video Streaming DownloadingReplies: 8Last Post: 5th Aug 2020, 14:53