
    VGhJ                         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 ddlmZ dd	lmZmZmZmZmZmZ dd
lmZ  G d de
      Zy)    N   )get_suitable_downloader)FFmpegFD)
FragmentFD   )webvtt)
Cryptodome)bug_reports_messageparse_m3u8_attributesremove_starttraverse_objupdate_url_queryurljoin)_request_dump_filenamec                   <    e Zd ZdZdZed        Zedd       Zd Z	y)HlsFDz
    Download segments in a m3u8 manifest. External downloaders can take over
    the fragment downloads by supporting the 'm3u8_frag_urls' protocol and
    re-defining 'supports_manifest' function
    	hlsnativec                 ^    t        t        j                  dj                  d      |             S )N|)z&#EXT-X-(?:SESSION-)?KEY:.*?URI="skd://zG#EXT-X-(?:SESSION-)?KEY:.*?KEYFORMAT="com\.apple\.streamingkeydelivery"z@#EXT-X-(?:SESSION-)?KEY:.*?KEYFORMAT="com\.microsoft\.playready"z#EXT-X-FAXS-CM:)boolresearchjoin)manifests    ^/var/www/it7/html/youtubeDownloader/venv/lib/python3.12/site-packages/yt_dlp/downloader/hls.py_has_drmzHlsFD._has_drm   s/    BIIchh (
 
   	    c                 R     g sdgz   fd}t         |             S )Nz"#EXT-X-KEY:METHOD=(?!NONE|AES-128)c               3      K   j                  d        D ]  } t        j                  |          sj                          y y w)Nis_live)getr   r   r   )featureUNSUPPORTED_FEATURESallow_unplayable_formatscls	info_dictr   s    r   check_resultsz)HlsFD.can_download.<locals>.check_resultsB   sV     mmI.../ 7))GX6667+,,x000 ,s   AA)all)r%   r   r&   r$   r'   r#   s   ```` @r   can_downloadzHlsFD.can_download(   s<     
& ( 5%  	1 	1 =?##r   c           	      J   / |d   }|j                  d      }|r! j                  d j                   d       n j                  d j                   d        j                  j	                   j                  ||            }|j                  }|j                         } j                  j                  d      rrt        ||d   d  j                  j                  d      	      } j                  d j                   d
|        t        |d      5 }|j                  |       d d d        |j                  dd      } j                  || j                  j                  d            d }
}	|	rpt        j                         }t         j"                   xr d|v }|r|rd\  }	}
n;|rd}
n6|j                  d      dk(  r"t%        j&                  d|      r|rdnd}d| d}
|	s j)                  |      r} j                  j                  d      sb|j                  d      r= j                  j                  d      r" j                  d j                   dd       y j+                  dd        y|
xs d!}
t         j                   j                        } j-                  |
 d"|j/                                 |j1                  ||      S |
r j-                  |
       |d#   d$k(  }|rd }nt3        | j                  d d%|d&k(  '      }|r|j5                  |      sd }|r/ j                  d j                   d(|j/                                 d) }d* }g }d+}d+}d}|j7                         D ]I  }|j9                         }|s|j;                  d,      r ||      rd}n
 ||      rd}=|r|d-z  }E|d-z  }K |||d.}|r j=                  |       n j?                  ||       |jA                  d/i       /|j                  d0      }d }|j                  d1      x}rtB        jD                  jG                  |      }d }|j                  d2      x}rtB        jD                  jG                  |      }d+}d+}d3d4i} tI        |d5      }!|!r3tK        jL                  tO        |!d6            }!tQ        |!      d7v sJ d8       tI        |d9      }"|"r.tK        jL                  tO        |"d6      jS                  d:            }"i }#d+}$d+}%d+}&d}|j7                         D ]  }|j9                         }|s|j;                  d,      s[|r|%|k7  r0|r3|&d-z  }&|&|d;   k  rAtU        ||      }'|rtW        |'|      }'|jY                  |&|'| |#|d<       |d-z  }|#rQ|#d=   }$i }#nH|j;                  d>      r|r|%|k7  r|&d+kD  r j+                  d?        y|&d-z  }&t[        |d@d        }(tU        ||(j                  dA            }'|rtW        |'|      }'i })|(j                  dB      rR|(j                  dB      j]                  dC      }*tQ        |*      dDk(  rt_        |*d-         nd+}+|+|+t_        |*d+         z   dE})|jY                  |&|'| |)|d<       |d-z  }nX|j;                  dF      r| j                  dA      },t[        |d@d        } | d3   dGk(  r|"r|"| dH<   n1dH| v r-tK        jL                  | dH   dDd  jS                  d:            | dH<   |!r|!| dI<   ntU        || dA         | dA<   |s|rtW        | dA   |xs |      | dA<   |,| dA   k7  rd | dI<   n|j;                  dJ      rt_        |dKd        }n|j;                  dL      rG|dMd  j]                  dC      }*tQ        |*      dDk(  rt_        |*d-         n|$}+|+|+t_        |*d+         z   dE}#n, ||      rd}n! ||      rd}n|j;                  dN      r|%d-z  }%|d-z  }  j                  j                  dd      r
