Hello,
i was able to learn myself which tools i need to download videos and get the relevant informations to decrypt videos. My first try with success was joyn.de, but i fail with https://dmax.de/. Im trying to get https://dmax.de/sendungen/helden-der-landwirtschaft, the first episode.
I already have video/audio, the pssh and license url. Im trying to get the keys with cdrm-project, but the license url is special.
URL: https://discovery-eur.conax.cloud/widevine/license
PSSH: AAAAYXBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAEEIARIQUs BsehxxQoCbpD8dxkKnShoFQ29uYXgiJDAwMDAwM2U5LWM1OTUt MzRiYS0yNTQ1LWVlZDMwZTMxZWI0ZQ==
But they use a special header request, i dont understand. Without the right request, i get:
header:Code:Error 500: {"status":"UNGRANTED_REQUEST","code":500,"errorCode":6001,"message":"Internal error"}
How to put this correct in cdrm?Code:OPTIONS /widevine/license HTTP/2 Host: discovery-eur.conax.cloud User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/113.0 Accept: */* Accept-Language: de,en-US;q=0.7,en;q=0.3 Accept-Encoding: gzip, deflate, br Access-Control-Request-Method: POST Access-Control-Request-Headers: content-type,preauthorization Referer: https://dmax.de/ Origin: https://dmax.de DNT: 1 Connection: keep-alive Sec-Fetch-Dest: empty Sec-Fetch-Mode: cors Sec-Fetch-Site: cross-site Sec-GPC: 1
Thanks![]()
+ Reply to Thread
Results 1 to 18 of 18
-
-
from lic url copy auth data and paste on headers
key
Code:b40681515c11459893a26fc1d6aa1e06:83879c2fb33e05eaf7ce5b3e8d43860f
so, add proxy or use python and your own cdmLast edited by lomero; 4th Jun 2023 at 08:15.
-
Code:
--key 52c06c7a1c7142809ba43f1dc642a74a:555c0929482f40ef16d04db175096a16
cdrm:
Last edited by iamghost; 4th Jun 2023 at 08:38.
-
Thanks both of you, but i do something wrong. I get the same key as iamghost, but my video doesnt play.
I decrypt and use
Code:ffmpeg.exe -i video_dec.mp4 -i audio_dec.mp4 -c copy final.mp4
Code:[mov,mp4,m4a,3gp,3g2,mj2 @ 00000254df04ea00] Incorrect number of samples in encryption info video_dec.mp4: Invalid data found when processing input [mov,mp4,m4a,3gp,3g2,mj2 @ 00000254df26ff00] Incorrect number of samples in encryption info audio_dec.mp4: Invalid data found when processing input
Last edited by DLH007; 4th Jun 2023 at 09:25.
-
For the first Episode, use key found by Lomero
Code:b40681515c11459893a26fc1d6aa1e06:83879c2fb33e05eaf7ce5b3e8d43860f
-
Oh thanks, i overlooked the key from lomero. But why does @iamghost have a different key?
Video works now, now i have to learn how to get the keys myself. -
my key is for Episode 1, other key is for episode 9 i check
Code:ep01 --key 52c06c7a1c7142809ba43f1dc642a74a:555c0929482f40ef16d04db175096a16 ep02 --key 4cb4da8ed2aa4d23869c126d7c29ebce:5338e3936346f5c9b32ec9626e9e9759 ep03 --key 5e7d912d7ed54878a2b4c61e55ee74c3:ef89b44fd9adc4ae56e2452f8e81e586 ep04 --key 227e35f27a1044cfb6a4a421e8881547:c2713feaf89bff34a8edf7ac69c7dbcd ep05 --key e194c806923a4d14982aa659e9acd953:f0fa382687ec66db0624d5fb4a40428b ep06 --key 0c782f96895744e3b706b293605f3af6:4b007fc878d3ab4825bd30d21350f13b ep07 --key a91da3101d394a2ba9e534fb483902d8:40d61263875fd828b35eb4c2ed1fd686 ep08 --key e4cc1e58ea584a948756659f3f156edc:f056bba203cfbf5b374c0e96ecc7be78 ep09 --key b40681515c11459893a26fc1d6aa1e06:83879c2fb33e05eaf7ce5b3e8d43860f
Last edited by iamghost; 4th Jun 2023 at 10:46. Reason: add
-
Sorry iamghost....wrong PSSH for me (from EP9)
So this is the good key
Try with N_m3u8DL-RE
Code:N_m3u8DL-RE --key 52c06c7a1c7142809ba43f1dc642a74a:555c0929482f40ef16d04db175096a16 "https://dplaydk-prod-vod.akamaized.net/f174c974-1d7d-4bda-816c-a9ab77aa8460/dash_widevinePlayready_fmp4/hdntl=exp=1685980655~acl=/f174c974-1d7d-4bda-816c-a9ab77aa8460/dash_widevinePlayready_fmp4/*~data=hdntl~hmac=9cb5bd9f3387338ef95ef30a7f3c4848ac6e4665e8554ae65d2433a3a41fc22e/master.mpd" -M format=mp4
-
I miss the like button for posts
.
Thank you very much.
@cedric, this information in code box a very usefulLast edited by DLH007; 4th Jun 2023 at 12:10. Reason: wrong informations
-
Now i have own CDM, using l3.py and input pssh and lic url, give error
Code:unable to parse license - check protobufs
device_client_id_blob and device_private_key are from android studio pixel 6. -
no need all in header.py
look highlight on the right side,copy this in header.py (left side)
-
Its working now, have used wrong combination from pssh and preauthorization.
I like the forum, people are very helpful -
all pages available this button "Alle Videos zur Sendung"
this makes all the video links visible and makes it easier to automate the process
[Attachment 71496 - Click to enlarge]
Code:from pywidevine.L3.cdm import cdm, deviceconfig from base64 import b64encode from pywidevine.L3.decrypt.wvdecryptcustom import WvDecrypt m3u8DL_RE = 'N_m3u8DL-RE.exe' from pathlib import Path import requests import subprocess 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.") print(f'\ntest link: https://dmax.de/sendungen/caravaning-cooking-brian-auf-grosser-tour/ein-bisschen-sudpol-in-europa\ntest link: https://dmax.de/sendungen/tattoo-edition-engelhard/episode-1\n') link = input('link: ') link_slug = re.findall(r'sendungen/(.*)/', link)[0].strip() ep_id = re.findall(r'.*/(.*)$', link)[0].strip() import requests headers00 = { 'authority': 'eu1-prod.disco-api.com', 'content-type': 'application/json', 'origin': 'https://dmax.de', 'referer': 'https://dmax.de/', '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', 'x-device-info': 'STONEJS/1 (Unknown/Unknown; Unknown/Unknown; Unknown)', 'x-disco-client': 'Alps:HyogaPlayer:0.0.0', 'x-disco-params': 'realm=dmaxde', } params00 = { 'realm': 'dmaxde', } response00 = requests.get('https://eu1-prod.disco-api.com/token', params=params00, headers=headers00).json() bear = 'Bearer ' auth_tok = bear+response00['data']['attributes']['token'] import requests headers01 = { 'authority': 'de-api.loma-cms.com', 'origin': 'https://dmax.de', 'referer': 'https://dmax.de/', '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', } params01 = { 'filter[show.slug]': link_slug, 'environment': 'dmax', 'v': '2', } response01 = requests.get('https://de-api.loma-cms.com/feloma/videos/'+ep_id+'/', params=params01, headers=headers01).json() videoId = response01['blocks'][0]['videoId'] def format_episode_number(number): number_str = str(number) if len(number_str) == 1: return '0' + number_str return number_str show_title = response01['blocks'][0]['item']['show']['title'] seasonNumber = response01['blocks'][0]['item']['seasonNumber'] episodeNumber = response01['blocks'][0]['item']['episodeNumber'] episodetitle = response01['blocks'][0]['item']['title'] zerofill_seasonNumber = format_episode_number(seasonNumber) zerofill_episodeNumber = format_episode_number(episodeNumber) title = f'{show_title} - S{zerofill_seasonNumber}E{zerofill_episodeNumber} - {episodetitle}' def replace_illegal_chars(title): illegal_chars = r'[<>:"/\\|?*\']' return re.sub(illegal_chars, '', title) a_title = replace_illegal_chars(title) print(f'\n{a_title}\n') import requests headers02 = { 'authority': 'eu1-prod.disco-api.com', 'authorization': auth_tok, 'content-type': 'application/json', 'origin': 'https://dmax.de', 'referer': 'https://dmax.de/', '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', } json_data02 = { 'deviceInfo': { 'adBlocker': False, 'drmSupported': True, 'hdrCapabilities': [ 'SDR', ], 'hwDecodingCapabilities': [], 'soundCapabilities': [ 'STEREO', ], }, 'wisteriaProperties': {}, 'videoId': f'{videoId}', } response02 = requests.post('https://eu1-prod.disco-api.com/playback/v3/videoPlaybackInfo', headers=headers02, json=json_data02).json() drmToken = response02['data']['attributes']['streaming'][0]['protection']['drmToken'] dashUrl = response02['data']['attributes']['streaming'][0]['url'] 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(dashUrl, headers=headers03).text pssh = re.findall(r'<cenc:pssh>(.{20,170})</cenc:pssh>', response03)[0].strip() print(f'{pssh}\n') lic_url = 'https://discovery-eur.conax.cloud/widevine/license' headers = { 'authority': 'discovery-eur.conax.cloud', 'content-type': 'application/octet-stream', 'origin': 'https://dmax.de', 'preauthorization': drmToken, 'referer': 'https://dmax.de/', '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', } def WV_Function(pssh, lic_url, cert_b64=None): wvdecrypt = WvDecrypt(init_data_b64=pssh, cert_data_b64=cert_b64, device=deviceconfig.device_android_generic) widevine_license = requests.post(url=lic_url, data=wvdecrypt.get_challenge(), headers=headers) license_b64 = b64encode(widevine_license.content) wvdecrypt.update_license(license_b64) Correct, keyswvdecrypt = wvdecrypt.start_process() if Correct: return Correct, keyswvdecrypt Correct, keys = WV_Function(pssh, lic_url) st='' for key in keys: st+=' --key '+key with open("key.txt","a+") as f: f.write(st[1:]+'\n') with open("key.txt", "r") as f2: datas = f2.read() print(datas) with open("key.txt", "r") as fs: ke_ys = fs.readlines() ke_ys = ke_ys[0].strip().split() subprocess.run([m3u8DL_RE, '-M', 'format=mkv:muxer=ffmpeg', '--concurrent-download', '--auto-select', '--del-after-done', '--log-level', 'INFO', '--save-name', 'video', dashUrl, *ke_ys]) try: Path('video.mkv').rename(''+a_title+'.mkv') print(f'{a_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.")
-
Hello sk8ordi3,
i dont know how to use this script. I am a complete newbie at python. -
copy the whole code into a text editor
save it as e.g.
something.py
then put it in the folder where you have the l3.py file
to run: (double click)
something.py
you will also need these exe's in the same folder:
N_m3u8DL-RE.exe
ffmpeg.exe
mp4decrypt.exe -
Wow
what a great script, thats nice and easy
Thank you very muchLast edited by DLH007; 9th Jun 2023 at 16:33.
Similar Threads
-
get license url widevine
By aletaladro in forum Video Streaming DownloadingReplies: 12Last Post: 14th Nov 2023, 08:39 -
hidden url license
By aletaladro in forum Video Streaming DownloadingReplies: 0Last Post: 16th May 2023, 19:21 -
How to find wv license url
By juesus in forum Video Streaming DownloadingReplies: 4Last Post: 10th Aug 2022, 09:41 -
How to obtain mpd url and license url
By pepperx in forum Newbie / General discussionsReplies: 0Last Post: 1st Oct 2021, 16:05 -
License URL Request
By vfa1 in forum Video Streaming DownloadingReplies: 1Last Post: 29th Jun 2021, 11:12