U
    gw*                     @   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d6 	
f	dd	}
  d }|sd	S  }z
|dd}W n tk
r>   Y d	S X t|dd }	 d 
|dd}
|
sxd	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 k	r|d(7 }||	d)}|d(krd*tt|d+ di|d,< |rTd-|i|d. d/< j|
|d0}|d1d2i tj|d	d3 d4 }|||||\}}	}}n|||\}}	}}|sd	S |rqȐq S )7Nvideo_id[z] Downloading live chatZ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)filenameZliveZtotal_fragsr   )YoutubeBaseInfoExtractor  c                    s"   t d|} | ||S )Nhttp_headers)r   getZ_download_fragment)urldataheadersr   )ctx	info_dictself G/tmp/pip-unpacked-wheel-q5ljy6pj/yt_dlp/downloader/youtube_live_chat.pydl_fragment(   s    z4YoutubeLiveChatFD.real_download.<locals>.dl_fragmentc                    s   d  } }}t  }| dg D ]<}d|kr>|d }t|d }|tj|dd d  q|d k	rt| dd t}|r|d	}|d
}	 | |||fS )NactionsreplayChatItemActionvideoOffsetTimeMsecFensure_ascii   
c                 S   s   | d d d S )Ncontinuationsr   Z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actionZreplay_chat_item_actionr+   )r   r   r   r   parse_actions_replay,   s(     

z=YoutubeLiveChatFD.real_download.<locals>.parse_actions_replayc                    sJ   t | dd t}|rB d |d}d}|d}|||fS | S )Nc                 S   s$   | d d d d d d d d S )	NheaderZliveChatHeaderRendererZviewSelectorZsortFilterSubMenuRendererZsubMenuItemsr   r+   reloadContinuationDatar   r'   r   r   r   r)   C   r*   zWYoutubeLiveChatFD.real_download.<locals>.try_refresh_replay_beginning.<locals>.<lambda>r*   r+   r   ZtrackingParams)r
   r3   r4   r   )r5   Zrefresh_continuationZrefresh_continuation_idr6   r8   )r   r;   r   r   r   try_refresh_replay_beginning?   s     


zEYoutubeLiveChatFD.real_download.<locals>.try_refresh_replay_beginningr   c           
         s   d  }}t  }| dg D ]P}|}|d k	r8| d|gitdd}|tj|dd d  qdd d	d g}t| |t	}|r|d
}|d}t
|d}	|	d k	rt|	d   | ||fS )Nr    T)r!   r"   ZisLiveFr#   r%   c                 S   s   | d d d S )Nr&   r   ZinvalidationContinuationDatar   r'   r   r   r   r)   `   r*   zMYoutubeLiveChatFD.real_download.<locals>.parse_actions_live.<locals>.<lambda>c                 S   s   | d d d S )Nr&   r   ZtimedContinuationDatar   r'   r   r   r   r)   a   r*   r+   r,   Z	timeoutMsr   )r-   r   parse_live_timestampstrr/   r0   r1   r2   r
   r3   r	   timesleepr4   )
r5   r7   r8   r9   r:   	timestampZpseudo_actionZcontinuation_data_gettersZcontinuation_dataZ
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 ]}z| ||}|s6W  dS  }z|dd}W n tk
rp   d }Y nX |st	|}t
|dd tpi }d d	krp|d
krp}	d|	|W   S  tk
r }
 z|
|_W Y qW 5 d }
~
X Y qX qdS )NZfragment_retries)
frag_index)FNNNutf-8replacec                 S   s   | d d S )NZcontinuationContentsZliveChatContinuationr   r'   r   r   r   r)   |   r*   zVYoutubeLiveChatFD.real_download.<locals>.download_and_parse_fragment.<locals>.<lambda>r   r   r   T)T)r   paramsr   Zreport_retry_read_fragmentextract_yt_initial_datadecoder   r0   loadsr
   r3   r   error)r   rG   request_datar   retrysuccessraw_fragmentr   r5   funcerr)	r   r   ier   rF   r;   r   r>   r   r   r   download_and_parse_fragmentm   s:    


 
zDYoutubeLiveChatFD.real_download.<locals>.download_and_parse_fragmentr   rH   rI   c                 S   s$   | d d d d d d d d S )	NcontentsZtwoColumnWatchNextResultsZconversationBarZliveChatRendererr&   r   r=   r+   r   r'   r   r   r   r)      r*   z1YoutubeLiveChatFD.real_download.<locals>.<lambda>r*   c                 S   s   | d S )NZINNERTUBE_API_KEYr   r'   r   r   r   r)      r*   c                 S   s   | d S )NZINNERTUBE_CONTEXTr   r'   r   r   r   r)      r*   c                 S   s   | d d S )NclientZvisitorDatar   r'   r   r   r   r)      r*   Z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   )contextr+   ZplayerOffsetMsi  ZcurrentPlayerStater,   rZ   ZclickTracking)ytcfgvisitor_datazcontent-typezapplication/jsonr#   r%   )NN)NN)Z	to_screenZFD_NAMErJ   r   Zreport_warningZextractor.youtuber   Zydlr.   rA   Z _prepare_and_start_frag_downloadrK   rL   rM   r   r
   r4   Zextract_ytcfgr@   maxZgenerate_api_headersupdater0   r1   r2   Z_finish_frag_download)r   r   r   r   r   rW   rR   rS   r   r7   r[   Zapi_keyZinnertube_contextr\   r   Zchat_page_urlrG   r6   r8   rP   r   Zfragment_request_datar   )r   r   rV   r   rD   rF   r;   r   rE   r>   r   r   real_download   s    





    zYoutubeLiveChatFD.real_downloadc              	   C   s   t | dddg}t|tsd S t |ddg}t|ts:d S t |dddd	d
ddg}t|ts`d S dd dd g}t||t}|rt |dddd	g}t|tsd S t|ddS )NZaddChatItemActionZaddLiveChatTickerItemActionZaddBannerToLiveChatCommanditemZbannerRendererZliveChatTextMessageRendererZliveChatPaidMessageRendererZliveChatMembershipItemRendererZliveChatPaidStickerRendererZ%liveChatTickerPaidMessageItemRendererZ!liveChatTickerSponsorItemRendererZliveChatBannerRendererc                 S   s   | d d d S )NZshowItemEndpointZshowLiveChatItemEndpointrendererr   r'   r   r   r   r)      r*   z8YoutubeLiveChatFD.parse_live_timestamp.<locals>.<lambda>c                 S   s   | d S )NrX   r   r'   r   r   r   r)      r*   ZtimestampUsecr   )r   
isinstancer3   r
   r	   r   )r:   Zaction_contentr`   ra   Zparent_item_gettersZparent_itemr   r   r   r?      sD    

  

  
z&YoutubeLiveChatFD.parse_live_timestampN)__name__
__module____qualname____doc__r_   staticmethodr?   r   r   r   r   r      s
    0r   )r0   rA   fragmentr   Znetworking.exceptionsr   utilsr   r   r   r	   r
   Zutils.networkingr   r   r   r   r   r   <module>   s   