
    V|h;                         S SK r S SKrS SKrS SKrS SKrS SKrSSKJr  SSK	J
r
  SSKJr  SSKJrJr   " S S	\5      r " S
 S\R$                  5      rS rS rS rS rS rS rS rSS jrS r " S S\5      rg)    N   )
FragmentFD   )compat_etree_fromstring)	HTTPError)fix_xml_ampersands
xpath_textc                       \ rS rSrSrg)DataTruncatedError    N)__name__
__module____qualname____firstlineno____static_attributes__r       O/home/james-whalen/.local/lib/python3.13/site-packages/yt_dlp/downloader/f4m.pyr   r      s    r   r   c                   T    \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rS rSrg)	FlvReader   z]
Reader for Flv files
The file format is documented in https://www.adobe.com/devnet/f4v.html
c                 x    U R                  U5      n[        U5      U:  a  [        SU[        U5      4-  5      eU$ )Nz6FlvReader error: need %d bytes while only %d bytes got)readlenr   )selfndatas      r   
read_bytesFlvReader.read_bytes   sE    yy|t9q=$Hs4yL" "# # r   c                 T    [         R                  " SU R                  S5      5      S   $ )Nz!Q   r   structunpackr   r   s    r   read_unsigned_long_long!FlvReader.read_unsigned_long_long!   !    }}T4??1#56q99r   c                 T    [         R                  " SU R                  S5      5      S   $ )N!I   r   r"   r%   s    r   read_unsigned_intFlvReader.read_unsigned_int$   r(   r   c                 T    [         R                  " SU R                  S5      5      S   $ )Nz!Br   r   r"   r%   s    r   read_unsigned_charFlvReader.read_unsigned_char'   r(   r   c                 H    Sn U R                  S5      nUS:X  a   U$ X-  nM   )Nr   r       )r   )r   reschars      r   read_stringFlvReader.read_string*   s5    ??1%Dw
 KC	 r   c                     U R                  5       =pU R                  S5      nSnUS:X  a  U R                  5       nSnXU R                  X-
  5      4$ )zK
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_ends        r   read_box_infoFlvReader.read_box_info3   sY      1133	??1%
19446IJDOOI4J$KKKr   c                 \   U R                  5         U R                  S5        U R                  5       n[        U5       H  nU R                  5         M     U R	                  5       n/ n[        U5       H5  nU R	                  5       nU R	                  5       nUR                  XV45        M7     SU0$ )N   segment_run)r/   r   ranger5   r,   append)r   quality_entry_count_segment_run_countsegmentsfirst_segmentfragments_per_segments          r   	read_asrtFlvReader.read_asrt?   s    !"557*+A , !224()A 224M$($:$:$<!OO]BC * 8
 	
r   c                    U R                  5         U R                  S5        U R                  5         U R                  5       n[        U5       H  nU R	                  5         M     U R                  5       n/ n[        U5       Hb  nU R                  5       nU R                  5       nU R                  5       nUS:X  a  U R                  5       nOS nUR                  UUUUS.5        Md     SU0$ )Nr@   r   )firsttsdurationdiscontinuity_indicator	fragments)r/   r   r,   rB   r5   r&   rC   )	r   rD   rE   fragments_countrQ   rM   first_tsrO   rP   s	            r   	read_afrtFlvReader.read_afrtT   s    ! "557*+A , 002	'A**,E335H--/H1}*.*A*A*C'*.'$+B	  (  
 	
