
    VGh;                         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	e      Z G d
 dej$                        Zd Zd Zd Zd Zd Zd Zd ZddZd Z G d de      Zy)    N   )
FragmentFD   )compat_etree_fromstring)	HTTPError)fix_xml_ampersands
xpath_textc                       e Zd Zy)DataTruncatedErrorN)__name__
__module____qualname__     ^/var/www/it7/html/youtubeDownloader/venv/lib/python3.12/site-packages/yt_dlp/downloader/f4m.pyr   r      s    r   r   c                   L    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zy)	FlvReaderzi
    Reader for Flv files
    The file format is documented in https://www.adobe.com/devnet/f4v.html
    c                 v    | j                  |      }t        |      |k  rt        d|t        |      fz        |S )Nz6FlvReader error: need %d bytes while only %d bytes got)readlenr   )selfndatas      r   
read_byteszFlvReader.read_bytes   sE    yy|t9q=$Hs4yL" "# # r   c                 R    t        j                  d| j                  d            d   S )Nz!Q   r   structunpackr   r   s    r   read_unsigned_long_longz!FlvReader.read_unsigned_long_long!   !    }}T4??1#56q99r   c                 R    t        j                  d| j                  d            d   S )N!I   r   r   r    s    r   read_unsigned_intzFlvReader.read_unsigned_int$   r"   r   c                 R    t        j                  d| j                  d            d   S )Nz!Br   r   r   r    s    r   read_unsigned_charzFlvReader.read_unsigned_char'   r"   r   c                 F    d}	 | j                  d      }|dk(  r	 |S ||z  })Nr   r       )r   )r   reschars      r   read_stringzFlvReader.read_string*   s7    ??1%Dw
 4KC	 r   c                     | j                         x}}| j                  d      }d}|dk(  r| j                         }d}||| j                  ||z
        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_ends        r   read_box_infozFlvReader.read_box_info3   s_      1133	D??1%
19446IJ(DOOI
4J$KKKr   c                 V   | j                          | j                  d       | j                         }t        |      D ]  }| j                           | j	                         }g }t        |      D ]5  }| j	                         }| j	                         }|j                  ||f       7 d|iS )N   segment_run)r(   r   ranger-   r&   append)r   quality_entry_count_segment_run_countsegmentsfirst_segmentfragments_per_segments          r   	read_asrtzFlvReader.read_asrt?   s    !"557*+ 	A	 !224() 	DA 224M$($:$:$<!OO],ABC	D 8
 	
