Files
video_extractor/__pycache__/tvp_download.cpython-310.pyc
T

79 lines
8.3 KiB
Plaintext
Raw Normal View History

2026-08-08 12:35:28 +02:00
o
2/já&ã @sˆdZddlZddlZddlZddlZddlZddlZddlmZee ƒj
Z e dZ e dZ
e dZdd„ZeƒZe d Zd
Zd Zd d
ddœZdd„Zdd„Zdd„Zdd„Zdd„Zd9dd„Zdd„Zedk�rBesyede d ›d!�ƒe d"¡e
 ¡r�e ¡s�ed#e
›d$e›�ƒe d"¡ej d"d…Z!e!sªed%ƒed&ƒed'ƒe d"¡gZ"e!dd(krìe#e!d"ƒZ$ed)e$›d*�ƒee$ƒZ%ed+e&e%ƒ›d,�ƒe%D]\Z'Z(Z)ed-e'd.›d/e(›d0e)›�ƒqÐd1d2„e%DƒZ"nd3d2„e!DƒZ"dZ*Z+e"D];Z(zee(ƒ�re*d"7Z*ne+d"7Z+Wqùe,�y4Z-zed4e(›d5e-›�ƒddl.Z.e. /¡e+d"7Z+WYdZ-[-qùdZ-[-wwed6e*›d7e+›d8�ƒdSdS):u*
TVP VOD batch downloader — Widevine L3 key extraction + DASH download.
Usage:
python3 tvp_download.py <product_id> [<product_id> ...]
python3 tvp_download.py --series <series_page_url>
Requirements:
pip install pywidevine requests
Tools: N_m3u8DL-RE, mp4decrypt (in TOOLS_DIR)
éN)ÚPathÚtoolsz N_m3u8DL-REÚ
mp4decryptc Csvddlm}ttd d¡ƒD]!}z| t|ƒ¡}|jr&|jdkr&|WSWqty0Yqwt td d¡dƒS)Nr©ÚDeviceÚL3z*.wvd)
Úpywidevine.devicerÚsortedÚHEREÚglobÚloadÚstrÚ system_idÚ ExceptionÚnext)rÚpÚd©rúP/media/lukas/VFX_Archive/Public/video_extractor/widevine_extract/tvp_download.pyÚ _find_wvds 
€ ÿrÚ downloadsz/tmp/n_m3u8dl_tmpzhttps://vod.tvp.pl/apizUMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120 Safari/537.36zhttps://vod.tvp.pl/zapplication/json)ú
User-AgentÚRefererÚAcceptc CsfdD]}tjt›d|›d�d|dœtdd�}|jr| ¡Sqtd|›d |j›d
|jd d …›�ƒ‚)
z%Returns dict with sources + drm info.)ÚMOVIEÚLIVEú
/products/z/videos/playlistÚBROWSER)ÚplatformÚ videoTypeé©ÚparamsÚheadersÚtimeoutzPlaylist fetch failed for ú: Ú Néx) ÚrequestsÚgetÚAPIÚHEADERSÚokÚjsonÚ RuntimeErrorÚ status_codeÚtext)Ú
product_idÚvtypeÚrrrrÚ get_playlist.sý ÿ&r4cCs2tjt›d|›�dditdd�}|jr| ¡SiS)Nrrrr r!)r(r)r*r+r,r-)r1r3rrrÚget_product_info:s ÿr5cCs
ddlm}ddlm}ddlm}| ttƒ¡}|  |¡}| 
¡}|  |||ƒ¡}t j
||tdddœdd �} | jsKtd
| j›d | jd d
…›�ƒ‚| || j¡dd l}
i} | |¡D] } t| jƒdvr}t| j|
jƒrq| jjn| j ¡}
| j ¡| |
<q]| |¡| S)z@Use pywidevine to fetch the CONTENT key from the license server.r)ÚCdmr)ÚPSSHrzapplication/octet-stream)rz Content-Typer )Údatar#r$zLicense server r%NéÈ)ÚSIGNINGÚOPERATOR_SESSION)Úpywidevine.cdmr6rrÚpywidevine.psshr7r r
ÚWVDÚ from_deviceÚopenÚget_license_challenger(Úpostr+r,r.r/r0Ú
parse_licenseÚcontentÚuuidÚget_keysÚtypeÚ
isinstanceÚkidÚUUIDÚhexÚkeyÚclose)Úpssh_b64Ú license_urlr6rr7ÚdeviceÚcdmÚ
session_idÚ challenger3Ú_uuidÚkeysrLrIrrrÚfetch_content_keyBs4   
ÿü  €
rVc
Cs¸tj|dd�}| ¡t d|j¡}|r| d¡ ¡St d|j¡}|rX| d¡ dd¡}dd l }dd l
}t   |¡}d
|}d t   d ¡d
| 
dt|ƒ¡|} | | ¡ ¡Stdƒ‚)z+Fetch MPD and extract Widevine PSSH base64.r )r$z<cenc:pssh>([^<]+)</cenc:pssh>ézdefault_KID="([^"]+)"Ú-ÚrNssÚ edef8ba979d64acea3c827dcd51d21edsz>IzNo PSSH found in MPD)r(r)Úraise_for_statusÚreÚsearchr0ÚgroupÚstripÚreplaceÚbase64ÚstructÚbytesÚfromhexÚpackÚlenÚ b64encodeÚdecoder.)
Úmpd_urlr3ÚmÚm2Úkid_hexrarbÚ kid_bytesÚprotoÚbox_datarrrÚextract_pssh_from_mpdbs.
þýüüÿrpc CsÔ| dd¡}t d|tj¡}|rt| d¡ƒnd}| d¡p(|r't| d¡ƒnd}| dd¡}t d d|¡ d
¡}|sTt d d| d t| d
¡ƒ¡¡ ¡}t dd|¡}|  d
d¡ d¡}d|d›d|d›d|›�S)z.Build sXXeXX_title filename from product info.ÚwebUrlrYz S(\d+)E(\d+)rWÚnumberérÚslugz
^odc-\d+-+rXu^odc\.\s*\d+\s*[–\-]\s*ÚtitleÚidz[^\w ]Ú_ÚsÚ02dÚe)
r)r\r]Ú
IGNORECASEÚintr^Úsubr_r
r`)ÚinfoÚweb_urlrjÚseasonÚepisodertÚcleanrrrÚmake_save_name~s   $rƒc
Cspt|ƒ}| dt|ƒ¡}| dd¡}tdd›�ƒtd|›d|›d|›d �ƒt|ƒ}|d
d d d
}|ddd
}td|dd…›d�ƒtd|›�ƒzt|ƒ}t|ƒ}|d
d d d
}Wntyw} ztd| ›�ƒ‚d} ~ wwtd|dd…›d�ƒt||ƒ}
|
s�tdƒ‚|
  ¡D]\} } td| ›d| ›�ƒq“g}
|
  ¡D]\} } |
d| ›d| ›�g7}
q¨|durÀt
|ƒ}t j ddd�tt
ƒ|g|
¢d‘tt ƒ‘d‘|‘d‘d ‘d!‘d ‘d"‘t‘d#‘ttƒ‘d$‘d%‘}td&|›�ƒt |¡}|jd k�r td'|j›d(�ƒd)St |›d*�}| ¡�r/| ¡jd+d+}td,|j›d-|›d.�ƒdStd/|›�ƒd)S)0NrurGÚUNKNOWNÚ
z<============================================================zProduct r%z [ú]ÚsourcesÚDASHrÚsrcÚdrmÚWIDEVINEz MPD: éPú...z License: zPSSH extraction failed: z PSSH: é(z*No CONTENT keys returned by license serverz Key: ú:z--keyT)ÚparentsÚexist_okz
--save-dirz --save-namez--select-videoÚbestz--select-audioz --tmp-dirz--decryption-binary-pathz--mux-after-donezformat=mp4:bin=ffmpegz
Running: N_m3u8DL-RE z [!] Download failed (exit ú)Fz.mp4iz
[+] Saved: z (z MB)z [!] Output file not found: )r5r)r
Úprintr4rprr.rVÚitemsrƒÚSAVE_DIRÚmkdirÚN_M3U8ÚTMP_DIRÚMP4DECÚ
subprocessÚrunÚ
returncodeÚexistsÚstatÚst_sizeÚname)r1Ú save_namer~ruÚptypeÚplaylistriÚlic_urlÚpsshrzrUrIrLÚkey_argsÚcmdÚresultÚout_fileÚsize_mbrrrÚdownload’s” €ÿ
ÿþýýüüûûúúùùøø ÷ ÷