r   c                    U R                  5         U R                  S5        U R                  5         U R                  5       nUS-  S:g  nU R                  5         U R                  5         U R                  5         U R	                  5         U R                  5       n[        U5       H  nU R	                  5         M     U R                  5       n[        U5       H  nU R	                  5         M     U R	                  5         U R	                  5         U R                  5       n/ n[        U5       HH  nU R                  5       u  pn
U	S:X  d   e[        U
5      R                  5       nUR                  U5        MJ     U R                  5       n/ n[        U5       HF  nU R                  5       u  pn
U	S:X  d   eUR                  [        U
5      R                  5       5        MH     UUUS.$ )Nr@       r   s   asrts   afrt)rG   rQ   live)r/   r   r,   r&   r5   rB   r=   r   rJ   rC   rT   )r   flagsrX   server_countrE   quality_countsegments_countrG   	_box_sizer;   box_datasegmentfragments_run_countrQ   s                 r   	read_abstFlvReader.read_abstv   s   ! '')t|q  $$&$$&..0|$A %//1}%A & 	002~&A,0,>,>,@)Iw&&&)335GOOG$	 '
 #557	*+A,0,>,>,@)Iw&&&Yx0::<= , !"
 	
r   c                 j    U R                  5       u  pnUS:X  d   e[        U5      R                  5       $ )Ns   abst)r=   r   ra   )r   rE   r;   r^   s       r   read_bootstrap_infoFlvReader.read_bootstrap_info   s7     $ 2 2 4X7"""",,..r   r   N)r   r   r   r   __doc__r   r&   r,   r/   r5   r=   rJ   rT   ra   rd   r   r   r   r   r   r      s<    
:::
L
* 
D1
f/r   r   c                 4    [        U 5      R                  5       $ N)r   rd   )bootstrap_bytess    r   rd   rd      s    _%99;;r   c                 &   / nU S   S   nU S   S   S   nUS   S   n[         R                  " U5      nUS    HE  u  pgUS:X  a  U S   (       a  Sn[        U5       H  nUR                  U[	        U5      45        M!     MG     U S   (       a  US	S
 nU$ )zDReturn a list of (segment, fragment) for each fragment in the video rG   r   rQ   rM   rA   l    rX   r   N)	itertoolscountrB   rC   next)		boot_infor3   segment_run_tablefragment_run_entry_tablefirst_frag_numberfragments_counterr_   rR   rE   s	            r   build_fragments_listrt      s    
C!*-a0(5a8E03G<!(9:$5m$D  j(Yv->O'AJJ&7!89: ( %E "#hJr   c                 P    U R                  [        R                  " SU5      5        g )Nr*   writer#   packstreamvals     r   write_unsigned_intr|      s    
LLT3'(r   c                 V    U R                  [        R                  " SU5      SS  5        g )Nr*   r   rv   ry   s     r   write_unsigned_int_24r~      s     
LLT3'+,r   c                     U R                  S5        U R                  S5        U R                  S5        U R                  S5        g)zWrites the FLV header to streams   FLV   s      	s       N)rw   )rz   s    r   write_flv_headerr      s6     LL
LL
LL$%
LL$%r   c                     SnSnU(       a`  U R                  U5        [        U [        U5      5        U R                  S5        U R                  U5        [        X[        U5      -   5        gg)z&Writes optional metadata tag to stream      s          N)rw   r~   r   r|   )rz   metadata
SCRIPT_TAGFLV_TAG_HEADER_LENs       r   write_metadata_tagr      sY    JZ fc(m445X6H#EF r   c                 .    [        [        S U 5      5      $ )Nc                 L    SU R                   ;  =(       a    SU R                   ;  $ )NdrmAdditionalHeaderIddrmAdditionalHeaderSetId)attrib)es    r   <lambda>(remove_encrypted_media.<locals>.<lambda>   s&    !8!H "P%?qxx%O"Pr   )listfilter)medias    r   remove_encrypted_mediar      s     P  r   c                     SX4-  $ )Nz {http://ns.adobe.com/f4m/%d.0}%sr   )propvers     r   _add_nsr      s    -;;r   c                 v    [        U [        S5      [        SS5      /SS S9nU(       a  UR                  5       nU$ )NbaseURLr   zbase URL)default)r	   r   strip)manifestbase_urls     r   get_base_urlr      s=    79%wy!'<=D"H >>#Or   c                   6    \ rS rSrSrS rS rS rS rS r	Sr
g	)
F4mFD   z-
A downloader for f4m manifests or AdobeHDS.
c                    UR                  [        S5      5      nU(       d  U R                  S5        U R                  R	                  S5      (       dj  UR                  [        S5      5      UR                  [        S5      5      -    H&  nSUR
                  ;  d  M  U R                  S5        M(     [        U5      nU(       d  U R                  S5        U$ )	Nr   zNo media foundallow_unplayable_formatsdrmAdditionalHeaderdrmAdditionalHeaderSetidzMissing ID in f4m DRMzUnsupported DRM)findallr   report_errorparamsgetr   r   )r   docr   r   s       r   _get_unencrypted_mediaF4mFD._get_unencrypted_media   s    GG,-./{{9::kk'*?"@AG,D$EFG qxx'%%&=>G +51E/0r   c                 j    U R                   R                  U5      R                  5       n[        U5      $ rh   )ydlurlopenr   rd   )r   bootstrap_url	bootstraps      r   _get_bootstrap_from_urlF4mFD._get_bootstrap_from_url  s*    HH$$]388:	"9--r   c                 4   / nSnU(       do  US:  ai  U R                  U5      n[        U5      nU Vs/ s H  ofS   U:  d  M  UPM     nnU(       d  [        R                  " S5        US-  nU(       d  US:  a  Mi  U(       d  U R	                  S5        U$ s  snf )N   r   r   g      @zFailed to update fragments)r   rt   timesleepr   )r   r   latest_fragmentfragments_listretriesro   fs          r   _update_live_fragmentsF4mFD._update_live_fragments  s    !!44]CI1)<N)7RAQ4/;QaNR!

31 "! :; Ss   BBc                     UR                  S5      nU(       a3  [        R                  R                  X#5      nU R	                  U5      nXC4$ S n[
        R                  " UR                  5      n[        U5      nXC4$ )Nurl)	r   urllibparseurljoinr   base64	b64decodetextrd   )r   noder   r   ro   r   s         r   _parse_bootstrap_nodeF4mFD._parse_bootstrap_node$  st     "LL00)M44]CI
 '' !M((3I+I6I''r   c           	      J
  ^' US   nUR                  S5      m'U R                  SU R                   S35        U R                  R	                  U R                  X#5      5      nUR                  n[        UR                  5       R                  SS5      5      R                  5       n[        U5      nU R                  U5       Vs/ s H*  n[        UR                  R                  SS5      5      U4PM,     nnT'b  [        U5      S	:X  a  [!        US
 S9nUS   u  pO[#        [%        U'4S jU5      5      u  p['        U5      =(       d    Un[(        R*                  R-                  XR                  S   5      nUR/                  [1        S5      5      nU R3                  X5      u  pUS   nU
R/                  [1        S5      5      nUb!  [4        R6                  " UR8                  5      nOS n[;        U5      nU R<                  R                  SS5      nU(       a  US S	 n[        U5      n[?        U[1        S5      5      nUU[A        U5      S.nU RC                  U5        US   nUS   S:X  a  [E        U5        U(       d  [G        UU5        [(        R*                  RI                  U5      nU RK                  UU5        SnU(       Ga  URM                  S5      u  nnUS	-  nUUS   ::  a  M,  SUU4-  n/ nURN                  (       a  URQ                  URN                  5        U(       a   URQ                  UR                  S5      5        UR                  S5      (       a  URQ                  US   5        URS                  URT                  U-   SRW                  U5      S9n U RY                  UUR[                  5       U5      n U (       d  gU R]                  U5      n![_        U!5      n"  U"Ra                  5       u  n	n#n$U#S:X  a  U Rg                  UU$5        OM0  U(       dm  U(       df  U(       a_  U(       aX  U Ro                  UU5      nU[        U5      -  nU(       a1  US   S	   US	-   :  a"  S!US   S	   US	-   -
  -  n&U Rm                  U&5        U(       a  GM  U Rq                  UU5      $ s  snf ! [b         a    U(       a  URe                  U!5         M  e f = f! [h         aK  n%U(       a>  U%Rj                  S:X  d  U%Rj                  S:X  a  S U-  n&U Rm                  U&5        / n S n%A%GNe S n%A%ff = f)"Nr   tbr[z] Downloading f4m manifestzutf-8ignorebitrater   c                     U S   $ Nr   r   )r   s    r   r   %F4mFD.real_download.<locals>.<lambda>F  s    AaDr   )keyc                 &   > [        U S   5      T:H  $ r   )int)r   requested_bitrates    r   r   r   J  s    #ad)'88r   bootstrapInforX   r   testFzpv-2.0)filenametotal_fragsrX   dest_streamcomplete_frags_downloaded_bytesr   fragment_indexzSeg%d-Frag%d;extra_param_to_segment_url&)pathquerys   mdati  i  zFragment %d unavailablezMissed %d fragments)9r   	to_screenFD_NAMEr   r   _prepare_urlr   r   r   decoder   r   r   r   r   r   sortedrn   r   r   r   r   r   findr   r   r   r   r   rt   r   r	   bool_prepare_frag_downloadr   r   urlparse_start_frag_downloadpopr   rC   _replacer   join_download_fragmentgeturl_read_fragmentr   r=   r   rw   _append_fragmentr   statusreport_warningr   _finish_frag_download)(r   r   	info_dictman_urlurlhr   r   r   formatsrE   r   man_base_urlr   bootstrap_nodero   r   rX   metadata_noder   r   r   r   	akamai_pvctxr   base_url_parsed
frag_indexseg_ifrag_inamer   
url_parsedsuccess	down_datareaderr;   r^   errmsgr   s(                                          @r   real_downloadF4mFD.real_download5  s   E"%MM%04<<.(BCDxx 1 1) EF(( &diik&8&8(&KLRRT%h/ 77<><q Y34a8< 	 >$G(9W.9Gr{HAuF8'C DHA $C(3G<<''ll56IJ'/":;#'#=#=$* 	 

7:#67$''(:(:;HH-i8{{vu-+BQ/N.)sGH$56	 !&J
 	##C(-(01Q6[)";9 ,,//9!!#y1
*..q1ME6!OJS!122!UFO3DE$$_223Y__S12}}9::Y'CDE(117K7Kd7RZ]ZbZbchZi1jJ11#z7H7H7JIV  //4	"9-
060D0D0F-8X  7*--c8< 2 "$4M!%!<!<]F!Ss>22!~a'8';fqj'H/>!3DQ3G6TU:3VWC'',e nh ))#y99S>X . 
 (--i8!  SZZ3.#**2C 4f<C'',%'NsT   1R(S S R# 3S S #"S
S S

S 
T"?TTT"r   N)r   r   r   r   rf   r   r   r   r   r  r   r   r   r   r   r      s!     ."("v:r   r   )r   )r   iorl   r#   r   urllib.parser   fragmentr   compatr   networking.exceptionsr   utilsr   r	   	Exceptionr   BytesIOr   rd   rt   r|   r~   r   r   r   r   r   r   r   r   r   <module>r     s~     	       , - 2	 	Z/

 Z/z<,)-&
G<q:J q:r   