o
    i{*                     @   sd   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	 d	eZdS )
    N   )
FragmentFD   )	HTTPError)RegexNotFoundErrorRetryManagerdict_getint_or_nonetry_get)HTTPHeaderDictc                   @   s$   e Zd ZdZdd Zedd ZdS )YoutubeLiveChatFDz3 Downloads YouTube live chats fragment by fragment c              
      s  d 
 dj d jdsd dkrd jdd	}|d
d d ddlm} |jtt		 d d5 fdd	 fdd fdd	d fddd5 	
f	dd	}
  d }|sd	S  }z
|dd}W n
 ty   Y d	S w t|dd }	 d 
|dd}
|
sd	S t|
d d }t|
d!d }|r|sd	S t|d"d t}d d#krd$| }d%|	 }nd dkrd&| }d'|	 }d }}d }|	d ur]|d(7 }||	d)}|d(krGd*tt|d+ di|d,< |r"d-|i|d. d/< j|
|d0}|d1d2i tj|d	d3 d4 }|||||\}}	}}n	|||\}}	}}|sUd	S |rYn|	d us S )6N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                    s"   t d|} | ||S )Nhttp_headers)r   get_download_fragment)urldataheadersr   )ctx	info_dictself W/home/ubuntu/.local/lib/python3.10/site-packages/yt_dlp/downloader/youtube_live_chat.pydl_fragment(   s   z4YoutubeLiveChatFD.real_download.<locals>.dl_fragmentc                    s   d  } }}t  }| dg D ]}d|v r|d }t|d }|tj|dd d  q|d urFt| dd t}|rF|d	}|d
}	 | |||fS )NactionsreplayChatItemActionvideoOffsetTimeMsecFensure_ascii   
c                 S      | d d d S )Ncontinuationsr   liveChatReplayContinuationDatar!   xr!   r!   r"   <lambda>8       zOYoutubeLiveChatFD.real_download.<locals>.parse_actions_replay.<locals>.<lambda>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_actionr1   )r   r    r!   r"   parse_actions_replay,   s&   


z=YoutubeLiveChatFD.real_download.<locals>.parse_actions_replayc                    sJ   t | dd t}|r! d |d}d}|d}|||fS | S )Nc                 S   $   | d d d d d d d d S )	NheaderliveChatHeaderRendererviewSelectorsortFilterSubMenuRenderersubMenuItemsr   r1   reloadContinuationDatar!   r-   r!   r!   r"   r/   C      $ zWYoutubeLiveChatFD.real_download.<locals>.try_refresh_replay_beginning.<locals>.<lambda>    r1   r   trackingParams)r
   r9   r:   r   )r;   refresh_continuationrefresh_continuation_idr<   r>   )r   rB   r    r!   r"   try_refresh_replay_beginning?   s   


zEYoutubeLiveChatFD.real_download.<locals>.try_refresh_replay_beginningr   c           
         s   d  }}t  }| dg D ](}|}|d ur| d|gitdd}|tj|dd d  qdd d	d g}t| |t	}|rb|d
}|d}t
|d}	|	d urbt|	d   | ||fS )Nr$   T)r%   r&   isLiveFr'   r)   c                 S   r*   )Nr+   r   invalidationContinuationDatar!   r-   r!   r!   r"   r/   `   r0   zMYoutubeLiveChatFD.real_download.<locals>.parse_actions_live.<locals>.<lambda>c                 S   r*   )Nr+   r   timedContinuationDatar!   r-   r!   r!   r"   r/   a   r0   r1   r2   	timeoutMsr   )r3   r   parse_live_timestampstrr5   r6   r7   r8   r
   r9   r	   timesleepr:   )
r;   r=   r>   r?   r@   	timestamppseudo_actioncontinuation_data_getterscontinuation_data
timeout_ms)r   live_offsetr    
start_timer!   r"   parse_actions_liveO   s2   



