
    yfy*                     j    d dl Z d dlZddlmZ ddlmZ ddlmZmZm	Z	m
Z
mZ ddlmZ  G d d	e      Zy)
    N   )
FragmentFD   )	HTTPError)RegexNotFoundErrorRetryManagerdict_getint_or_nonetry_get)HTTPHeaderDictc                   &    e Zd ZdZd Zed        Zy)YoutubeLiveChatFDz3 Downloads YouTube live chats fragment by fragment c           
      ^    d    j                  d j                  z          j                  j                  d      sd   dk(  r j	                  d        j                  j                  dd      }|d	d d
ddlm}  | j                        t        t        j                         dz        d. fd	 fd fdd fdd. f	d	} j                          d         }|sy j                        }	 j                  |j                  dd            }t        |d       }	 j!                  d       j#                  |j                  dd            }
|
syt        |
d       }t        |
d       }|r|syt        |d t$              }d   dk(  rd|z   }d|	z   }nd   dk(  r
d|z   }d |	z   }dx}}d }|	|d!z  }||	d"}|d!kD  rd#t%        t'        |d$z
  d            i|d%<   |r
d&|i|d'   d(<   j)                  |
|)      }|j+                  d*d+i       t-        j.                  |d,      j1                         d-z   } ||||      \  }}	}}n ||      \  }}	}}|sy|rn|	 j3                        S # t        $ r Y yw xY w)/Nvideo_idz[%s] 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                 d    t        j                  d      |      }j                  | ||      S )Nhttp_headers)r   get_download_fragment)urldataheadersr   ctx	info_dictselfs       E/usr/lib/python3/dist-packages/yt_dlp/downloader/youtube_live_chat.pydl_fragmentz4YoutubeLiveChatFD.real_download.<locals>.dl_fragment(   s1    ))--*GQL**3YdSS    c                    d x}x}}t               }| j                  dg       D ]P  }d|v r|d   }t        |d         }|j                  t	        j
                  |d      j                         dz          R |6t        | d t              }|r"|j                  d      }|j                  d	      }	j                  |       |||fS )
NactionsreplayChatItemActionvideoOffsetTimeMsecFensure_ascii   
c                     | d   d   d   S )Ncontinuationsr   liveChatReplayContinuationData xs    r$   <lambda>zOYoutubeLiveChatFD.real_download.<locals>.parse_actions_replay.<locals>.<lambda>8   s    a034TU r&   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_actionr5   r!   r#   s
           r$   parse_actions_replayz=YoutubeLiveChatFD.real_download.<locals>.parse_actions_replay,   s    ?CCFC_'<!*044YC M)V3.45K.L+ !89N!OPF"))JJvE:AACeKM	M !&*UW[ ]  &2&6&6~&FO,8,<,<=R,S)!!#'9:"F,AAAr&   c                     t        | d t              }|r;j                  d       |j                  d      }d}|j                  d      }|||fS  |       S )Nc                 6    | d   d   d   d   d   d   d   d   S )	NheaderliveChatHeaderRendererviewSelectorsortFilterSubMenuRenderersubMenuItemsr   r5   reloadContinuationDatar1   r2   s    r$   r4   zWYoutubeLiveChatFD.real_download.<locals>.try_refresh_replay_beginning.<locals>.<lambda>C   sA    !H+&>?OPklm{|}~  AO  P  Qi  j r&   r&   r5   r   trackingParams)r   r=   r>   r   )r?   refresh_continuationrefresh_continuation_idr@   rB   r!   rF   r#   s        r$   try_refresh_replay_beginningzEYoutubeLiveChatFD.real_download.<locals>.try_refresh_replay_beginning?   sv    #*& j  lp$q  $%%c3/*>*B*B>*R'(<(@(@AQ(R%.8MMM'(>??r&   r   c                    d x}}t               }| j                  dg       D ]c  }j                  |      }||z
  d|git              dd}|j	                  t        j                  |d      j                         dz          e d d g}t        | |t              }|rV|j                  d	      }|j                  d
      }t        |j                  d            }	|	t        j                  |	dz         j                  
