a
    ;hOL                     @   s   d dl Z d dlZd dlZd dlZddlmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZ dd	lmZmZmZmZmZmZ dd
lmZ G dd de
ZdS )    N   )get_suitable_downloader)FFmpegFD)
FragmentFD   )webvtt)
Cryptodome)bug_reports_messageparse_m3u8_attributesremove_starttraverse_objupdate_url_queryurljoin)_request_dump_filenamec                   @   s6   e Zd ZdZdZedd ZedddZdd	 Z	d
S )HlsFDz
    Download segments in a m3u8 manifest. External downloaders can take over
    the fragment downloads by supporting the 'm3u8_frag_urls' protocol and
    re-defining 'supports_manifest' function
    Z	hlsnativec                 C   s   t tdd| S )N|)z&#EXT-X-(?:SESSION-)?KEY:.*?URI="skd://zG#EXT-X-(?:SESSION-)?KEY:.*?KEYFORMAT="com\.apple\.streamingkeydelivery"z@#EXT-X-(?:SESSION-)?KEY:.*?KEYFORMAT="com\.microsoft\.playready"z#EXT-X-FAXS-CM:)boolresearchjoin)manifest r   Z/var/www/html/swiplay.fr/scambot/venv/lib/python3.9/site-packages/yt_dlp/downloader/hls.py_has_drm   s    zHlsFD._has_drmFc                    s0   g  s dg7   fdd}t | S )Nz"#EXT-X-KEY:METHOD=(?!NONE|AES-128)c                  3   s>    d V   D ]} t|  V  qs: V  d S )NZis_live)getr   r   r   )featureZUNSUPPORTED_FEATURESallow_unplayable_formatscls	info_dictr   r   r   check_resultsB   s
    z)HlsFD.can_download.<locals>.check_results)all)r   r   r   r   r    r   r   r   can_download(   s    zHlsFD.can_downloadc           /   	      s  |d }| d}|r,dj d ndj d j||}|j}| }j drt	||d d j dd	}dj d
|  t
|d}|| W d    n1 s0    Y  |dd}||j dd  }	}
|	rt }tjsdd|v rdt|dtf }d|rB|sBdnd}
|rZ|rZd}	n|
d7 }
n8| ddkrtd|r|rdnd}d| d}
|	s>|rj ds| drj drjdj dd d! njd"dd# dS |
p
d$}
tjj}|
 d%|   |||S |
