U
    $P‘fÅ'  ã                   @   sš   d dl mZ d dlZd dlZz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}|  tp*| ¡ |  |o<dˆ k ¡ |  | d¡ ¡ t|ƒS )N)z"#EXT-X-KEY:METHOD=(?!NONE|AES-128)z#EXT-X-MAP:c                    s   g | ]}t  |ˆ ¡ ‘qS © )ÚreÚsearch)Ú.0Zfeature©Úmanifestr   ú=/tmp/pip-unpacked-wheel-7zdooeg3/youtube_dl/downloader/hls.pyÚ
<listcomp>5   s     z&HlsFD.can_download.<locals>.<listcomp>z#EXT-X-KEY:METHOD=AES-128ú#EXT-X-BYTERANGEZis_live)Ú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 }|   d| j ¡ | j |  ||¡¡}| ¡ }| ¡  dd¡}|  ||¡s¬| 	d¡sd| 	d¡rr|  
d¡ dS |  d	¡ t| j| jƒ}| jD ]}| |¡ q| ||¡S d
d„ }dd„ }	d}
d}d}| ¡ D ]R}| ¡ }|sâqÐ| d¡r
||ƒrüd}qÐ|	|ƒrÐd}qÐ|r|d7 }qÐ|
d7 }
qÐ||
|dœ}|  |¡ | j 	dd¡}| j 	dd¡}| j 	dd¡}d }| 	d¡}|r‚t |¡}d}d}ddi}i }d}d}| ¡ D ]Z}| ¡ }|r¦| d¡s¸|rÐq¦|d7 }||d krêq¦t d|¡rü|n
t ||¡}|rt||ƒ}d}| 	di ¡}|rJd|d |d d f |d< ||krÎz,|  ||||¡\}}|sxW  dS W qÎW nH tjk
rÈ } z&|d7 }||kr¸|  ||||¡ W 5 d }~X Y nX qJ||kr|rü|d7 }|d7 }|  |¡ q¦|  
d| ¡  dS |d d krŒ| 	d!¡p2t d"|ƒ}| 	d#¡pf| j |  || 	d¡p^|d$ ¡¡ ¡ |d#< |sŒt! "|d# t!j#|¡ $|¡}|  %||¡ |r¤ q|d7 }|d7 }q¦| d%¡rl| 	d$¡} t&|d&d … ƒ}|d d kr d!|krt' (|d! d'd …  )d(¡¡|d!< t d|d$ ¡s<t ||d$ ¡|d$< |rTt|d$ |ƒ|d$< | |d$ kr d |d#< n”| d)¡rŠt*|d*d … ƒ}nv| d+¡râ|d,d …  +d-¡}!t,|!ƒd'krÂt*|!d ƒn|d }"|"|"t*|!d ƒ d.œ}n||ƒròd}n|	|ƒr¦d}q¦|  -|¡ 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&   |   d¡rd| kp$|   d¡o$|  d¡S )Nú#ANVATO-SEGMENT-INFOztype=adú#UPLYNK-SEGMENTz,ad©Ú
startswithÚendswith©Úsr   r   r   Úis_ad_fragment_startP   s    ÿz1HlsFD.real_download.<locals>.is_ad_fragment_startc                 S   s&   |   d¡rd| kp$|   d¡o$|  d¡S )Nr    ztype=masterr!   z,segmentr"   r%   r   r   r   Úis_ad_fragment_endT   s    ÿz/HlsFD.real_download.<locals>.is_ad_fragment_endr   ú#Tr   )ÚfilenameZtotal_fragsÚad_fragsÚfragment_retriesÚskip_unavailable_fragmentsÚtestZMETHODÚNONEZfragment_indexz
^https?://Zhttp_headerszbytes=%d-%dÚstartÚendZRangez#giving up after %s fragment retrieszAES-128ZIVz>8xqZKEYÚURIz
#EXT-X-KEYé   r   é    z#EXT-X-MEDIA-SEQUENCEé   r   é   ú@)r0   r1   ).Z	to_screenÚFD_NAMEZydlÚurlopenZ_prepare_urlÚgeturlÚreadÚdecoder   r   Zreport_errorZreport_warningr   ÚparamsZ_progress_hooksZadd_progress_hookÚreal_downloadÚ
splitlinesÚstripr#   Z _prepare_and_start_frag_downloadr	   Úparse_qsr   ÚmatchÚurljoinr   Z_download_fragmentr   Ú	HTTPErrorZreport_retry_fragmentZreport_skip_fragmentr
   r   ÚnewZMODE_CBCZdecryptZ_append_fragmentr   ÚbinasciiÚ	unhexlifyÚzfillÚintÚsplitÚlenZ_finish_frag_download)#Úselfr*   r   Zman_urlZurlhr&   ÚfdÚphr'   r(   Zmedia_fragsr+   Zad_frag_nextÚlineÚctxr,   r-   r.   Zextra_queryr   ÚiZmedia_sequenceZdecrypt_infoZ
byte_rangeZ
frag_indexZfrag_urlÚcountÚheadersÚsuccessZfrag_contentÚerrZivZdecrypt_urlZsplitted_byte_rangeZsub_range_startr   r   r   r>   <   s    
ÿ

ý



ÿ
ý

   ÿ

&

ÿÿ  ÿÿ

  ÿ
"þ


zHlsFD.real_downloadN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r8   Ústaticmethodr   r>   r   r   r   r   r      s
   
r   )Ú
__future__r   r   rF   ZCrypto.Cipherr   r   ÚImportErrorÚfragmentr   Zexternalr   Úcompatr   r	   r
   Úutilsr   r   r   r   r   r   r   Ú<module>   s   
