o
    ˆ¬iÞ;  ã                   @   sä   d dl Z d dlZd dlZd dlZd dlZd dlZddlmZ ddl	m
Z
 ddl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 )!é    Né   )Ú
FragmentFDé   )Úcompat_etree_fromstring)Ú	HTTPError)Úfix_xml_ampersandsÚ
xpath_textc                   @   s   e Zd ZdS )ÚDataTruncatedErrorN)Ú__name__Ú
__module__Ú__qualname__© r   r   úI/home/ubuntu/.local/lib/python3.10/site-packages/yt_dlp/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   ó   t  d|  d¡¡d S )Nz!Qé   r   ©ÚstructÚunpackr   ©r   r   r   r   Úread_unsigned_long_long!   ó   z!FlvReader.read_unsigned_long_longc                 C   r   )Nú!Ié   r   r   r   r   r   r   Úread_unsigned_int$   r   zFlvReader.read_unsigned_intc                 C   r   )Nz!Br   r   r   r   r   r   r   Úread_unsigned_char'   r   zFlvReader.read_unsigned_charc                 C   s(   d}	 |   d¡}|dkr	 |S ||7 }q)Nó    Tr   ó    )r   )r   ÚresÚcharr   r   r   Úread_string*   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   Ú	real_sizeÚsizeÚbox_typeÚ
header_endr   r   r   Úread_box_info3   s   
zFlvReader.read_box_infoc                 C   sp   |   ¡  |  d¡ |   ¡ }t|ƒD ]}|  ¡  q|  ¡ }g }t|ƒD ]}|  ¡ }|  ¡ }| ||f¡ q"d|iS )Né   Úsegment_run)r!   r   Úranger&   r    Úappend)r   Úquality_entry_countÚ_Úsegment_run_countÚsegmentsÚfirst_segmentÚfragments_per_segmentr   r   r   Ú	read_asrt?   s   

ÿzFlvReader.read_asrtc           	      C   sœ   |   ¡  |  d¡ |  ¡  |   ¡ }t|ƒD ]}|  ¡  q|  ¡ }g }t|ƒD ]#}|  ¡ }|  ¡ }|  ¡ }|dkr=|   ¡ }nd }| ||||dœ¡ q&d|iS )Nr-   r   )ÚfirstÚtsÚdurationÚdiscontinuity_indicatorÚ	fragments)r!   r   r    r/   r&   r   r0   )	r   r1   r2   Úfragments_countr<   r8   Úfirst_tsr:   r;   r   r   r   Ú	read_afrtT   s.   



üÿzFlvReader.read_afrtc                 C   s6  |   ¡  |  d¡ |  ¡  |   ¡ }|d@ dk}|  ¡  |  ¡  |  ¡  |  ¡  |   ¡ }t|ƒD ]}|  ¡  q/|   ¡ }t|ƒD ]}|  ¡  q>|  ¡  |  ¡  |   ¡ }g }t|ƒD ]}|  ¡ \}}	}
|	dksfJ ‚t|
ƒ ¡ }| 	|¡ qW|   ¡ }g }t|ƒD ]}|  ¡ \}}	}
|	dks‹J ‚| 	t|
ƒ 
¡ ¡ q||||dœS )Nr-   é    r   s   asrts   afrt)r4   r<   Úlive)r!   r   r    r   r&   r/   r,   r   r7   r0   r?   )r   ÚflagsrA   Úserver_countr2   Úquality_countÚsegments_countr4   Ú	_box_sizer*   Úbox_dataÚsegmentÚfragments_run_countr<   r   r   r   Ú	read_abstv   sD   


ýzFlvReader.read_abstc                 C   s&   |   ¡ \}}}|dksJ ‚t|ƒ ¡ S )Ns   abst)r,   r   rJ   )r   r2   r*   rG   r   r   r   Úread_bootstrap_info©   s   zFlvReader.read_bootstrap_infoN)r
   r   r   Ú__doc__r   r   r    r!   r&   r,   r7   r?   rJ   rK   r   r   r   r   r      s    		"3r   c                 C   s   t | ƒ ¡ S ©N)r   rK   )Úbootstrap_bytesr   r   r   rK   ¯   ó   rK   c           	      C   s”   g }| d d }| d d d }|d d }t  |¡}|d D ]\}}|dkr-| d r-d}t|ƒD ]}| |t|ƒf¡ q1q| d rH|d	d