|       ||fS )Nr(   T)r)   r*   isLiveFr+   r-   c                     | d   d   d   S )Nr/   r   invalidationContinuationDatar1   r2   s    r$   r4   zMYoutubeLiveChatFD.real_download.<locals>.parse_actions_live.<locals>.<lambda>`   s    !O,Q/0NO r&   c                     | d   d   d   S )Nr/   r   timedContinuationDatar1   r2   s    r$   r4   zMYoutubeLiveChatFD.real_download.<locals>.parse_actions_live.<locals>.<lambda>a   s    !O,Q/0GH r&   r5   r6   	timeoutMsr   )r7   r   parse_live_timestampstrr9   r:   r;   r<   r   r=   r
   timesleepr>   )r?   rA   rB   rC   rD   	timestamppseudo_actioncontinuation_data_getterscontinuation_data
timeout_msr!   live_offsetr#   
start_times             r$   parse_actions_livez;YoutubeLiveChatFD.real_download.<locals>.parse_actions_liveO   s5   6::O3!*044YC T 55f=	("+j"8K .7,A+.{+;"!
 #))JJ}5AHHJURTT PH)% !((>@Y[_ ` "3"7"7"G(9(=(=>S(T%():)>)>{)KL
)JJzD01!!#'9:"K1FFFr&   c                   	 t        j                  j                  d      j                  |      D ]  }	  | ||      }|s yj	                        }	 j                  |j                  dd            }|st        j                  |      }t        |d t              xs i }d   dk(  xr xs |d	k(  xr xs }	d
g |	|      c S  y# t        $ r d }Y ew xY w# t        $ r}
|
|_        Y d }
~
d }
~
ww xY w)Nfragment_retries)
frag_index)FNNNutf-8replacec                     | d   d   S )NcontinuationContentsliveChatContinuationr1   r2   s    r$   r4   zVYoutubeLiveChatFD.real_download.<locals>.download_and_parse_fragment.<locals>.<lambda>|   s    !$:";<R"S r&   r   r   r   T)r   paramsr   report_retry_read_fragmentextract_yt_initial_datadecoder   r:   loadsr   r=   r   error)r   rh   request_datar    retrysuccessraw_fragmentr   r?   funcerrr!   r%   ier"   re   rF   r#   rR   r   s              r$   download_and_parse_fragmentzDYoutubeLiveChatFD.real_download.<locals>.download_and_parse_fragmentm   s3   %dkkoo6H&I4K\K\ist )#|WEG"6#'#6#6s#;L$!99(LDWDWX_ajDkl  #zz,7-4SUY.[ .a^` + &j15HH_M_ 4)QO3O43  !@4(>#?@@'. + . $#$ ! "%EKsB   C"C""C9AC"CC"CC""	C<+C77C<r   ri   rj   c                 6    | d   d   d   d   d   d   d   d   S )	NcontentstwoColumnWatchNextResultsconversationBarliveChatRendererr/   r   rN   r5   r1   r2   s    r$   r4   z1YoutubeLiveChatFD.real_download.<locals>.<lambda>   sB    a
m$?@ARSTfghwxyz{  }U  V  We  f r&   r&   c                     | d   S )NINNERTUBE_API_KEYr1   r2   s    r$   r4   z1YoutubeLiveChatFD.real_download.<locals>.<lambda>   s    1-@+A r&   c                     | d   S )NINNERTUBE_CONTEXTr1   r2   s    r$   r4   z1YoutubeLiveChatFD.real_download.<locals>.<lambda>   s    Q7J5K r&   c                     | d   d   S )NclientvisitorDatar1   r2   s    r$   r4   z1YoutubeLiveChatFD.real_download.<locals>.<lambda>   s    AhK<V r&   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   )contextr5   playerOffsetMsi  currentPlayerStater6   r   clickTracking)ytcfgvisitor_datazcontent-typezapplication/jsonr+   r-   )NN)	to_screenFD_NAMErn   r   report_warningextractor.youtuber   ydlr8   r\    _prepare_and_start_frag_downloadrp   rq   rr   r   r   r>   extract_ytcfgr[   maxgenerate_api_headersupdater:   r;   r<   _finish_frag_download)r#   r   r"   r   r   r|   rw   rx   r   rA   r   api_keyinnertube_contextr   r   chat_page_urlrh   r@   rB   ru   r    fragment_request_datar!   r%   r{   rc   re   rF   rd   rR   r   s   ` `                   @@@@@@@@@r$   real_downloadzYoutubeLiveChatFD.real_download   s*   Z(3dllBC{{/Ij4IM`4` !s t {{vu- !
 	A%dhh/t+,
	T	B&	@ 	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L1Y0BCD(,

<e(T([([(]`e(e%Je%:GKEG&2G Kf!:K/G&2G+ ). ))#y99c " 		s   "J   	J,+J,c                 b   t        | g d      }t        |t              sy t        |ddg      }t        |t              sy t        |g d      }t        |t              sy d d g}t        ||t              }|rt        |g d      }t        |t              sy t	        |j                  d      d	      S )
N)addChatItemActionaddLiveChatTickerItemActionaddBannerToLiveChatCommanditembannerRenderer)liveChatTextMessageRendererliveChatPaidMessageRendererliveChatMembershipItemRendererliveChatPaidStickerRenderer%liveChatTickerPaidMessageItemRenderer!liveChatTickerSponsorItemRendererliveChatBannerRendererc                     | d   d   d   S )NshowItemEndpointshowLiveChatItemEndpointrendererr1   r2   s    r$   r4   z8YoutubeLiveChatFD.parse_live_timestamp.<locals>.<lambda>   s    a*+,FG
S r&   c                     | d   S )Nr~   r1   r2   s    r$   r4   z8YoutubeLiveChatFD.parse_live_timestamp.<locals>.<lambda>   s
    a
m r&   )r   r   r   r   timestampUsecr   )r	   
isinstancer=   r   r
   r   )rD   action_contentr   r   parent_item_gettersparent_items         r$   rZ   z&YoutubeLiveChatFD.parse_live_timestamp   s    !^` .$/1A(BC$%D 	#
 	 (D)S#
 h(;TB . H h-8<<8$??r&   N)__name__
__module____qualname____doc__r   staticmethodrZ   r1   r&   r$   r   r      s"    =m:^ !@ !@r&   r   )r:   r\   fragmentr   networking.exceptionsr   utilsr   r   r	   r
   r   utils.networkingr   r   r1   r&   r$   <module>r      s0        -  .T@
 T@r&   