U
    ¦y^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   úLC:\Users\TaGoRe\Desktop\beinconnect-dl\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.   |   |¡}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|  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|  d¡ƒd S )Nú!Ié   r   r   r   r   r   r   Úread_unsigned_int-   s    zFlvReader.read_unsigned_intc                 C   s   t d|  d¡ƒd S )Nz!Br   r   r   r   r   r   r   Úread_unsigned_char0   s    zFlvReader.read_unsigned_charc                 C   s&   d}|   d¡}|dkrq"||7 }q|S )Nó    r   ó    )r   )r   ÚresÚcharr   r   r   Úread_string3   s    

zFlvReader.read_stringc                 C   sB   |   ¡  }}|  d¡}d}|dkr.|  ¡ }d}|||  || ¡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   sp   |   ¡  |  d¡ |   ¡ }t|ƒD ]}|  ¡  q"|  ¡ }g }t|ƒD ]"}|  ¡ }|  ¡ }| ||f¡ qDd|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œ   |   ¡  |  d¡ |  ¡  |   ¡ }t|ƒD ]}|  ¡  q*|  ¡ }g }t|ƒD ]F}|  ¡ }|  ¡ }|  ¡ }|dkrz|   ¡ }nd }| ||||dœ¡ qLd|iS )Nr.   r   )ÚfirstÚtsÚdurationÚdiscontinuity_indicatorÚ	fragments)r$   r   r#   r0   r)   r    r1   )	r   r2   r3   Úfragments_countr:   r6   Zfirst_tsr8   r9   r   r   r   Ú	read_afrt]   s0    


ü
 ÿzFlvReader.read_afrtc                 C   s8  |   ¡  |  d¡ |  ¡  |   ¡ }|d@ dk}|  ¡  |  ¡  |  ¡  |  ¡  |   ¡ }t|ƒD ]}|  ¡  q^|   ¡ }t|ƒD ]}|  ¡  q||  ¡  |  ¡  |   ¡ }g }t|ƒD ]4}|  ¡ \}}	}
|	dksÌt‚t|
ƒ 	¡ }| 
|¡ q®|   ¡ }g }t|ƒD ]2}|  ¡ \}}	}
|	dkst‚| 
t|
ƒ ¡ ¡ qø|||dœS )Nr.   é    r   s   asrts   afrt)r4   r:   Úlive)r$   r   r#   r    r)   r0   r-   ÚAssertionErrorr   r5   r1   r<   )r   Úflagsr>   Zserver_countr3   Zquality_countZsegments_countr4   Zbox_sizer,   Úbox_dataÚsegmentZfragments_run_countr:   r   r   r   Ú	read_abst   sD    


ýzFlvReader.read_abstc                 C   s&   |   ¡ \}}}|dkst‚t|ƒ ¡ S )Ns   abst)r-   r?   r   rC   )r   Z
total_sizer,   rA   r   r   r   Úread_bootstrap_info²   s    zFlvReader.read_bootstrap_infoN)r   r   r   Ú__doc__r   r    r#   r$   r)   r-   r5   r<   rC   rD   r   r   r   r   r      s   		"3r   c                 C   s   t | ƒ ¡ S ©N)r   rD   )Zbootstrap_bytesr   r   r   rD   ¸   s    rD   c           	      C   s”   g }| d d }| d d d }|d d }t  |¡}|d D ]<\}}|dkrZ| d rZd}t|ƒD ]}| |t|ƒf¡ qbq>| d r|d	d
… }|S )zE Return a list of (segment, fragment) for each fragment in the video r4   r   r:   r6   r/   l   ÿÿ r>   r   éþÿÿÿN)Ú	itertoolsÚcountr0   r1   Únext)	Ú	boot_infor'   Zsegment_run_tableZfragment_run_entry_tableZfirst_frag_numberZfragments_counterrB   r;   Ú_r   r   r   Úbuild_fragments_list¼   s    
rM   c                 C   s   |   td|ƒ¡ d S )Nr!   ©Úwriter   ©ÚstreamÚvalr   r   r   Úwrite_unsigned_intÒ   s    rS   c                 C   s   |   td|ƒdd … ¡ d S )Nr!   r   rN   rP   r   r   r   Úwrite_unsigned_int_24Ö   s    rT   c                 C   s,   |   d¡ |   d¡ |   d¡ |   d¡ dS )zWrites the FLV header to streams   FLVó   s      	s       N)rO   )rQ   r   r   r   Úwrite_flv_headerÚ   s    


rV   c                 C   sN   d}d}|rJ|   |¡ t| t|ƒƒ |   d¡ |   |¡ t| |t|ƒ ƒ dS )z&Writes optional metadata tag to streamó   é   s          N)rO   rT   r   rS   )rQ   ÚmetadataZ
SCRIPT_TAGZFLV_TAG_HEADER_LENr   r   r   Úwrite_metadata_tagã   s    


