
    V|h{*                     j    S SK r S SKrSSKJr  SSKJr  SSKJrJrJ	r	J
r
Jr  SSKJr   " S S	\5      rg)
    N   )
FragmentFD   )	HTTPError)RegexNotFoundErrorRetryManagerdict_getint_or_nonetry_get)HTTPHeaderDictc                   .    \ rS rSrSrS r\S 5       rSrg)YoutubeLiveChatFD   z2Downloads YouTube live chats fragment by fragment c           
        ^ ^^^^^^^^^^ TS   mT R                  ST R                   S35        T R                  R                  S5      (       d  TS   S:X  a  T R	                  S5        T R                  R                  SS	5      nUS
S S.mSSKJn  U" T R                  5      m[        [        R                  " 5       S-  5      mS/UUU 4S jjmUU 4S jmUUU 4S jmSmUUU U4S jmS/UUUUUUU UU4	S jjnT R                  TT5        T" TS   5      nU(       d  g	T R                  T5      n TR                  TUR                  SS5      5      n[        US 5      n	T R!                  TS5        TR#                  TUR                  SS5      5      n
U
(       d  g	[        U
S 5      n[        U
S 5      nU(       a  U(       d  g	[        US [$        5      nTS   S:X  a  SU-   nSU	-   nOTS   S:X  a
  S U-   nS!U	-   nS=nnS nU	b  US"-  nUU	S#.nUS":  a  S$[%        ['        US%-
  S5      5      0US&'   U(       a
  S'U0US(   S)'   TR)                  XS*9nUR+                  S+S,05        [,        R.                  " US	S-9R1                  5       S.-   nU" WUUU5      u  pinnOU" WU5      u  pinnU(       d  g	U(       a  OU	b  M  T R3                  TT5      $ ! [         a     g	f = f)0Nvideo_id[z] Downloading live chatskip_downloadprotocolyoutube_live_chatzLive chat download runs until the livestream ends. If you wish to download the video simultaneously, run a separate yt-dlp instancetestFT)filenamelivetotal_fragsr   )YoutubeBaseInfoExtractor  c                 b   > [        TR                  S5      U5      nTR                  TU TX15      $ )Nhttp_headers)r   get_download_fragment)urldataheadersr   ctx	info_dictselfs       ]/home/james-whalen/.local/lib/python3.13/site-packages/yt_dlp/downloader/youtube_live_chat.pydl_fragment4YoutubeLiveChatFD.real_download.<locals>.dl_fragment(   s/    ))--*GQL**3YSS    c                   > S =n=p#[        5       nU R                  S/ 5       HQ  nSU;   a  US   n[        US   5      nUR                  [        R
                  " USS9R                  5       S-   5        MS     Ub;  [        U S [        5      nU(       a"  UR                  S5      nUR                  S	5      nT	R                  TU5        X!U4$ )
NactionsreplayChatItemActionvideoOffsetTimeMsecFensure_ascii   
c                     U S   S   S   $ )Ncontinuationsr   liveChatReplayContinuationData xs    r&   <lambda>OYoutubeLiveChatFD.real_download.<locals>.parse_actions_replay.<locals>.<lambda>8   s    a034TUr)   continuationclickTrackingParams)
	bytearrayr   intextendjsondumpsencoder   dict_append_fragment)
live_chat_continuationoffsetcontinuation_idclick_tracking_paramsprocessed_fragmentactionreplay_chat_item_actionr9   r#   r%   s
           r&   parse_actions_replay=YoutubeLiveChatFD.real_download.<locals>.parse_actions_replay,   s    ?CCFC_!*044YC)V3.45K.L+ !89N!OPF"))JJvE:AACeKM	 D !&*UW[ ]  &2&6&6~&FO,8,<,<=R,S)!!#'9:",AAAr)   c                    > [        U S [        5      nU(       a:  TR                  TS5        UR                  S5      nSnUR                  S5      nX#U4$ T" U 5      $ )Nc                 6    U S   S   S   S   S   S   S   S   $ )	NheaderliveChatHeaderRendererviewSelectorsortFilterSubMenuRenderersubMenuItemsr   r9   reloadContinuationDatar4   r5   s    r&   r7   WYoutubeLiveChatFD.real_download.<locals>.try_refresh_replay_beginning.<locals>.<lambda>C   s?    !H+&>?OPklm{|}~  AO  P  Qi  jr)   r)   r9   r   trackingParams)r   rA   rB   r   )rC   refresh_continuationrefresh_continuation_idrD   rF   r#   rJ   r%   s        r&   try_refresh_replay_beginningEYoutubeLiveChatFD.real_download.<locals>.try_refresh_replay_beginning?   st    #*& j  lp$q  $%%c3/*>*B*B>*R'(<(@(@AQ(R%.8MMM'(>??r)   r   c                 (  > S =p[        5       nU R                  S/ 5       Hc  nTR                  U5      nUb  UT-
  mSU/0[        T5      SS.nUR	                  [
        R                  " USS9R                  5       S-   5        Me     S S /n[        X[        5      nU(       aX  UR                  S	5      nUR                  S
5      n[        UR                  S5      5      n	U	b  [        R                  " U	S-  5        TR                  T
U5        UTU4$ )Nr+   T)r,   r-   isLiveFr.   r0   c                     U S   S   S   $ )Nr2   r   invalidationContinuationDatar4   r5   s    r&   r7   MYoutubeLiveChatFD.real_download.<locals>.parse_actions_live.<locals>.<lambda>`   s    !O,Q/0NOr)   c                     U S   S   S   $ )Nr2   r   timedContinuationDatar4   r5   s    r&   r7   r^   a   s    !O,Q/0GHr)   r9   r:   	timeoutMsr   )r;   r   parse_live_timestampstrr=   r>   r?   r@   r   rA   r
   timesleeprB   )rC   rE   rF   rG   rH   	timestamppseudo_actioncontinuation_data_getterscontinuation_data
timeout_msr#   live_offsetr%   
start_times             r&   parse_actions_live;YoutubeLiveChatFD.real_download.<locals>.parse_actions_liveO   s)   6::O!*044YC 55f=	("+j"8K .7,A+.{+;"!
 #))JJ}5AHHJURT D PH)% !((>[_ ` "3"7"7"G(9(=(=>S(T%():)>)>{)KL
)JJzD01!!#'9:"K1FFFr)   c                 D  >	 [        TR                  R                  S5      TR                  US9 H  n T" XU5      nU(       d    gTR	                  T5      n TR                  TUR                  SS5      5      nU(       d  [        R                  " U5      n[        US [        5      =(       d    0 nTS   S:H  =(       a    T=(       d    US	:H  =(       a    T=(       d    Tn	S
/U	" U5      Q7s  $    g! [         a    S n Nf = f! [         a  n
Xl         S n
A
M  S n
A
ff = f)Nfragment_retries)
frag_index)FNNNutf-8replacec                     U S   S   $ )NcontinuationContentsliveChatContinuationr4   r5   s    r&   r7   VYoutubeLiveChatFD.real_download.<locals>.download_and_parse_fragment.<locals>.<lambda>|   s    !$:";<R"Sr)   r   r   r   T)r   paramsr   report_retry_read_fragmentextract_yt_initial_datadecoder   r>   loadsr   rA   r   error)r    rq   request_datar"   retrysuccessraw_fragmentr!   rC   funcerrr#   r'   ier$   rm   rJ   r%   rX   r   s              r&   download_and_parse_fragmentDYoutubeLiveChatFD.real_download.<locals>.download_and_parse_fragmentm   s+   %dkkoo6H&I4K\K\ist)#WEG"6#'#6#6s#;L$!99(LDWDWX_ajDkl  #zz,7-4SUY.[ .a^` + 'z26II`N` 4 *a P4P43  !@4(>#?@@' u. + . $#$ ! "%KsB   DD"C2:A2D2D>D DD
DDDr    rr   rs   c                 6    U S   S   S   S   S   S   S   S   $ )	NcontentstwoColumnWatchNextResultsconversationBarliveChatRendererr2   r   rS   r9   r4   r5   s    r&   r7   1YoutubeLiveChatFD.real_download.<locals>.<lambda>   s@    a
m$?@ARSTfghwxyz{  }U  V  We  fr)   r)   c                     U S   $ )NINNERTUBE_API_KEYr4   r5   s    r&   r7   r      s
    1-@+Ar)   c                     U S   $ )NINNERTUBE_CONTEXTr4   r5   s    r&   r7   r      s
    Q7J5Kr)   c                     U S   S   $ )NclientvisitorDatar4   r5   s    r&   r7   r      s    AhK<Vr)   youtube_live_chat_replayzGhttps://www.youtube.com/youtubei/v1/live_chat/get_live_chat_replay?key=z6https://www.youtube.com/live_chat_replay?continuation=z@https://www.youtube.com/youtubei/v1/live_chat/get_live_chat?key=z/https://www.youtube.com/live_chat?continuation=r   )contextr9   playerOffsetMsi  currentPlayerStater:   r   clickTracking)ytcfgvisitor_datazcontent-typezapplication/jsonr.   r0   )NN)	to_screenFD_NAMErx   r   report_warningextractor.youtuber   ydlr<   rd    _prepare_and_start_frag_downloadrz   r{   r|   r   r   rB   extract_ytcfgrc   maxgenerate_api_headersupdater>   r?   r@   _finish_frag_download)r%   r   r$   r   r   r   r   r   r!   rE   r   api_keyinnertube_contextr   r    chat_page_urlrq   rD   rF   r   r"   fragment_request_datar#   r'   r   rk   rm   rJ   rl   rX   r   s   ` `                   @@@@@@@@@r&   real_downloadYoutubeLiveChatFD.real_download   s7   Z(4<<.(?@A{{//Ij4IM`4` !s t {{vu- !
 	A%dhh/t+,
	T 	T	B&	@ 	G 	G<	+ 	+4 	--c9=i./**3/	--h8K8KGU^8_`D " fg 	c3'  <+>+>w	+RS%!AB#E+KL/02VX[\Z $>>[^eeCTWffMz"&99TW^^CMP__M
V $)!OJ, /L A~6FCPVY]P]_`LaHb5c12(@UWl?mL+O<111Y0BCD(,

<e(T([([(]`e(e%Je%:GKEG&2G Kf!:K/G&2G+ ). ))#y99c " 		s   0"K 
KKc                    [        U / SQ5      n[        U[        5      (       d  g [        USS/5      n[        U[        5      (       d  g [        U/ SQ5      n[        U[        5      (       d  g S S /n[        X4[        5      nU(       a$  [        U/ SQ5      n[        U[        5      (       d  g [	        UR                  S5      S	5      $ )
N)addChatItemActionaddLiveChatTickerItemActionaddBannerToLiveChatCommanditembannerRenderer)liveChatTextMessageRendererliveChatPaidMessageRendererliveChatMembershipItemRendererliveChatPaidStickerRenderer%liveChatTickerPaidMessageItemRenderer!liveChatTickerSponsorItemRendererliveChatBannerRendererc                     U S   S   S   $ )NshowItemEndpointshowLiveChatItemEndpointrendererr4   r5   s    r&   r7   8YoutubeLiveChatFD.parse_live_timestamp.<locals>.<lambda>   s    a*+,FG
Sr)   c                     U S   $ )Nr   r4   r5   s    r&   r7   r      s    a
mr)   )r   r   r   r   timestampUsecr   )r	   
isinstancerA   r   r
   r   )rH   action_contentr   r   parent_item_gettersparent_items         r&   rb   &YoutubeLiveChatFD.parse_live_timestamp   s    !^` .$//1A(BC$%%D 	#
 	 (D))S#
 hTB . H h--8<<8$??r)   r4   N)	__name__
__module____qualname____firstlineno____doc__r   staticmethodrb   __static_attributes__r4   r)   r&   r   r      s"    =m:^ !@ !@r)   r   )r>   rd   fragmentr   networking.exceptionsr   utilsr   r   r	   r
   r   utils.networkingr   r   r4   r)   r&   <module>r      s0        -  .T@
 T@r)   