z;YoutubeLiveChatFD.real_download.<locals>.parse_actions_livec                    s   t jdj|dD ]l}zU| ||}|sW  dS  }z|dd}W n ty7   d }Y nw |s?t	|}t
|dd tpHi }d d	krQpX|d
koVpX}	dg|	|R W   S  tyx }
 z	|
|_W Y d }
~
qd }
~
ww dS )Nfragment_retries)
frag_index)FNNNutf-8replacec                 S      | d d S )NcontinuationContentsliveChatContinuationr!   r-   r!   r!   r"   r/   |       zVYoutubeLiveChatFD.real_download.<locals>.download_and_parse_fragment.<locals>.<lambda>r   r   r   T)r   paramsr   report_retry_read_fragmentextract_yt_initial_datadecoder   r6   loadsr
   r9   r   error)r   ra   request_datar   retrysuccessraw_fragmentr   r;   funcerr)	r   r#   ier   r_   rB   r    rO   r   r!   r"   download_and_parse_fragmentm   s>   


zDYoutubeLiveChatFD.real_download.<locals>.download_and_parse_fragmentr   rb   rc   c                 S   rC   )	NcontentstwoColumnWatchNextResultsconversationBarliveChatRendererr+   r   rI   r1   r!   r-   r!   r!   r"   r/      rJ   z1YoutubeLiveChatFD.real_download.<locals>.<lambda>rK   c                 S      | d S )NINNERTUBE_API_KEYr!   r-   r!   r!   r"   r/          c                 S   r{   )NINNERTUBE_CONTEXTr!   r-   r!   r!   r"   r/      r}   c                 S   rd   )NclientvisitorDatar!   r-   r!   r!   r"   r/      rg   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   )contextr1   playerOffsetMsi  currentPlayerStater2   r   clickTracking)ytcfgvisitor_datazcontent-typezapplication/jsonr'   r)   )NN)	to_screenFD_NAMErh   r   report_warningextractor.youtuber   ydlr4   rV    _prepare_and_start_frag_downloadrj   rk   rl   r   r
   r:   extract_ytcfgrU   maxgenerate_api_headersupdater6   r7   r8   _finish_frag_download)r    r   r   r   r   rv   rq   rr   r   r=   r   api_keyinnertube_contextr   r   chat_page_urlra   r<   r>   ro   r   fragment_request_datar!   )r   r#   ru   r   r]   r_   rB   r    r^   rO   r   r"   real_download   s   





zYoutubeLiveChatFD.real_downloadc                 C   s   t | g d}t|tsd S t |ddg}t|tsd S t |g d}t|ts*d S dd dd g}t||t}|rHt |g d}t|tsHd S t|d	d
S )N)addChatItemActionaddLiveChatTickerItemActionaddBannerToLiveChatCommanditembannerRenderer)liveChatTextMessageRendererliveChatPaidMessageRendererliveChatMembershipItemRendererliveChatPaidStickerRenderer%liveChatTickerPaidMessageItemRenderer!liveChatTickerSponsorItemRendererliveChatBannerRendererc                 S   r*   )NshowItemEndpointshowLiveChatItemEndpointrendererr!   r-   r!   r!   r"   r/      r0   z8YoutubeLiveChatFD.parse_live_timestamp.<locals>.<lambda>c                 S   r{   )Nrw   r!   r-   r!   r!   r"   r/      r}   )r   r   r   r   timestampUsecr   )r   
isinstancer9   r
   r	   r   )r@   action_contentr   r   parent_item_gettersparent_itemr!   r!   r"   rT      s*   




z&YoutubeLiveChatFD.parse_live_timestampN)__name__
__module____qualname____doc__r   staticmethodrT   r!   r!   r!   r"   r      s     0r   )r6   rV   fragmentr   networking.exceptionsr   utilsr   r   r   r	   r
   utils.networkingr   r   r!   r!   r!   r"   <module>   s    