r   c                    | j                          | j                  d       | j                          | j                         }t        |      D ]  }| j	                           | j                         }g }t        |      D ]`  }| j                         }| j                         }| j                         }|dk(  r| j                         }nd }|j                  ||||d       b d|iS )Nr6   r   )firsttsdurationdiscontinuity_indicator	fragments)r(   r   r&   r8   r-   r!   r9   )	r   r:   r;   fragments_countrF   rB   first_tsrD   rE   s	            r   	read_afrtzFlvReader.read_afrtT   s    ! "557*+ 	A	 002	' 	A**,E335H--/H1}*.*A*A*C'*.'$+B	 	  
 	
r   c                    | j                          | j                  d       | j                          | j                         }|dz  dk7  }| j                          | j                          | j                          | j	                          | j                         }t        |      D ]  }| j	                           | j                         }t        |      D ]  }| j	                           | j	                          | j	                          | j                         }g }t        |      D ]G  }| j                         \  }}	}
|	dk(  sJ t        |
      j                         }|j                  |       I | j                         }g }t        |      D ]E  }| j                         \  }}	}
|	dk(  sJ |j                  t        |
      j                                G |||dS )Nr6       r   s   asrts   afrt)r=   rF   live)r(   r   r&   r!   r-   r8   r4   r   r@   r9   rI   )r   flagsrL   server_countr;   quality_countsegments_countr=   box_sizer2   box_datasegmentfragments_run_countrF   s                 r   	read_abstzFlvReader.read_abstv   s   ! '')t|q  $$&$$&..0|$ 	A	//1}% 	A	 	002~& 	%A+/+=+=+?(Hhw&&&)335GOOG$		%
 #557	*+ 	>A+/+=+=+?(Hhw&&&Yx0::<=	> !"
 	
r   c                 j    | j                         \  }}}|dk(  sJ t        |      j                         S )Ns   abst)r4   r   rU   )r   
total_sizer2   rR   s       r   read_bootstrap_infozFlvReader.read_bootstrap_info   s9    )-););)=&
Hh7"""",,..r   N)r   r   r   __doc__r   r!   r&   r(   r-   r4   r@   rI   rU   rX   r   r   r   r   r      s<    
:::
L
* 
D1
f/r   r   c                 4    t        |       j                         S N)r   rX   )bootstrap_bytess    r   rX   rX      s    _%99;;r   c                    g }| d   d   }| d   d   d   }|d   d   }t        j                  |      }|d   D ]=  \  }}|dk(  r| d   rd}t        |      D ]  }|j                  |t	        |      f         ? | d   r|d	d
 }|S )zE Return a list of (segment, fragment) for each fragment in the video r=   r   rF   rB   r7   l    rL   r   N)	itertoolscountr8   r9   next)		boot_infor+   segment_run_tablefragment_run_entry_tablefirst_frag_numberfragments_counterrS   rG   r;   s	            r   build_fragments_listrg      s    
C!*-a0(5a8E03G<!(9:$5m$D ;  j(Yv->O' 	;AJJ&7!89:	;; "#hJr   c                 N    | j                  t        j                  d|             y )Nr$   writer   packstreamvals     r   write_unsigned_intro      s    
LLT3'(r   c                 T    | j                  t        j                  d|      dd         y )Nr$   r   ri   rl   s     r   write_unsigned_int_24rq      s     
LLT3'+,r   c                     | j                  d       | j                  d       | j                  d       | j                  d       y)zWrites the FLV header to streams   FLV   s      	s       N)rj   )rm   s    r   write_flv_headerrt      s6     LL
LL
LL$%
LL$%r   c                     d}d}|ra| j                  |       t        | t        |             | j                  d       | j                  |       t        | |t        |      z          yy)z&Writes optional metadata tag to stream      s          N)rj   rq   r   ro   )rm   metadata
SCRIPT_TAGFLV_TAG_HEADER_LENs       r   write_metadata_tagr{      s\    JZ fc(m445X6#5H#EF r   c                 .    t        t        d |             S )Nc                 >    d| j                   vxr d| j                   vS )NdrmAdditionalHeaderIddrmAdditionalHeaderSetId)attrib)es    r   <lambda>z(remove_encrypted_media.<locals>.<lambda>   s%    !8!H "P%?qxx%O r   )listfilter)medias    r   remove_encrypted_mediar      s     P  r   c                     d|| fz  S )Nz {http://ns.adobe.com/f4m/%d.0}%sr   )propvers     r   _add_nsr      s    -d;;r   c                 r    t        | t        d      t        dd      gdd       }|r|j                         }|S )NbaseURLr   zbase URL)default)r	   r   strip)manifestbase_urls     r   get_base_urlr      s=    79%wy!'<=D"H >>#Or   c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)F4mFDz5
    A downloader for f4m manifests or AdobeHDS.
    c                    |j                  t        d            }|s| j                  d       | j                  j	                  d      se|j                  t        d            |j                  t        d            z   D ]"  }d|j
                  vs| j                  d       $ t        |      }|s| j                  d       |S )	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_mediazF4mFD._get_unencrypted_media   s    GG,-./{{9:kk'*?"@AG,D$EFG ? qxx'%%&=>? +51E/0r   c                 j    | j                   j                  |      j                         }t        |      S r[   )ydlurlopenr   rX   )r   bootstrap_url	bootstraps      r   _get_bootstrap_from_urlzF4mFD._get_bootstrap_from_url  s*    HH$$]388:	"9--r   c                     g }d}|s]|dkD  rX| j                  |      }t        |      }|D cg c]  }|d   |kD  s| }}|st        j                  d       |dz  }|s|dkD  rX|s| j	                  d       |S c c}w )N   r   r   g      @zFailed to update fragments)r   rg   timesleepr   )r   r   latest_fragmentfragments_listretriesrb   fs          r   _update_live_fragmentszF4mFD._update_live_fragments  s    !!44]CI1)<N)7RA1Q4/;QaRNR!

31 "! :; Ss
   A9A9c                     |j                  d      }|r5t        j                  j                  ||      }| j	                  |      }||fS d }t        j                  |j                        }t        |      }||fS )Nurl)	r   urllibparseurljoinr   base64	b64decodetextrX   )r   noder   r   rb   r   s         r   _parse_bootstrap_nodezF4mFD._parse_bootstrap_node$  sz     "LL00-)M44]CI
 -'' !M((3I+I6I-''r   c           	      	  ( |d   }|j                  d      (| j                  d| j                   d       | j                  j	                  | j                  ||            }|j                  }t        |j                         j                  dd            j                         }t        |      }| j                  |      D cg c])  }t        |j                  j                  dd            |f+ }}(t        |      d	k(  rt!        |d
       }|d   \  }	}
nt#        t%        (fd|            \  }	}
t'        |      xs |}t(        j*                  j-                  ||
j                  d         }|j/                  t1        d            }| j3                  ||      \  }}|d   }|
j/                  t1        d            }| t5        j6                  |j8                        }nd }t;        |      }| j<                  j                  dd      }|r|d d	 }t        |      }t?        |t1        d            }||tA        |      d}| jC                  |       |d   }|d   dk(  rtE        |       |stG        ||       t(        j*                  jI                  |      }| jK                  ||       d}|r|jM                  d      \  }}|d	z  }||d   k  r%d||fz  }g }|jN                  r|jQ                  |jN                         |r |jQ                  |j                  d             |j                  d      r|jQ                  |d          |jS                  |jT                  |z   djW                  |            }	 | jY                  ||j[                         |      } | sy| j]                  |      }!t_        |!      }"	 	 |"ja                         \  }#}$}%|$dk(  r| jg                  ||%       n.|sX|sV|rT|rR| jo                  ||      }|t        |      z  }|r0|d   d	   |d	z   kD  r"d!|d   d	   |d	z   z
  z  }'| jm                  |'       |r| jq                  ||      S c c}w # tb        $ r |r|je                  |!       Y  w xY w# th        $ rD}&|r7|&jj                  dk(  s|&jj                  dk(  rd |z  }'| jm                  |'       g }n Y d }&~&d }&~&ww xY w)"Nr   tbr[z] Downloading f4m manifestzutf-8ignorebitrater   c                     | d   S Nr   r   )r   s    r   r   z%F4mFD.real_download.<locals>.<lambda>F  s
    AaD r   )keyc                 &    t        | d         k(  S r   )int)r   requested_bitrates    r   r   z%F4mFD.real_download.<locals>.<lambda>J  s    #ad)'88 r   bootstrapInforL   rx   testFzpv-2.0)filenametotal_fragsrL   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   sortedra   r   r   r   r   r   findr   r   r   r   r   rg   r   r	   bool_prepare_frag_downloadrt   r{   urlparse_start_frag_downloadpopr   r9   _replacer   join_download_fragmentgeturl_read_fragmentr   r4   r   rj   _append_fragmentr   statusreport_warningr   _finish_frag_download))r   r   	info_dictman_urlurlhr   r   r   formatsrater   man_base_urlr   bootstrap_noderb   r   rL   metadata_noderx   r   r   r   	akamai_pvctxr   base_url_parsed
frag_indexseg_ifrag_inamer   
url_parsedsuccess	down_datareaderr;   r2   rR   errmsgr   s)                                           @r   real_downloadzF4mFD.real_download5  s   E"%MM%04<<.(BCDxx 1 1)W EF(( &diik&8&8(&KLRRT%h/ 77<> Y34a8 > >$G(9W.9G!"+KD%v8' C DKD% $C(3G<<''ell56IJ'/":;#'#=#=L$* 	= 

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 h ))#y99S>X . 
 (--i8!  SZZ3.#**2C 4f<C'',%'N #sH   .Q6#Q= Q= 8Q Q= Q:6Q= 8Q::Q= =	S
:SS
N)	r   r   r   rY   r   r   r   r   r   r   r   r   r   r      s!     ."("v:r   r   )r   )r   ior_   r   r   urllib.parser   fragmentr   compatr   networking.exceptionsr   utilsr   r	   	Exceptionr   BytesIOr   rX   rg   ro   rq   rt   r{   r   r   r   r   r   r   r   <module>r     s~     	       , - 2	 	Z/

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