… }|S )zE Return a list of (segment, fragment) for each fragment in the video r4   r   r<   r8   r.   l   ÿÿ rA   r   éþÿÿÿN)Ú	itertoolsÚcountr/   r0   Únext)	Ú	boot_infor$   Úsegment_run_tableÚfragment_run_entry_tableÚfirst_frag_numberÚfragments_counterrH   r=   r2   r   r   r   Úbuild_fragments_list³   s   
ÿrY   c                 C   s   |   t d|¡¡ d S )Nr   ©Úwriter   Úpack©ÚstreamÚvalr   r   r   Úwrite_unsigned_intÉ   r   r`   c                 C   s   |   t d|¡dd … ¡ d S )Nr   r   rZ   r]   r   r   r   Úwrite_unsigned_int_24Í   s   ra   c                 C   s,   |   d¡ |   d¡ |   d¡ |   d¡ dS )zWrites the FLV header to streams   FLVó   s      	s       N)r[   )r^   r   r   r   Úwrite_flv_headerÑ   s   


rc   c                 C   sR   d}d}|r'|   |¡ t| t|ƒƒ |   d¡ |   |¡ t| |t|ƒ ƒ dS dS )z&Writes optional metadata tag to streamó   é   s          N)r[   ra   r   r`   )r^   ÚmetadataÚ
SCRIPT_TAGÚFLV_TAG_HEADER_LENr   r   r   Úwrite_metadata_tagÚ   s   


ûri   c                 C   s   t tdd„ | ƒƒS )Nc                 S   s   d| j vo	d| j vS )NÚdrmAdditionalHeaderIdÚdrmAdditionalHeaderSetId)Úattrib)Úer   r   r   Ú<lambda>è   s   
 
z(remove_encrypted_media.<locals>.<lambda>)ÚlistÚfilter)Úmediar   r   r   Úremove_encrypted_mediaç   s   
þrr   c                 C   s   d|| f S )Nz {http://ns.adobe.com/f4m/%d.0}%sr   )ÚpropÚverr   r   r   Ú_add_nsí   rO   ru   c                 C   s.   t | tdƒtddƒgdd d}|r| ¡ }|S )NÚbaseURLr   zbase URL)Údefault)r   ru   Ústrip)ÚmanifestÚbase_urlr   r   r   Úget_base_urlñ   s   þr{   c                   @   s8   e 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.
    c                 C   sx   |  tdƒ¡}|s|  d¡ | j d¡s3|  tdƒ¡|  tdƒ¡ D ]}d|jvr.|  d¡ q"t|ƒ}|s:|  d¡ |S )	Nrq   zNo media foundÚallow_unplayable_formatsÚdrmAdditionalHeaderÚdrmAdditionalHeaderSetÚidzMissing ID in f4m DRMzUnsupported DRM)Úfindallru   Úreport_errorÚparamsÚgetrl   rr   )r   Údocrq   rm   r   r   r   Ú_get_unencrypted_mediaÿ   s   
ÿ

€
zF4mFD._get_unencrypted_mediac                 C   s   | j  |¡ ¡ }t|ƒS rM   )ÚydlÚurlopenr   rK   )r   Úbootstrap_urlÚ	bootstrapr   r   r   Ú_get_bootstrap_from_url  s   zF4mFD._get_bootstrap_from_urlc                    sl   g }d}|s-|dkr-|   |¡}t|ƒ}‡ fdd„|D ƒ}|s't d¡ |d8 }|s-|dks
|s4|  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)r‹   rY   ÚtimeÚsleepr‚   )r   r‰   r’   Úfragments_listÚretriesrT   r   r‘   r   Ú_update_live_fragments  s   

ù	
zF4mFD._update_live_fragmentsc                 C   sN   |  d¡}|rtj ||¡}|  |¡}||fS d }t |j¡}t|ƒ}||fS )NÚurl)	r„   ÚurllibÚparseÚurljoinr‹   Úbase64Ú	b64decodeÚtextrK   )r   Únoderz   r‰   rT   rŠ   r   r   r   Ú_parse_bootstrap_node$  s   
ÿ
ýzF4mFD._parse_bootstrap_nodec           &   
      sÌ  |d }|  d¡‰ |  d| j› d¡ | j |  ||¡¡}|j}t| ¡  	dd¡ƒ 
