3
˜b`H<  ã               @   sè   d dl mZmZ d dlZd dlZd dlZddlmZ ddlm	Z	m
Z
mZmZmZmZmZ ddlmZmZ G dd	„ d	eƒZG d
d„ dejƒZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd dd„Zdd„ ZG dd„ deƒZ dS )!é    )ÚdivisionÚunicode_literalsNé   )Ú
FragmentFDé   )Úcompat_b64decodeÚcompat_etree_fromstringÚcompat_urlparseÚcompat_urllib_errorÚcompat_urllib_parse_urlparseÚcompat_struct_packÚcompat_struct_unpack)Úfix_xml_ampersandsÚ
xpath_textc               @   s   e Zd ZdS )ÚDataTruncatedErrorN)Ú__name__Ú
__module__Ú__qualname__© r   r   úEC:\Users\Broad\Desktop\All-Down\binaries\youtube_dl\downloader\f4m.pyr      s   r   c               @   s`   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ ZdS )Ú	FlvReaderzi
    Reader for Flv files
    The file format is documented in https://www.adobe.com/devnet/f4v.html
    c             C   s.   | j |ƒ}t|ƒ|k r*td|t|ƒf ƒ‚|S )Nz6FlvReader error: need %d bytes while only %d bytes got)ÚreadÚlenr   )ÚselfÚnÚdatar   r   r   Ú
read_bytes!   s    
zFlvReader.read_bytesc             C   s   t d| jdƒƒd S )Nz!Qé   r   )r   r   )r   r   r   r   Úread_unsigned_long_long*   s    z!FlvReader.read_unsigned_long_longc             C   s   t d| jdƒƒd S )Nz!Ié   r   )r   r   )r   r   r   r   Úread_unsigned_int-   s    zFlvReader.read_unsigned_intc             C   s   t d| jdƒƒd S )Nz!Br   r   )r   r   )r   r   r   r   Úread_unsigned_char0   s    zFlvReader.read_unsigned_charc             C   s*   d}x | j dƒ}|dkrP ||7 }qW |S )Nó    r   ó    )r   )r   ÚresÚcharr   r   r   Úread_string3   s    
zFlvReader.read_stringc             C   sB   | j ƒ  }}| jdƒ}d}|dkr.| jƒ }d}||| j|| ƒfS )z[
        Read a box and return the info as a tuple: (box_size, box_type, box_data)
        r   r   r   é   )r    r   r   )r   Z	real_sizeÚsizeÚbox_typeZ
header_endr   r   r   Úread_box_info<   s    
zFlvReader.read_box_infoc             C   sx   | j ƒ  | jdƒ | j ƒ }xt|ƒD ]}| jƒ  q$W | jƒ }g }x.t|ƒD ]"}| jƒ }| jƒ }|j||fƒ qJW d|iS )Né   Úsegment_run)r!   r   Úranger&   r    Úappend)r   Úquality_entry_countÚiZsegment_run_countÚsegmentsZfirst_segmentZfragments_per_segmentr   r   r   Ú	read_asrtH   s    
zFlvReader.read_asrtc       	      C   s¤   | j ƒ  | jdƒ | jƒ  | j ƒ }xt|ƒD ]}| jƒ  q,W | jƒ }g }xRt|ƒD ]F}| jƒ }| jƒ }| jƒ }|dkr€| j ƒ }nd }|j||||dœƒ qRW d|iS )Nr+   r   )ÚfirstÚtsÚdurationÚdiscontinuity_indicatorÚ	fragments)r!   r   r    r-   r&   r   r.   )	r   r/   r0   Úfragments_countr7   r3   Zfirst_tsr5   r6   r   r   r   Ú	read_afrt]   s*    