|r|d+   nd g}|r4||dO<    | j                   j                        }|j1                  ||      S |rD/ fdP}-/fdQ}.tQ        |      d-k(  r ja                  |||       y  ja                  ||||-|.R       y  ja                  |||      S # 1 sw Y   sxY w)SNurlhls_media_playlist_data[z)] Using m3u8 manifest from extracted infoz] Downloading m3u8 manifestwrite_pagesidtrim_file_name)trim_lengthz] Saving request to wbzutf-8ignorer$   z#EXT-X-KEY:METHOD=AES-128)FzDThe stream has AES-128 encryption and pycryptodomex is not availablezThe stream has AES-128 encryption and neither ffmpeg nor pycryptodomex are available; Decryption will be performed natively, but will be extremely slowextractor_keyGenericz (?m)#EXT-X-MEDIA-SEQUENCE:(?!0$) zinstall ffmpeg and z]Live HLS streams are not supported by the native downloader. If this is a livestream, please z:add "--downloader ffmpeg --hls-use-mpegts" to your commandhas_drmtestz] This format is DRM protectedT)skip_eolzThis format is DRM protected; Try selecting another format with --format or add --check-formats to automatically fallback to the next best formatF)tbz'Unsupported features have been detectedz"; extraction will be delegated to extvttm3u8_frag_urls-)protocol	to_stdoutz*] Fragment downloads will be delegated to c                 |    | j                  d      xr d| v xs$ | j                  d      xr | j                  d      S )N#ANVATO-SEGMENT-INFOztype=ad#UPLYNK-SEGMENTz,ad
startswithendswithss    r   is_ad_fragment_startz1HlsFD.real_download.<locals>.is_ad_fragment_start   s?    \\"89Li1n O%67MAJJu<MPr   c                 |    | j                  d      xr d| v xs$ | j                  d      xr | j                  d      S )NrB   ztype=masterrC   z,segmentrD   rG   s    r   is_ad_fragment_endz/HlsFD.real_download.<locals>.is_ad_fragment_end   s@    \\"89Pmq>P T%67RAJJz<RUr   r   #r   )filenametotal_fragsad_fragsextra_stateformat_indexextra_param_to_segment_urlextra_param_to_key_urlMETHODNONE)hls_aeskey0x)          z"Invalid length for HLS AES-128 key)rV   ivr[   fragment_index)
frag_indexr+   decrypt_info
byte_rangemedia_sequenceendz
#EXT-X-MAPzGInitialization fragment found after media fragments, unable to download   URI	BYTERANGE@r   )startrb   z
#EXT-X-KEYzAES-128IVKEYz#EXT-X-MEDIA-SEQUENCE   z#EXT-X-BYTERANGE   z#EXT-X-DISCONTINUITY	fragmentsc           	      R   t        j                         }d}d}d }t        j                  |       D ]  }t	        |t        j
                        r3|d<   |rdxx   dz  cc<   d}|xj                  |z  c_        |xj                  |z  c_        j                  dg       }g }d}	d}
|	t        |      k  r||	   }t        j
                  j                  |      }|	dz  }	|j                  |      r|j                  |d<   d}
Z||k(  rd}
b|j                  |j                  kD  r||j                  |       |	dz  }	||	= |	t        |      k  r|
r|j                  |j                         |D ]  }|j                  |        Rt	        |t        j                        r|j                   d|_        j                  dd       |xj                   d   d	z  z  c_        |j                   j#                  dd      k  rd}|xj                   d
z  c_        |j                   }|dk(  r'|j                   xs dd<   |j$                  xs dd<   n|j                   K|j$                  ?|j                   j#                  dd      z
  |j$                  j#                  dd      z
  z
  }tt	        |t        j&                        r8|dk7  r3j)                  t+        dt-        |      j.                   d             |j                  |        |j1                         j3                         S )Nr   Fwebvtt_mpegts_lastwebvtt_mpegts_adjustr   webvtt_dedup_windowTrb   !   l        webvtt_mpegtswebvtt_localzDiscarding a zO block found in the middle of the stream; if the subtitles display incorrectly,)ioStringIOr   parse_fragment
