3
Õb`¼%  ã               @   sš   d dl mZ d dlZd dlZyd dlmZ dZW n ek
rH   dZY nX ddlm	Z	 ddl
mZ d	d
lmZmZmZ d	dlmZmZ G dd„ de	ƒZdS )é    )Úunicode_literalsN)ÚAESTFé   )Ú
FragmentFD)ÚFFmpegFDé   )Úcompat_urllib_errorÚcompat_urlparseÚcompat_struct_pack)Úparse_m3u8_attributesÚupdate_url_queryc               @   s(   e Zd ZdZdZedd„ ƒZdd„ ZdS )ÚHlsFDz7 A limited implementation that does not require ffmpeg Z	hlsnativec                s\   d}‡ fdd„|D ƒ}dˆ k}|j tp*| ƒ |j |o<dˆ k ƒ |j |jdƒ ƒ t|ƒS )Nú"#EXT-X-KEY:METHOD=(?!NONE|AES-128)c                s   g | ]}t j|ˆ ƒ ‘qS © )ÚreÚsearch)Ú.0Zfeature)Úmanifestr   úJC:\Users\Broad\Desktop\BeinConnetFix\binaries\youtube_dl\downloader\hls.pyú
<listcomp>3   s    z&HlsFD.can_download.<locals>.<listcomp>z#EXT-X-KEY:METHOD=AES-128z#EXT-X-BYTERANGEÚis_live)r   )ÚappendÚcan_decrypt_fragÚgetÚall)r   Ú	info_dictZUNSUPPORTED_FEATURESZcheck_resultsZis_aes128_encr   )r   r   Úcan_download   s    zHlsFD.can_downloadc       #      C   s  |d }| j d| j ƒ | jj| j||ƒƒ}|jƒ }|jƒ jddƒ}| j||ƒs°|j	dƒsd|j	dƒrr| j
dƒ dS | jd	ƒ t| j| jƒ}x| jD ]}|j|ƒ q’W |j||ƒS d
d„ }dd„ }	d}
d}d}x`|jƒ D ]T}|jƒ }|sèqÖ|jdƒ�r||ƒ�rd}qÖ|	|ƒrÖd}qÖ|�r"|d7 }qÖ|
d7 }
qÖW ||
|dœ}| j|ƒ | jj	ddƒ}| jj	ddƒ}| jj	ddƒ}d }|j	dƒ}|�rŒtj|ƒ}d}d}ddi}i }d}d}�xT|jƒ D �]F}|jƒ }|�r´|jdƒ�s²|�rÞ�q´|d7 }||d k�rø�q´tjd|ƒ�r
|n
tj||ƒ}|�r&t||ƒ}d}|j	di ƒ}|�rTd|d |d f |d< x~||k�rÒy$| j||||ƒ\}}|�s€dS P W nH tjk
�rÌ } z(|d7 }||k�r¼| j||||ƒ W Y d d }~X nX �qVW ||k�r|�r|d7 }|d7 }| j|ƒ �q´| j
d| ƒ dS |d d k�rŠ|j	d!ƒ�p6t d"|ƒ}|j	d#ƒ�pj| jj| j||j	dƒ�pb|d$ ƒƒjƒ |d#< t!j"|d# t!j#|ƒj$|ƒ}| j%||ƒ |�ržP |d7 }|d7 }�q´|jd%ƒ�rf|j	d$ƒ} t&|d&d … ƒ}|d d k�rúd!|k�rt'j(|d! d'd … j)d(ƒƒ|d!< tjd|d$ ƒ�s6tj||d$ ƒ|d$< |�rNt|d$ |ƒ|d$< | |d$ k�rúd |d#< n”|jd)ƒ�r„t*|d*d … ƒ}nv|jd+ƒ�rÜ|d,d … j+d-ƒ}!t,|!ƒd'k�r¼t*|!d ƒn|d }"|"|"t*|!d ƒ d.œ}n||ƒ�rìd}n|	|ƒ�r´d}�q´W | j-|ƒ dS )/NÚurlz[%s] Downloading m3u8 manifestzutf-8ÚignoreÚextra_param_to_segment_urlZ_decryption_key_urlz&pycrypto not found. Please install it.Fz[hlsnative has detected features it does not support, extraction will be delegated to ffmpegc             S   s&   | j dƒrd| kp$| j dƒo$| jdƒS )Nz#ANVATO-SEGMENT-INFOztype=adz#UPLYNK-SEGMENTz,ad)Ú
startswithÚendswith)Úsr   r   r   Úis_ad_fragment_startN   s    z1HlsFD.real_download.<locals>.is_ad_fragment_startc             S   s&   | j dƒrd| kp$| j dƒo$| jdƒS )Nz#ANVATO-SEGMENT-INFOztype=masterz#UPLYNK-SEGMENTz,segment)r    r!   )r"   r   r   r   Úis_ad_fragment_endR   s    z/HlsFD.real_download.<locals>.is_ad_fragment_endr   ú#Tr   )ÚfilenameÚtotal_fragsÚad_fragsÚfragment_retriesÚskip_unavailable_fragmentsÚtestZMETHODZNONEÚfragment_indexz
^https?://Úhttp_headerszbytes=%d-%dÚstartÚendÚRangez#giving up after %s fragment retrieszAES-128ZIVz>8xqZKEYZURIz
#EXT-X-KEYé   r   é    z#EXT-X-MEDIA-SEQUENCEé   z#EXT-X-BYTERANGEé   ú@)r.   r/   ).Ú	to_screenÚFD_NAMEÚydlÚurlopenÚ_prepare_urlÚgeturlÚreadÚdecoder   r   Úreport_errorÚreport_warningr   ÚparamsÚ_progress_hooksÚadd_progress_hookÚreal_downloadÚ
splitlinesÚstripr    Ú _prepare_and_start_frag_downloadr	   Úparse_qsr   ÚmatchÚurljoinr   Ú_download_fragmentr   Ú	HTTPErrorÚreport_retry_fragmentÚreport_skip_fragmentr
   r   ÚnewZMODE_CBCZdecryptÚ_append_fragmentr   ÚbinasciiÚ	unhexlifyÚzfillÚintÚsplitÚlenÚ_finish_frag_download)#Úselfr&   r   Úman_urlÚurlhr"   ÚfdÚphr#   r$   Zmedia_fragsr(   Zad_frag_nextÚlineÚctxr)   r*   r+   Zextra_queryr   ÚiZmedia_sequenceZdecrypt_infoZ
byte_rangeÚ
frag_indexÚfrag_urlÚcountÚheadersÚsuccessÚfrag_contentÚerrZivZdecrypt_urlZsplitted_byte_rangeZsub_range_startr   r   r   rC   :   sú    






(


&

 
"



zHlsFD.real_downloadN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r7   Ústaticmethodr   rC   r   r   r   r   r      s   r   )Ú
__future__r   r   rP   ZCrypto.Cipherr   r   ÚImportErrorÚfragmentr   Úexternalr   Úcompatr   r	   r
   Úutilsr   r   r   r   r   r   r   Ú<module>   s   
