
    yfE                         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  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urljoinc                   <    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    7/usr/lib/python3/dist-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_resultsA   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           	      $   ( |d   } j                  d j                  z          j                  j                   j	                  ||            }|j
                  }|j                         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)                                 |j+                  ||      S |r j'                  |       |d   dk(  }|rd }nt-        | j                  d d|dk(        }|r|j/                  |      sd }|r/ j                  d j                   d |j)                                 d! }d" }g }d#}d#}d}|j1                         D ]I  }|j3                         }|s|j5                  d$      r ||      rd}n
 ||      rd}=|r|d%z  }E|d%z  }K |||d&}|r j7                  |       n j9                  ||       |j;                  d'i       (|j                  d(      }d }|j                  d)      }|rt<        j>                  jA                  |      }d#}d#}d*d+i}tC        |d,      }|r3tE        jF                  tI        |d-            }tK        |      d.v sJ d/       tC        |d0      }|r.tE        jF                  tI        |d-      jM                  d1            }i }d#}d#} d}|j1                         D ]  }|j3                         }|s|j5                  d$      sQ|r||k7  r0|r3| d%z  } | |d2   k  rAtO        ||      }!|rtQ        |!|      }!|jS                  | |!|||d3       |d%z  }nF|j5                  d4      r|r||k7  r| d#kD  r j%                  d5        y| d%z  } tU        |d6d        }"tO        ||"j                  d7            }!|rtQ        |!|      }!|"j                  d8      rU|"j                  d8      jW                  d9      }#tK        |#      d:k(  rtY        |#d%         n|d;   }$|$|$tY        |#d#         z   d<}|jS                  | |!|||d3       |d%z  }nU|j5                  d=      r|j                  d7      }%tU        |d6d        }|d*   d>k(  r|r||d?<   n1d?|v r-tE        jF                  |d?   d:d  jM                  d1            |d?<   |r||d@<   ntO        ||d7         |d7<   |rtQ        |d7   |      |d7<   |%|d7   k7  rd |d@<   n|j5                  dA      rtY        |dBd        }n|j5                  dC      rJ|dDd  jW                  d9      }#tK        |#      d:k(  rtY        |#d%         n|d;   }$|$|$tY        |#d#         z   d<}n, ||      rd}n! ||      rd}n|j5                  dE      r|d%z  }|d%z  }  j                  j                  dd      r
|r|d#   nd g}|r4||dF<    | j                   j                        }|j+                  ||      S |rD( fdG}&(fdH}'tK        |      d%k(  r j[                  |||       y  j[                  ||||&|'I       y  j[                  |||      S )JNurlz[%s] Downloading m3u8 manifestz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test[z] 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_starty   s?    LL!78KY!^ M||$56L1::e;LNr   c                 |    | j                  d      xr d| v xs$ | j                  d      xr | j                  d      S )Nr;   ztype=masterr<   z,segmentr=   r@   s    r   is_ad_fragment_endz/HlsFD.real_download.<locals>.is_ad_fragment_end}   s@    LL!78O]a=O R||$56Q1::j;QSr   r   #r   )filenametotal_fragsad_fragsextra_stateformat_indexextra_param_to_segment_urlMETHODNONE)hls_aeskey0x)          z"Invalid length for HLS AES-128 key)rN   ivrS   fragment_index)
frag_indexr*   decrypt_info
byte_rangemedia_sequencez
#EXT-X-MAPzGInitialization fragment found after media fragments, unable to download   URI	BYTERANGE@r   end)startr^   z
#EXT-X-KEYzAES-128IVKEYz#EXT-X-MEDIA-SEQUENCE   z#EXT-X-BYTERANGE   z#EXT-X-DISCONTINUITY	fragmentsc           	      P   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&                        r7|dk7  r2j)                  t+        dt-        |      j.                  z               |j                  |        |j1                         j3                         S )Nr   Fwebvtt_mpegts_lastwebvtt_mpegts_adjustr   webvtt_dedup_windowTr^   !   l        webvtt_mpegtswebvtt_localz^Discarding a %s block found in the middle of the stream; if the subtitles display incorrectly,)ioStringIOr   parse_fragment
isinstanceCueBlockr_   r^   
setdefaultlen	from_jsonhingesappendas_json
write_intoMagicmpegtsr    localHeaderBlockreport_warningr
   type__name__getvalueencode)frag_contentrV   outputadjustoverflowmpegts_lastblockdedup_windowreadyiis_newwcuewblockrI   selfs                r   pack_fragmentz*HlsFD.real_download.<locals>.pack_fragment  s    "#22<@ F-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!H#';#7#7!91: ; %$$V,MF-P (//11r   c                      j                  d      } | syt        j                         }| D ]0  }t        j                  j                  |      j                  |       2 |j                         j                         S )Nrh   r   )	r    rl   rm   r   rp   rs   rw   r   r   )r   r   cuerI   s      r   fin_fragmentsz*HlsFD.real_download.<locals>.fin_fragmentsi  si    */DE#' FCOO--c2==fEF (//11r   )	pack_funcfinish_func).	to_screenFD_NAMEydlurlopen_prepare_urlr*   readdecoder(   paramsr    r   	availabler	   AESr   r   r   report_errorr|   get_basenamereal_downloadr   supports_manifest
