
    V|hgL                         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  SSKJr  SS	KJrJrJrJrJrJr  SS
KJr   " S S\
5      rg)    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                   F    \ rS rSrSrSr\S 5       r\S	S j5       r	S r
Srg)
HlsFD   z
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                 `    [        [        R                  " SR                  S5      U 5      5      $ )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    O/home/james-whalen/.local/lib/python3.13/site-packages/yt_dlp/downloader/hls.py_has_drmHlsFD._has_drm   s/    BIIchh (
 
   	    c                 ^   ^ ^^^^ / mT(       d  TS/-  mUUU UU4S jn[        U" 5       5      $ )Nz"#EXT-X-KEY:METHOD=(?!NONE|AES-128)c               3      >#    TR                  S5      (       + v   T H!  n [        R                  " U T5      (       + v   M#     T(       d  TR                  T5      (       + v   g g 7f)Nis_live)getr   r   r   )featureUNSUPPORTED_FEATURESallow_unplayable_formatscls	info_dictr   s    r   check_results)HlsFD.can_download.<locals>.check_resultsB   sP     mmI.../))GX666 0+,,x000 ,s   A!A$)all)r'   r   r(   r&   r)   r%   s   ```` @r   can_downloadHlsFD.can_download(   s<     
& ( 5%  	1 	1 =?##r   c           	        ^ ^/ US   nUR                  S5      nU(       a!  T R                  ST R                   S35        GOT R                  ST R                   S35        T R                  R	                  T R                  X#5      5      nUR                  nUR                  5       nT R                  R                  S5      (       an  [        X2S   S T R                  R                  S5      S	9nT R                  ST R                   S
U 35        [        US5       nUR                  U5        S S S 5        UR                  SS5      nT R                  XBT R                  R                  S5      5      S pU	(       a  [        R                  " 5       n[         R"                  (       dU  SU;   aO  [%        US[&        45      (       + nSR)                  U(       a	  U(       d  SOS5      n
U(       a
  U(       a  Sn	OHU
S-  n
OBUR                  S5      S:X  a-  [*        R,                  " SU5      (       a  U(       a  SOSnSU S3n
U	(       d  T R/                  U5      (       a  T R                  R                  S5      (       df  UR                  S5      (       a?  T R                  R                  S5      (       a  T R                  ST R                   S3S S!9  gT R1                  S"SS#9  gU
=(       d    S$n
[        T R                  T R                  5      nT R3                  U
 S%UR5                  5        35        UR7                  X5      $ U
(       a  T R3                  U
5        US&   S':H  nU(       a  S nO[9        UT R                  S S(US):H  S*9nU(       a  UR;                  U5      (       d  S nU(       a/  T R                  ST R                   S+UR5                  5        35        S, nS- n/ nS.nS.nSnUR=                  5        Hf  nUR?                  5       nU(       d  M  URA                  S/5      (       a!  U" U5      (       a  S nOU" U5      (       a  SnMS  U(       a  US0-  nMa  US0-  nMh     UUUS1.nU(       a  T RC                  U5        OT RE                  UU5        URG                  S20 5      m/UR                  S35      nS nUR                  S45      =n(       a  [H        RJ                  RM                  U5      nS nUR                  S55      =n(       a  [H        RJ                  RM                  U5      nS.nS.nS6S70n [%        US85      n!U!(       a6  [N        RP                  " [S        U!S95      5      n![U        U!5      S:;   d   S;5       e[%        US<5      n"U"(       a/  [N        RP                  " [S        U"S95      RW                  S=5      5      n"0 n#S.n$S.n%S.n&SnUR=                  5        GH@  nUR?                  5       nU(       d  M  URA                  S/5      (       do  Ub  U%U:w  a  M>  U(       a  MG  U&S0-  n&U&US>   ::  a  MW  [Y        UU5      n'U(       a  [[        U'U5      n'UR]                  U&U'U U#US?.5        US0-  nU#(       a  U#S@   n$0 n#GOURA                  SA5      (       a  Ub  U%U:w  a  M  U&S.:  a  T R1                  SB5          gU&S0-  n&[_        USCS  5      n([Y        UU(R                  SD5      5      n'U(       a  [[        U'U5      n'0 n)U(R                  SE5      (       aS  U(R                  SE5      Ra                  SF5      n*[U        U*5      SG:X  a  [c        U*S0   5      OS.n+U+U+[c        U*S.   5      -   SH.n)UR]                  U&U'U U)US?.5        US0-  nGOURA                  SI5      (       a  U R                  SD5      n,[_        USCS  5      n U S6   SJ:X  a  U"(       a  U"U SK'   O4SKU ;   a.  [N        RP                  " U SK   SGS  RW                  S=5      5      U SK'   U!(       a  U!U SL'   GO[Y        UU SD   5      U SD'   U(       d  U(       a  [[        U SD   U=(       d    U5      U SD'   U,U SD   :w  a  S U SL'   OURA                  SM5      (       a  [c        USNS  5      nOURA                  SO5      (       aH  USPS  Ra                  SF5      n*[U        U*5      SG:X  a  [c        U*S0   5      OU$n+U+U+[c        U*S.   5      -   SH.n#O;U" U5      (       a  S nO+U" U5      (       a  SnOURA                  SQ5      (       a  U%S0-  n%US0-  nGMC     T R                  R                  SS5      (       a  U(       a  US.   OS /nU(       a3  UUSR'   U" T R                  T R                  5      nUR7                  X5      $ U(       aD  U/U 4SS jn-U/4ST jn.[U        U5      S0:X  a  T Re                  UUU5        g T Re                  UUUU-U.SU9  g T Re                  UUU5      $ ! , (       d  f       GN= f)VN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)extra_param_to_segment_urlextra_param_to_key_urlr0   )hls_aes)urikeyivz2The stream has AES-128 encryption and {} availablez$neither ffmpeg nor pycryptodomex arezpycryptodomex is notFzC; 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 format)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                     U R                  S5      =(       a    SU ;   =(       d)    U R                  S5      =(       a    U R                  S5      $ )N#ANVATO-SEGMENT-INFOztype=ad#UPLYNK-SEGMENTz,ad
startswithendswithss    r   is_ad_fragment_start1HlsFD.real_download.<locals>.is_ad_fragment_start   s?    \\"89Li1n O%67MAJJu<MPr   c                     U R                  S5      =(       a    SU ;   =(       d)    U R                  S5      =(       a    U R                  S5      $ )NrL   ztype=masterrM   z,segmentrN   rQ   s    r   is_ad_fragment_end/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_indexr8   r9   METHODNONE)r:   r<   0x)          z"Invalid length for HLS AES-128 key)r:   r=   rc   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   )startri   z
#EXT-X-KEYzAES-128IVKEYz#EXT-X-MEDIA-SEQUENCEr   z#EXT-X-BYTERANGE   z#EXT-X-DISCONTINUITY	fragmentsc           	        > [         R                  " 5       nSnSnS n[        R                  " U 5       GH  n[	        U[        R
                  5      (       GaJ  UTS'   U(       a  TS==   S-  ss'   SnU=R                  U-  sl        U=R                  U-  sl        TR                  S/ 5      n/ nSn	Sn
U	[        U5      :  a  Xy   n[        R
                  R                  U5      nU	S-  n	UR                  U5      (       a  UR                  US'   Sn
M`  X:X  a  Sn
Mi  UR                  UR                  :  a  M  UR                  U5        U	S-  n	Xy	 U	[        U5      :  a  M  U
(       a  UR                  UR                  5        U H  nUR                  U5        M     GMn  [	        U[        R                  5      (       Ga  UR                   c  SUl        TR                  SS5        U=R                   TS   S	-  -  sl        UR                   TR#                  SS5      :  a  SnU=R                   S
-  sl        UR                   nUS:X  a1  UR                   =(       d    STS'   UR$                  =(       d    STS'   OUR                   bL  UR$                  b?  UR                   TR#                  SS5      -
  UR$                  TR#                  SS5      -
  -
  nGM  [	        U[        R&                  5      (       a:  US:w  a4  TR)                  [+        S[-        U5      R.                   S35      5        GM  UR                  U5        GM     UR1                  5       R3                  5       $ )Nr   Fwebvtt_mpegts_lastwebvtt_mpegts_adjustr   webvtt_dedup_windowTri   !   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CueBlockrn   ri   
setdefaultlen	from_jsonhingesappendas_json
write_intoMagicmpegtsr#   localHeaderBlockreport_warningr
   type__name__getvalueencode)frag_contentre   outputadjustoverflowmpegts_lastblockdedup_windowreadyiis_newwcuewblockr\   selfs                r   pack_fragment*HlsFD.real_download.<locals>.pack_fragment:  s    "#22<@E!%99<G$89#'(>?1D?',Hv-		V+	'2'='=>SUW'X "!%#l"33#/?D%+__%>%>t%DFFA%}}U33.3iiU). (%). (%zzEKK7 (!LL0FA ,  #l"33" "(//>%*E!,,V4 &+ !#E6<<8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 AN (//11r   c                  
  > TR                  S5      n U (       d  g[        R                  " 5       nU  H1  n[        R                  R                  U5      R                  U5        M3     UR                  5       R                  5       $ )Nrv   r   )	r#   rz   r{   r   r~   r   r   r   r   )r   r   cuer\   s      r   fin_fragments*HlsFD.real_download.<locals>.fin_fragments  sb    */DE#'COO--c2==fE ( (//11r   )	pack_funcfinish_func)3r#   	to_screenFD_NAMEydlurlopen_prepare_urlr/   readparamsr   openwritedecoder,   r   	availabler	   AESr   anyformatr   r   r   report_errorr   get_basenamereal_downloadr   supports_manifest
splitlinesstriprO   _prepare_external_frag_download _prepare_and_start_frag_downloadr   urllibparseparse_qsbinascii	unhexlifyr   r   zfillr   r   r   r   splitintdownload_and_append_fragments)0r   rY   r(   man_urlrR   urlhs_bytesdump_filenameoutfr,   message
has_ffmpegffmpeg_can_dlinstall_ffmpegfd	is_webvttreal_downloaderrS   rV   rr   media_fragsr[   ad_frag_nextlinectxr]   extra_segment_queryr8   extra_key_queryr9   r   rh   rf   external_aes_keyexternal_aes_ivrg   byte_range_offsetdiscontinuity_countre   frag_urlmap_infomap_byte_rangesplitted_byte_rangesub_range_startdecrypt_urlr   r   r\   s0   `                                              @r   r   HlsFD.real_downloadJ   s	   E"MM34NNQt||n,UVWNNQt||n,GHI88##D$5$5i$IJDhhGiikG{{}-- 6t_d $0@ A!C 4<<.0D]OTU-.$JJw' /w1A $ 1 1!Pj@k lnrg!++-J>>&AQ&F$0 > = % ! OUU>KT^:*, -#(LddG/9<KnpqArAr'17L%%3$44np}}Q8R(S(S==++0G0GNNQt||n4R#S^bNc
  %%`di & k J!JG$((DKK0B7)+MbooN_M` ab##H88(e$-	"O54;;7GT\`cTcfO?#D#DQ#G#G"ONNQt||n,VWfWsWsWuVvwx	P	U 	LLND::<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

LLND::<Dts++#/4G<4W # !OJ!S)9%:: &w5H*#3H>Q#R$$&0'(4&0*8&  #a'N ",6u,=)%'
__\22#/4G<4W !A~))eg$!OJ4T"#Y?H&wU0CDH*#3H>Q#R%'N||K00.6ll;.G.M.Mc.R+ILM`IaefIf#.A!.D*Elm%4#2S9LQ9O5P#P*
 $$&0'(4&4*8&  #a'N__\2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8*.rs)//#*>'EHI\E]abEbc*=a*@&AhyO!0.5H5K1LL"J *$//#'L'--#(L__%;<<'1,'Q #D ;;??65)))21=I%.Ik" 4;;7B ##H88L2\	2 9~"223	9M22ITa 3 c 55c9iPP	 /.s   g
g- N)F)r   
__module____qualname____firstlineno____doc__r   staticmethodr   classmethodr,   r   __static_attributes__r   r   r   r   r      s<     G  $ $BOQr   r   )r   rz   r   urllib.parser   r@   r   externalr   fragmentr   r   dependenciesr	   utilsr
   r   r   r   r   r   utils._utilsr   r   r   r   r   <module>r      s?     	 	  %     %  2CQJ CQr   