
    ukigL                         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    P/home/cdr/jupyterlab/.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           	         / |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 }
}	|	rt        j                         }t         j"                  s;d|v r7t%        |dt&        f       }dj)                  |r|sdnd      }
|r|rd}	n<|
dz  }
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 j1                  d"d#       y|
xs d$}
t         j                   j                        } j3                  |
 d%|j5                                 |j7                  ||      S |
r j3                  |
       |d&   d'k(  }|rd }nt9        | j                  d d(|d)k(  *      }|r|j;                  |      sd }|r/ j                  d j                   d+|j5                                 d, }d- }g }d.}d.}d}|j=                         D ]I  }|j?                         }|s|jA                  d/      r ||      rd }n
 ||      rd}=|r|d0z  }E|d0z  }K |||d1}|r jC                  |       n jE                  ||       |jG                  d2i       /|j                  d3      }d }|j                  d4      x}rtH        jJ                  jM                  |      }d }|j                  d5      x}rtH        jJ                  jM                  |      }d.}d.}d6d7i} t%        |d8      }!|!r3tO        jP                  tS        |!d9            }!tU        |!      d:v sJ d;       t%        |d<      }"|"r.tO        jP                  tS        |"d9      jW                  d=            }"i }#d.}$d.}%d.}&d}|j=                         D ]  }|j?                         }|s|jA                  d/      s[||%|k7  r0|r3|&d0z  }&|&|d>   k  rAtY        ||      }'|rt[        |'|      }'|j]                  |&|'| |#|d?       |d0z  }|#rQ|#d@   }$i }#nH|jA                  dA      r||%|k7  r|&d.kD  r j1                  dB        y|&d0z  }&t_        |dCd        }(tY        ||(j                  dD            }'|rt[        |'|      }'i })|(j                  dE      rR|(j                  dE      ja                  dF      }*tU        |*      dGk(  rtc        |*d0         nd.}+|+|+tc        |*d.         z   dH})|j]                  |&|'| |)|d?       |d0z  }nX|jA                  dI      r| j                  dD      },t_        |dCd        } | d6   dJk(  r|"r|"| dK<   n1dK| v r-tO        jP                  | dK   dGd  jW                  d=            | dK<   |!r|!| dL<   ntY        || dD         | dD<   |s|rt[        | dD   |xs |      | dD<   |,| dD   k7  rd | dL<   n|jA                  dM      rtc        |dNd        }n|jA                  dO      rG|dPd  ja                  dF      }*tU        |*      dGk(  rtc        |*d0         n|$}+|+|+tc        |*d.         z   dH}#n, ||      rd }n! ||      rd}n|jA                  dQ      r|%d0z  }%|d0z  }  j                  j                  dd      r
|r|d.   nd g}|r4||dR<    | j                   j                        }|j7                  ||      S |rD/ fdS}-/fdT}.tU        |      d0k(  r je                  |||       y  je                  ||||-|.U       y  je                  |||      S # 1 sw Y   xY w)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_urlr,   )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                 |    | 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 )NrH   ztype=masterrI   z,segmentrJ   rM   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_indexr4   r5   METHODNONE)r6   r8   0x)          z"Invalid length for HLS AES-128 key)r6   r9   r]   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   )startrc   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_windowTrc   !   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CueBlockrh   rc   
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wblockrV   selfs                r   pack_fragmentz*HlsFD.real_download.<locals>.pack_fragment:  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 )Nrq   r   )	r!   ru   rv   r   ry   r|   r   r   r   )r   r   cuerV   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)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striprK   _prepare_external_frag_download _prepare_and_start_frag_downloadrz   urllibparseparse_qsbinascii	unhexlifyr   r{   zfillr   r   r~   r   splitintdownload_and_append_fragments)0r   rS   r&   man_urlrN   urlhs_bytesdump_filenameoutfr)   message
has_ffmpegffmpeg_can_dlinstall_ffmpegfd	is_webvttreal_downloaderrO   rQ   rm   media_fragsrU   ad_frag_nextlinectxrW   extra_segment_queryr4   extra_key_queryr5   r   rb   r`   external_aes_keyexternal_aes_ivra   byte_range_offsetdiscontinuity_countr_   frag_urlmap_infomap_byte_rangesplitted_byte_rangesub_range_startdecrypt_urlr   r   rV   s0   `                                              @r   r   zHlsFD.real_downloadJ   sl	   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>>&AQ&F$0 > = % ! OUU>KT^:*, -#(LddG/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+#/4G<4W # !OJ!S)9%:: &w5H*#3H>Q#R$$&0'(4&0*8&  #a'N ",6u,=)%'
__\2#/4G<4W !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P	( (s   b==cN)F)
r   
__module____qualname____doc__r   staticmethodr   classmethodr)   r    r   r   r   r      s<     G  $ $BOQr   r   )r   ru   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   