
    VGh{*                     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                   d        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)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                 d    t        j                  d      |      }j                  | ||      S )Nhttp_headers)r   get_download_fragment)urldataheadersr   ctx	info_dictselfs       l/var/www/it7/html/youtubeDownloader/venv/lib/python3.12/site-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_actionr6   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   r6   reloadContinuationDatar2   r3   s    r%   r5   zWYoutubeLiveChatFD.real_download.<locals>.try_refresh_replay_beginning.<locals>.<lambda>C   sA    !H+&>?OPklm{|}~  AO  P  Qi  j r'   r'   r6   r   trackingParams)r   r>   r?   r   )r@   refresh_continuationrefresh_continuation_idrA   rC   r"   rG   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 )Nr0   r   invalidationContinuationDatar2   r3   s    r%   r5   zMYoutubeLiveChatFD.real_download.<locals>.parse_actions_live.<locals>.<lambda>`   s    !O,Q/0NO r'   c                     | d   d   d   S )Nr0   r   timedContinuationDatar2   r3   s    r%   r5   zMYoutubeLiveChatFD.real_download.<locals>.parse_actions_live.<locals>.<lambda>a   s    !O,Q/0GH r'   r6   r7   	timeoutMsr   )r8   r   parse_live_timestampstrr:   r;   r<   r=   r   r>   r
   timesleepr?   )r@   rB   rC   rD   rE   	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liveChatContinuationr2   r3   s    r%   r5   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   ri   request_datar!   retrysuccessraw_fragmentr    r@   funcerrr"   r&   ier#   rf   rG   r$   rS   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^` + 'z26II`N` 4 *a P4P43  !@4(>#?@@'. + . $#$ ! "%EKsB   C"C""C9AC"CC"CC""	C<+C77C<r   rj   rk   c                 6    | d   d   d   d   d   d   d   d   S )	NcontentstwoColumnWatchNextResultsconversationBarliveChatRendererr0   r   rO   r6   r2   r3   s    r%   r5   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_KEYr2   r3   s    r%   r5   z1YoutubeLiveChatFD.real_download.<locals>.<lambda>   s    1-@+A r'   c                     | d   S )NINNERTUBE_CONTEXTr2   r3   s    r%   r5   z1YoutubeLiveChatFD.real_download.<locals>.<lambda>   s    Q7J5K r'   c                     | d   d   S )NclientvisitorDatar2   r3   s    r%   r5   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   )contextr6   playerOffsetMsi  currentPlayerStater7   r   clickTracking)ytcfgvisitor_datazcontent-typezapplication/jsonr,   r.   )NN)	to_screenFD_NAMEro   r   report_warningextractor.youtuber   ydlr9   r]    _prepare_and_start_frag_downloadrq   rr   rs   r   r   r?   extract_ytcfgr\   maxgenerate_api_headersupdater;   r<   r=   _finish_frag_download)r$   r   r#   r   r   r}   rx   ry   r    rB   r   api_keyinnertube_contextr   r   chat_page_urlri   rA   rC   rv   r!   fragment_request_datar"   r&   r|   rd   rf   rG   re   rS   r   s   ` `                   @@@@@@@@@r%   real_downloadzYoutubeLiveChatFD.real_download   s.   Z(4<<.(?@A{{/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rendererr2   r3   s    r%   r5   z8YoutubeLiveChatFD.parse_live_timestamp.<locals>.<lambda>   s    a*+,FG
S r'   c                     | d   S )Nr   r2   r3   s    r%   r5   z8YoutubeLiveChatFD.parse_live_timestamp.<locals>.<lambda>   s
    a
m r'   )r   r   r   r   timestampUsecr   )r	   
isinstancer>   r   r
   r   )rE   action_contentr   r   parent_item_gettersparent_items         r%   r[   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   staticmethodr[   r2   r'   r%   r   r      s"    =m:^ !@ !@r'   r   )r;   r]   fragmentr   networking.exceptionsr   utilsr   r   r	   r
   r   utils.networkingr   r   r2   r'   r%   <module>r      s0        -  .T@
 T@r'   