splitlinesstripr>   _prepare_external_frag_download _prepare_and_start_frag_downloadrq   urllibparseparse_qsr   binascii	unhexlifyr   rr   zfillr   r   ru   r   splitintdownload_and_append_fragments))r   rF   r%   man_urlurlhrA   r(   message
has_ffmpeg	no_cryptoinstall_ffmpegfd	is_webvttreal_downloaderrB   rD   rd   media_fragsrH   ad_frag_nextlinectxrJ   extra_queryrK   r   rY   rW   external_aes_keyexternal_aes_ivrX   discontinuity_countrV   frag_urlmap_infosplitted_byte_rangesub_range_startdecrypt_urlr   r   rI   s)   `                                       @r   r   zHlsFD.real_downloadI   s$   E"7$,,FGxx 1 1)W EF((IIKw1 $ 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	N	S 	LLN 	D::<Ds#'-#'L'-#(LA1K	  !& 
 00511#yAnn]B7 }}^4%.]]3O%P"% ,,//0JKK &)'	3EF'11,?OQU2VW'(L8^:^^8&y2CD&00ot1T1Z1Z[]1^_O

LLN V	D::<Ds+#(;|(K # !OJ!S)9%:: &w5H"#3Hk#J$$&0'(4&0*8&  #a'N__\2#(;|(K !A~))eg$!OJ4T"#Y?H&wU0CDH"#3Hk#J||K0.6ll;.G.M.Mc.R+ILM`IaefIf#.A!.D*Elvw|l}%4#2S9LQ9O5P#P&

 $$&0'(4&0*8&  #a'N__\2"."2"25"9K#8bc#CL#H-:*1@L.!\1191C1CLQUDVWXWYDZD`D`acDd1eL.+2BL/29'<PUCV2WL/*6F|TYGZ\g6hU 3*l5.AA6:U 3__%<=%(bc^N__%78*.rs)//#*>'EHI\E]abEbc*=a*@&AhrsxhyO!0.5H5K1LL"J *$/#'L'-#(L__%;<'1,'QmV	r ;;??65))21=I%.Ik" 4;;7B ##Hi88M2^	2 9~"223	9M22ITa 3 c 55c9iPPr   N)F)
r~   
__module____qualname____doc__r   staticmethodr   classmethodr(   r    r   r   r   r      s<     G  $ $BqQr   r   )r   rl   r   urllib.parser   r.   r   externalr   fragmentr   r   dependenciesr	   utilsr
   r   r   r   r   r   r   r   r   r   <module>r      s:     	 	  %     % eQJ eQr   