zFlvReader.read_afrtc             C   sJ  | j ƒ  | jdƒ | jƒ  | j ƒ }|d@ dk}| jƒ  | jƒ  | jƒ  | jƒ  | j ƒ }xt|ƒD ]}| jƒ  q`W | j ƒ }xt|ƒD ]}| jƒ  q‚W | jƒ  | jƒ  | j ƒ }g }x@t|ƒD ]4}| jƒ \}}	}
|	dksÖt‚t|
ƒj	ƒ }|j
|ƒ q¸W | j ƒ }g }x@t|ƒD ]4}| jƒ \}}	}
|	dk�s&t‚|j
t|
ƒjƒ ƒ �qW |||dœS )Nr+   é    r   s   asrts   afrt)r1   r7   Úlive)r!   r   r    r   r&   r-   r*   ÚAssertionErrorr   r2   r.   r9   )r   Úflagsr;   Zserver_countr0   Zquality_countZsegments_countr1   Zbox_sizer)   Úbox_dataÚsegmentZfragments_run_countr7   r   r   r   Ú	read_abst   sB    
zFlvReader.read_abstc             C   s&   | j ƒ \}}}|dkst‚t|ƒjƒ S )Ns   abst)r*   r<   r   r@   )r   Z
total_sizer)   r>   r   r   r   Úread_bootstrap_info²   s    zFlvReader.read_bootstrap_infoN)r   r   r   Ú__doc__r   r   r    r!   r&   r*   r2   r9   r@   rA   r   r   r   r   r      s   		"3r   c             C   s   t | ƒjƒ S )N)r   rA   )Zbootstrap_bytesr   r   r   rA   ¸   s    rA   c       	      C   sœ   g }| d d }| d d d }|d d }t j|ƒ}xL|d D ]@\}}|dkr\| d r\d}x"t|ƒD ]}|j|t|ƒfƒ qfW q@W | d r˜|d
d	… }|S )zE Return a list of (segment, fragment) for each fragment in the video r1   r   r7   r3   r,   l   ÿÿ r;   r   Néþÿÿÿ)Ú	itertoolsÚcountr-   r.   Únext)	Ú	boot_infor$   Zsegment_run_tableZfragment_run_entry_tableZfirst_frag_numberZfragments_counterr?   r8   Ú_r   r   r   Úbuild_fragments_list¼   s    
rI   c             C   s   | j td|ƒƒ d S )Nz!I)Úwriter   )ÚstreamÚvalr   r   r   Úwrite_unsigned_intÒ   s    rM   c             C   s   | j td|ƒdd … ƒ d S )Nz!Ir   )rJ   r   )rK   rL   r   r   r   Úwrite_unsigned_int_24Ö   s    rN   c             C   s,   | j dƒ | j dƒ | j dƒ | j dƒ dS )zWrites the FLV header to streams   FLVó   s      	s       N)rJ   )rK   r   r   r   Úwrite_flv_headerÚ   s    


rP   c             C   sN   d}d}|rJ| j |ƒ t| t|ƒƒ | j dƒ | j |ƒ t| |t|ƒ ƒ dS )z&Writes optional metadata tag to streamó   é   s          N)rJ   rN   r   rM   )rK   ÚmetadataZ
SCRIPT_TAGZFLV_TAG_HEADER_LENr   r   r   Úwrite_metadata_tagã   s    


rT   c             C   s   t tdd„ | ƒƒS )Nc             S   s   d| j kod| j kS )NZdrmAdditionalHeaderIdZdrmAdditionalHeaderSetId)Úattrib)Úer   r   r   Ú<lambda>ñ   s   
z(remove_encrypted_media.<locals>.<lambda>)ÚlistÚfilter)Úmediar   r   r   Úremove_encrypted_mediað   s    
r[   c             C   s   d|| f S )Nz {http://ns.adobe.com/f4m/%d.0}%sr   )ÚpropÚverr   r   r   Ú_add_nsö   s    r^   c             C   s.   t | tdƒtddƒgdd d�}|r*|jƒ }|S )NZbaseURLr   zbase URL)Údefault)r   r^   Ústrip)ÚmanifestÚbase_urlr   r   r   Úget_base_urlú   s    
rc   c               @   s<   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dS )ÚF4mFDz5
    A downloader for f4m manifests or AdobeHDS.
    Úf4mc             C   sp   |j tdƒƒ}|s| jdƒ x8|j tdƒƒ|j tdƒƒ D ]}d|jkr:| jdƒ q:W t|ƒ}|sl| jdƒ |S )NrZ   zNo media foundZdrmAdditionalHeaderZdrmAdditionalHeaderSetÚidzMissing ID in f4m DRMzUnsupported DRM)Úfindallr^   Úreport_errorrU   r[   )r   ÚdocrZ   rV   r   r   r   Ú_get_unencrypted_media
  s    


zF4mFD._get_unencrypted_mediac             C   s   | j j|ƒjƒ }t|ƒS )N)ÚydlÚurlopenr   rA   )r   Úbootstrap_urlÚ	bootstrapr   r   r   Ú_get_bootstrap_from_url  s    zF4mFD._get_bootstrap_from_urlc                sh   g }d}xL| rT|dkrT| j |ƒ}t|ƒ}‡ fdd„|D ƒ}|s
tjdƒ |d8 }q
W |sd| jdƒ |S )Né   r   c                s   g | ]}|d  ˆ kr|‘qS )r   r   )Ú.0Úf)Úlatest_fragmentr   r   ú
<listcomp>#  s    z0F4mFD._update_live_fragments.<locals>.<listcomp>g      @r   zFailed to update fragments)ro   rI   ÚtimeÚsleeprh   )r   rm   rs   Úfragments_listÚretriesrG   r   )rs   r   Ú_update_live_fragments  s    


zF4mFD._update_live_fragmentsc             C   sD   |j dƒ}|r&tj||ƒ}| j|ƒ}nd }t|jƒ}t|ƒ}||fS )NÚurl)Úgetr	   Úurljoinro   r   ÚtextrA   )r   Únoderb   rm   rG   rn   r   r   r   Ú_parse_bootstrap_node.  s    

zF4mFD._parse_bootstrap_nodec       '         sØ  |d }|j dƒ‰ | jd| j ƒ | jj| j||ƒƒ}|jƒ }t|jƒ j	ddƒƒj
ƒ }t|ƒ}dd„ | j|ƒD ƒ}ˆ d ks†t|ƒdkr¤t|d	d
„ d�}|d# \}}	ntt‡ fdd
„|ƒƒd \}}	t|ƒpÌ|}
tj|
|	jd ƒ}|jtdƒƒ}| j||
ƒ\}}|d }|	jtdƒƒ}|d k	�r*t|jƒ}nd }t|ƒ}| jj ddƒ}|�rV|d d… }t|ƒ}t|tdƒƒ}|||dœ}| j|ƒ |d }|d dk�r°t|ƒ |�s°t||ƒ t |ƒ}| j!|ƒ d}�x |�rÈ|j"dƒ\}}|d7 }||d k�rø�qÊd||f }g }|j#�r|j$|j#ƒ |�r2|j$|j
dƒƒ |j dƒ�rL|j$|d ƒ |j%|j&| dj'|ƒd�}yŠ| j(||jƒ |ƒ\}} |�sˆdS t)| ƒ}!x\y|!j*ƒ \}"}#}$W n* t+k
�rÎ   |�rÈ|j,| ƒ P ‚ Y nX |#dk�r’| j-||$ƒ P �q’W W n` t.j/fk
�rP }% z>|�r>|%j0dk�s&|%j0dk�r>d | }&| j1|&ƒ g }n‚ W Y d d }%~%X nX | �rÊ| �rÊ|�rÊ|�rÊ| j2||ƒ}|t|ƒ7 }|�rÊ|d d |d k�rÊd!|d d |d   }&| j1|&ƒ �qÊW | j3|ƒ d"S )$Nrz   Ztbrz[%s] Downloading f4m manifestzutf-8Úignorec             S   s"   g | ]}t |jjd dƒƒ|f‘qS )Zbitrater   éÿÿÿÿ)ÚintrU   r{   )rq   rr   r   r   r   rt   L  s   z'F4mFD.real_download.<locals>.<listcomp>r   c             S   s   | d S )Nr   r   )rr   r   r   r   rW   P  s    z%F4mFD.real_download.<locals>.<lambda>)Úkeyc                s   t | d ƒˆ kS )Nr   )r‚   )rr   )Úrequested_bitrater   r   rW   T  s    r   ZbootstrapInfor;   rS   ÚtestFzpv-2.0)ÚfilenameÚtotal_fragsr;   Údest_streamZcomplete_frags_downloaded_bytesZfragment_indexzSeg%d-Frag%dú;Zextra_param_to_segment_urlú&)ÚpathÚquerys   mdati”  iš  zFragment %d unavailablezMissed %d fragmentsTr�   )4r{   Ú	to_screenÚFD_NAMErk   rl   Z_prepare_urlÚgeturlr   r   Údecoder`   r   rj   r   ÚsortedrX   rY   rc   r	   r|   rU   Úfindr^   r   r   r}   rI   Úparamsr   Z_prepare_frag_downloadrP   rT   r   Z_start_frag_downloadÚpoprŒ   r.   Ú_replacer‹   ÚjoinZ_download_fragmentr   r*   r   rJ   Z_append_fragmentr
   Ú	HTTPErrorÚcodeÚreport_warningry   Z_finish_frag_download)'r   r†   Ú	info_dictZman_urlZurlhra   ri   ÚformatsÚraterZ   Zman_base_urlrb   Zbootstrap_noderG   rm   r;   Zmetadata_noderS   rw   r…   r‡   Z	akamai_pvÚctxrˆ   Zbase_url_parsedZ
frag_indexZseg_iZfrag_iÚnamerŒ   Ú
url_parsedZsuccessZ	down_dataÚreaderrH   r)   r>   ÚerrÚmsgr   )r„   r   Úreal_download?  s¬    









zF4mFD.real_downloadN)
r   r   r   rB   rŽ   rj   ro   ry   r   r£   r   r   r   r   rd     s   rd   )r   )!Ú
__future__r   r   ÚiorD   ru   Úfragmentr   Úcompatr   r   r	   r
   r   r   r   Úutilsr   r   Ú	Exceptionr   ÚBytesIOr   rA   rI   rM   rN   rP   rT   r[   r^   rc   rd   r   r   r   r   Ú<module>   s&   $	 	
	