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  qW | j  | j  | j  }g }x@t|D ]4}| j \}}	}
|	dkstt|
j	 }|j
| qW | 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st|dkrt|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rt| |st|| t |}| j!| d}x |r|j"d\}}|d7 }||d krqd||f }g }|j#r|j$|j# |r2|j$|j
d |j drL|j$|d  |j%|j&| dj'|d}y| j(||j |\}} |sdS t)| }!x\y|!j* \}"}#}$W n* t+k
r   |r|j,|  P  Y nX |#dkr| j-||$ P qW 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rd!|d d |d   }&| j1|& qW | 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&   $	 	
	