rN|
 |d& d'k}|rfd }nt|jd d(|d)kd*}|r||sd }|rdj d+|   d,d- }d.d/ }g }d0}d0}d}| D ]`}| }|sq| d1r"||rd }n||rd}q|r4|d27 }q|d27 }q|||d3}|r^!| n"|| |#d4i  | d5}d }| d6 }rt$j%&|}d }| d7 }rt$j%&|}d0}d0}d8d9i} t|d:}!|!rt'(t)|!d;}!t*|!d<v sJ d=t|d>}"|"r,t'(t)|"d;+d?}"i }#d0}$d0}%d0}&d}| D ]}| }|rH| d1s|r||%|kr|qH|rqH|&d27 }&|&|d@ krqHt,||}'|rt-|'|}'|.|&|'| |#|dA |d27 }|#rH|#dB }$i }#nZ| dCr|r|%|krqH|&d0kr(dD  dS |&d27 }&t/|dEd  }(t,||( dF}'|r`t-|'|}'i })|( dGr|( dG0dH}*t*|*dIkrt1|*d2 nd0}+|+|+t1|*d0  dJ})|.|&|'| |)|dA |d27 }nr| dKr|  dF},t/|dEd  } | d8 dLkrH|"r|"| dM< n*dM| v rDt'(| dM dId  +d?| dM< |!rT|!| dN< nLt,|| dF | dF< |sr|rt-| dF |p|| dF< |,| dF krHd | dN< n| dOrt1|dPd  }n| dQr|dRd  0dH}*t*|*dIkrt1|*d2 n|$}+|+|+t1|*d0  dJ}#n4||r$d }n$||r4d}n| dSrH|%d27 }%|d27 }qHj ddrx|rr|d0 nd g}|r||dT< |jj}|||S |r fdUdV}- fdWdX}.t*|d2krވ2||| nj2||||-|.dY n2|||S d S )ZNurlhls_media_playlist_data[z)] Using m3u8 manifest from extracted infoz] Downloading m3u8 manifestZwrite_pagesidZtrim_file_name)Ztrim_lengthz] Saving request to wbzutf-8ignorer   z#EXT-X-KEY:METHOD=AES-128)extra_param_to_segment_urlextra_param_to_key_urlr$   )hls_aes)urikeyivz2The stream has AES-128 encryption and {} availablez$neither ffmpeg nor pycryptodomex arezpycryptodomex is notFzC; decryption will be performed natively, but will be extremely slowZextractor_keyGenericz (?m)#EXT-X-MEDIA-SEQUENCE:(?!0$) zinstall ffmpeg and z]Live HLS streams are not supported by the native downloader. If this is a livestream, please z:add "--downloader ffmpeg --hls-use-mpegts" to your commandZhas_drmtestz] This format is DRM protectedT)Zskip_eolzThis format is DRM protected; Try selecting another format with --format or add --check-formats to automatically fallback to the next best format)tbz'Unsupported features have been detectedz"; extraction will be delegated to extZvttZm3u8_frag_urls-)protocolZ	to_stdoutz*] Fragment downloads will be delegated to c                 S   s&   |  drd| v p$|  do$| dS )N#ANVATO-SEGMENT-INFOztype=ad#UPLYNK-SEGMENTz,ad
startswithendswithsr   r   r   is_ad_fragment_start   s    z1HlsFD.real_download.<locals>.is_ad_fragment_startc                 S   s&   |  drd| v p$|  do$| dS )Nr6   ztype=masterr7   z,segmentr8   r;   r   r   r   is_ad_fragment_end   s    z/HlsFD.real_download.<locals>.is_ad_fragment_endr   #r   )filenameZtotal_fragsad_fragsextra_stateformat_indexr)   r*   ZMETHODNONE)r+   r-   0x)          z"Invalid length for HLS AES-128 key)r+   r.   rH   Zfragment_index)
frag_indexr#   decrypt_info
byte_rangemedia_sequenceendz
#EXT-X-MAPzGInitialization fragment found after media fragments, unable to download   URIZ	BYTERANGE@r   )startrM   z
#EXT-X-KEYzAES-128ZIVZKEYz#EXT-X-MEDIA-SEQUENCE   z#EXT-X-BYTERANGE   z#EXT-X-DISCONTINUITY	fragmentsc                    sP  t  }d}d}d }t| D ]"}t|tjr,| d< |rR d  d7  < d}| j|7  _| j|7  _ dg }g }d}	d}
|	t	|k r||	 }tj
|}|	d7 }	||r|j|d< d}
q||krd}
q|j|jkrq|| |	d8 }	||	= q|
r||j |D ]}|| qqnt|tjr|jd u rLd|_ dd | j d d	> 7  _|j ddk rd}| jd
7  _|j}|dkr|jpd d< |jpd d< n:|jd ur|jd ur|j dd |j dd  }qn6t|tjr8|dkr8tdt|j d q|| q|  S )Nr   FZwebvtt_mpegts_lastZwebvtt_mpegts_adjustr   webvtt_dedup_windowTrM   !   l        Zwebvtt_mpegtsZwebvtt_localzDiscarding a zO block found in the middle of the stream; if the subtitles display incorrectly,)ioStringIOr   Zparse_fragment
isinstanceCueBlockrQ   rM   
setdefaultlen	from_jsonZhingesappendZas_json
write_intoZMagicZmpegtsr   localZHeaderBlockreport_warningr	   type__name__getvalueencode)Zfrag_contentrI   outputadjustZoverflowZmpegts_lastblockdedup_windowreadyiZis_newZwcueZwblockrB   selfr   r   pack_fragment:  s~    




z*HlsFD.real_download.<locals>.pack_fragmentc                     sB     d} | sdS t }| D ]}tj|| q|  S )NrU       )	r   rW   rX   r   rZ   r]   r_   rd   re   )ri   rf   Zcue)rB   r   r   fin_fragments  s    
z*HlsFD.real_download.<locals>.fin_fragments)Z	pack_funcZfinish_func)3r   Z	to_screenFD_NAMEZydlurlopenZ_prepare_urlr#   readparamsr   openwritedecoder"   r   	availabler   ZAESr   anyformatr   r   r   Zreport_errorra   Zget_basenamereal_downloadr   Zsupports_manifest
splitlinesstripr9   Z_prepare_external_frag_downloadZ _prepare_and_start_frag_downloadr[   urllibparseparse_qsbinascii	unhexlifyr   r\   zfillr   r   r^   r
   splitintZdownload_and_append_fragments)/rm   r@   r   Zman_urlr<   ZurlhZs_bytesZdump_filenameoutfr"   messageZ
has_ffmpegZffmpeg_can_dlZinstall_ffmpegfdZ	is_webvttZreal_downloaderr=   r>   rT   Zmedia_fragsrA   Zad_frag_nextlinectxrC   Zextra_segment_queryr)   Zextra_key_queryr*   rk   rL   rJ   Zexternal_aes_keyZexternal_aes_ivrK   Zbyte_range_offsetZdiscontinuity_countrI   Zfrag_urlZmap_infoZmap_byte_rangeZsplitted_byte_rangeZsub_range_startZdecrypt_urlrn   rp   r   rl   r   r{   J   s   


(














 



N
zHlsFD.real_downloadN)F)
rc   
__module____qualname____doc__rq   staticmethodr   classmethodr"   r{   r   r   r   r   r      s   
!r   )r   rW   r   urllib.parser~   r0   r   Zexternalr   fragmentr   r   Zdependenciesr   utilsr	   r
   r   r   r   r   Zutils._utilsr   r   r   r   r   r   <module>   s    