rZ   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    
þra   c                 C   s   d|| f S )Nz {http://ns.adobe.com/f4m/%d.0}%sr   )ÚpropÚverr   r   r   Ú_add_nsö   s    rd   c                 C   s.   t | tdƒtddƒgdd d}|r*| ¡ }|S )NZbaseURLr   zbase URL)Údefault)r   rd   Ústrip)ÚmanifestÚbase_urlr   r   r   Úget_base_urlú   s      þri   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   sl   |  tdƒ¡}|s|  d¡ |  tdƒ¡|  tdƒ¡ D ]}d|jkr8|  d¡ q8t|ƒ}|sh|  d¡ |S )Nr`   zNo media foundZdrmAdditionalHeaderZdrmAdditionalHeaderSetÚidzMissing ID in f4m DRMzUnsupported DRM)Úfindallrd   Úreport_errorr[   ra   )r   Údocr`   r\   r   r   r   Ú_get_unencrypted_media
  s    
ÿ

zF4mFD._get_unencrypted_mediac                 C   s   | j  |¡ ¡ }t|ƒS rF   )ÚydlÚurlopenr   rD   )r   Úbootstrap_urlÚ	bootstrapr   r   r   Ú_get_bootstrap_from_url  s    zF4mFD._get_bootstrap_from_urlc                    sb   g }d}|sP|dkrP|   |¡}t|ƒ}‡ fdd„|D ƒ}|st d¡ |d8 }q|s^|  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)ru   rM   ÚtimeÚsleeprn   )r   rs   r{   Úfragments_listÚretriesrK   r   rz   r   Ú_update_live_fragments  s    



zF4mFD._update_live_fragmentsc                 C   sD   |  d¡}|r&t ||¡}|  |¡}nd }t|jƒ}t|ƒ}||fS )NÚurl)Úgetr	   Úurljoinru   r   ÚtextrD   )r   Únoderh   rs   rK   rt   r   r   r   Ú_parse_bootstrap_node.  s    
 ÿ
zF4mFD._parse_bootstrap_nodec           '   
      sÒ  |d }|  d¡‰ |  d| j ¡ | j |  ||¡¡}| ¡ }t| ¡  	dd¡ƒ 
¡ }t|ƒ}dd„ |  |¡D ƒ}ˆ d ks†t|ƒdkr¤t|d	d
„ d}|d \}}	ntt‡ fdd
„|ƒƒd \}}	t|ƒpÌ|}
t |
|	jd ¡}| tdƒ¡}|  ||
¡\}}|d }|	 tdƒ¡}|d k	r*t|jƒ}nd }t|ƒ}| j  dd¡}|rV|d d… }t|ƒ}t|tdƒƒ}|||dœ}|  |¡ |d }|d dkr°t|ƒ |s°t||ƒ t |ƒ}|  !|¡ d}|rÄ| "d¡\}}|d7 }||d krôqÆd||f }g }|j#r| $|j#¡ |r.| $| 
d¡¡ |  d¡rH| $|d ¡ |j%|j&| d '|¡d}zŽ|  (|| ¡ |¡\}} |s†W dS t)| ƒ}!z|! *¡ \}"}#}$W n. t+k
rÎ   |rÈ| ,| ¡ Y qî‚ Y nX |#dkrŽ|  -||$¡ qîqŽW n` t.j/fk
rP }% z<|r>|%j0dks&|%j0d kr>d!| }&|  1|&¡ g }n‚ W 5 d }%~%X Y nX |sÆ|sÆ|rÆ|rÆ|  2||¡}|t|ƒ7 }|rÆ|d d |d krÆd"|d d |d   }&|  1|&¡ qÆ|  3|¡ d#S )$Nr‚   Ztbrz[%s] Downloading f4m manifestzutf-8Úignorec                 S   s"   g | ]}t |j d d¡ƒ|f‘qS )Zbitrateéÿÿÿÿ)Úintr[   rƒ   rw   r   r   r   r|   L  s   ÿz'F4mFD.real_download.<locals>.<listcomp>r   c                 S   s   | d S ©Nr   r   ©ry   r   r   r   r]   P  r%   z%F4mFD.real_download.<locals>.<lambda>)Úkeyr‰   c                    s   t | d ƒˆ kS r‹   )rŠ   rŒ   ©Zrequested_bitrater   r   r]   T  r%   r   ZbootstrapInfor>   rY   Ú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 fragmentsT)4rƒ   Ú	to_screenÚFD_NAMErq   rr   Z_prepare_urlÚgeturlr   r   Údecoderf   r   rp   r   Úsortedr^   r_   ri   r	   r„   r[   Úfindrd   r‡   r   r…   rM   Úparamsr   Z_prepare_frag_downloadrV   rZ   r   Z_start_frag_downloadÚpopr–   r1   Ú_replacer•   ÚjoinZ_download_fragmentr   r-   r   rO   Z_append_fragmentr
   Ú	HTTPErrorÚcodeÚreport_warningr   Z_finish_frag_download)'r   r   Ú	info_dictZman_urlZurlhrg   ro   ÚformatsÚrater`   Zman_base_urlrh   Zbootstrap_noderK   rs   r>   Zmetadata_noderY   r   r   r‘   Z	akamai_pvÚctxr’   Zbase_url_parsedZ
frag_indexZseg_iZfrag_iÚnamer–   Ú
url_parsedZsuccessZ	down_dataÚreaderrL   r,   rA   ÚerrÚmsgr   rŽ   r   Úreal_download?  sº    
ÿ
 ÿÿ ÿ
ý






zF4mFD.real_downloadN)
r   r   r   rE   r˜   rp   ru   r   r‡   r­   r   r   r   r   rj     s   rj   )r   )!Ú
__future__r   r   ÚiorH   r}   Úfragmentr   Úcompatr   r   r	   r
   r   r   r   Úutilsr   r   Ú	Exceptionr   ÚBytesIOr   rD   rM   rS   rT   rV   rZ   ra   rd   ri   rj   r   r   r   r   Ú<module>   s&   $	 	
	