isinstanceCueBlockrg   rb   
setdefaultlen	from_jsonhingesappendas_json
write_intoMagicmpegtsr!   localHeaderBlockreport_warningr
   type__name__getvalueencode)frag_contentr^   outputadjustoverflowmpegts_lastblockdedup_windowreadyiis_newwcuewblockrP   selfs                r   pack_fragmentz*HlsFD.real_download.<locals>.pack_fragment3  s    "#22<@ E-E!%9<G$89#'(>?1D?',Hv-		V+	'2'='=>SUW'X "!%#l"33#/?D%+__%>%>t%DFFA%}}U3.3iiU). (%). (%zzEKK7 (!LL0FA ,Q  #l"33" "(//>%* 5E!,,V45 !#E6<<8 <</+,EL#../EqI4J(Kr(QQ <<+//:NPQ*RR'+H!LLG3L&+ll%?;@<<;L1K8:?++:JK7  %||7EKK<S%*\\KOOOUV4W%W',{{[__^UV5W'W%Y !' %#E6+=+=>%? !//0C"/U0D0D/E FH !H1I J %$$V,KE-N (//11r   c                      j                  d      } | syt        j                         }| D ]0  }t        j                  j                  |      j                  |       2 |j                         j                         S )Nrp   r   )	r!   rt   ru   r   rx   r{   r   r   r   )r   r   cuerP   s      r   fin_fragmentsz*HlsFD.real_download.<locals>.fin_fragments  si    */DE#' FCOO--c2==fEF (//11r   )	pack_funcfinish_func)1r!   	to_screenFD_NAMEydlurlopen_prepare_urlr+   readparamsr   openwritedecoder)   r   	availabler	   AESr   r   r   report_errorr   get_basenamereal_downloadr   supports_manifest
splitlinesstriprE   _prepare_external_frag_download _prepare_and_start_frag_downloadry   urllibparseparse_qsr   binascii	unhexlifyr   rz   zfillr   r   r}   r   splitintdownload_and_append_fragments)0r   rM   r&   man_urlrH   urlhs_bytesdump_filenameoutfr)   message
has_ffmpeg	no_cryptoinstall_ffmpegfd	is_webvttreal_downloaderrI   rK   rl   media_fragsrO   ad_frag_nextlinectxrQ   extra_segment_queryrR   extra_key_queryrS   r   ra   r_   external_aes_keyexternal_aes_ivr`   byte_range_offsetdiscontinuity_countr^   frag_urlmap_infomap_byte_rangesplitted_byte_rangesub_range_startdecrypt_urlr   r   rP   s0   `                                              @r   r   zHlsFD.real_downloadJ   s2	   E"MM34NNQt||n,UVWNNQt||n,GHI88##D$5$5i$IJDhhGiikG{{}- 6Yt_d $0@ A!C 4<<.0D]OTU-. ($JJw'(w1A $ 1 1!YPj@k lnrg!++-J&NN*O/Ja/OIZ(u%g_/9<KnpqAr'17L%%3$44np}}Q8R(S==+0GNNQt||n4R#S^bNc
  %%`di & k J!JG$((DKK0B7)+MbooN_M` ab##Hi88(e$-	"O54;;7GT\`cTcfO?#D#DQ#G"ONNQt||n,VWfWsWsWuVvwx	P	U 	LLN 	D::<Ds#'-#'L'-#(LA1K	  !& 
 00511#yAnn]B7 }}^4")27S)TT%T"(,,"7"78R"S%.]]3K%LL!L$ll334JKO &)'	3EF'11,?OQU2VW'(L8^:^^8&y2CD&00ot1T1Z1Z[]1^_O

LLN _	D::<Ds+#(;|(K # !OJ!S)9%:: &w5H*#3H>Q#R$$&0'(4&0*8&  #a'N ",6u,=)%'
__\2#(;|(K !A~))eg$!OJ4T"#Y?H&wU0CDH*#3H>Q#R%'N||K0.6ll;.G.M.Mc.R+ILM`IaefIf#.A!.D*Elm%4#2S9LQ9O5P#P*
 $$&0'(4&4*8&  #a'N__\2"."2"25"9K#8bc#CL#H-:*1@L.!\1191C1CLQUDVWXWYDZD`D`acDd1eL.+2BL/29'<PUCV2WL/.2E6F$0$79_L_7aU 3*l5.AA6:U 3__%<=%(bc^N__%78*.rs)//#*>'EHI\E]abEbc*=a*@&AhyO!0.5H5K1LL"J *$/#'L'-#(L__%;<'1,'Q_	D ;;??65))21=I%.Ik" 4;;7B ##Hi88L2\	2 9~"223	9M22ITa 3 c 55c9iPPq	( (s   bb"N)F)
r   
__module____qualname____doc__r   staticmethodr   classmethodr)   r    r   r   r   r      s<     G  $ $BHQr   r   )r   rt   r   urllib.parser   r6   r   externalr   fragmentr   r   dependenciesr	   utilsr
   r   r   r   r   r   utils._utilsr   r   r   r   r   <module>r      s?     	 	  %     %  2|QJ |Qr   