¡ }t|ƒ}dd„ |  |¡D ƒ}ˆ d u sDt|ƒd	krSt|d
d„ d}|d \}}	ntt‡ fdd„|ƒƒ\}}	t|ƒpe|}
tj |
|	jd ¡}| tdƒ¡}|  ||
¡\}}|d }|	 tdƒ¡}|d ur•t |j¡}nd }t|ƒ}| j  dd¡}|rª|d d	… }t|ƒ}t|tdƒƒ}||t|ƒdœ}|   |¡ |d }|d dkr×t!|ƒ |s×t"||ƒ tj #|¡}|  $||¡ d}|rà| %d¡\}}|d	7 }||d krúqåd||f }g }|j&r| '|j&¡ |r| '| 
d¡¡ |  d¡r$| '|d ¡ |j(|j)| d *|¡d}zF|  +|| ,¡ |¡}|sAW dS |  -|¡} t.| ƒ}!	 z	|! /¡ \}}"}#W n t0yg   |rf| 1| ¡ Y n‚ w |"d krt|  2||#¡ nqKW n/ t3y¦ }$ z"|r›|$j4d!ks|$j4d"kr›d#| }%|  5|%¡ g }n‚ W Y d }$~$nd }$~$ww |sÞ|sÞ|rÞ|rÞ|  6||¡}|t|ƒ7 }|rÞ|d d	 |d	 krÞd$|d d	 |d	   }%|  5|%¡ |sè|  7||¡S )%Nr™   Útbrú[z] Downloading f4m manifestzutf-8Úignorec                 S   s"   g | ]}t |j d d¡ƒ|f‘qS )Úbitrateéÿÿÿÿ)Úintrl   r„   rŽ   r   r   r   r“   B  s    ÿz'F4mFD.real_download.<locals>.<listcomp>r   c                 S   s   | d S ©Nr   r   ©r   r   r   r   rn   F  s    z%F4mFD.real_download.<locals>.<lambda>)Úkeyr¦   c                    s   t | d ƒˆ kS r¨   )r§   r©   ©Úrequested_bitrater   r   rn   J  s    ÚbootstrapInforA   rf   ÚtestFzpv-2.0)ÚfilenameÚtotal_fragsrA   Údest_streamÚcomplete_frags_downloaded_bytesr   Úfragment_indexzSeg%d-Frag%dú;Úextra_param_to_segment_urlú&)ÚpathÚqueryTs   mdati”  iš  zFragment %d unavailablezMissed %d fragments)8r„   Ú	to_screenÚFD_NAMEr‡   rˆ   Ú_prepare_urlr™   r   r   Údecoderx   r   r†   r   ÚsortedrS   rp   r{   rš   r›   rœ   rl   Úfindru   r¡   r   rž   rŸ   rY   rƒ   r   ÚboolÚ_prepare_frag_downloadrc   ri   ÚurlparseÚ_start_frag_downloadÚpopr¸   r0   Ú_replacer·   ÚjoinÚ_download_fragmentÚgeturlÚ_read_fragmentr   r,   r	   r[   Ú_append_fragmentr   ÚstatusÚreport_warningr˜   Ú_finish_frag_download)&r   r¯   Ú	info_dictÚman_urlÚurlhry   r…   Úformatsr2   rq   Úman_base_urlrz   Úbootstrap_noderT   r‰   rA   Úmetadata_noderf   r–   r®   r°   Ú	akamai_pvÚctxr±   Úbase_url_parsedÚ
frag_indexÚseg_iÚfrag_iÚnamer¸   Ú
url_parsedÚsuccessÚ	down_dataÚreaderr*   rG   ÚerrÚmsgr   r«   r   Úreal_download5  sÂ   
ÿ
ÿÿý



ø
	ò€
þ€ú

Î4zF4mFD.real_downloadN)	r
   r   r   rL   r†   r‹   r˜   r¡   rá   r   r   r   r   r|   ú   s    r|   r   )r   ÚiorQ   r   r”   Úurllib.parserš   Úfragmentr   Úcompatr   Únetworking.exceptionsr   Úutilsr   r   Ú	Exceptionr	   ÚBytesIOr   rK   rY   r`   ra   rc   ri   rr   ru   r{   r|   r   r   r   r   Ú<module>   s.     	
	