U
    Mf                     @   s   d dl Z d dlZd dlZddlmZ ddlmZ ddlmZ ddl	m
Z
 ddlmZmZmZ G d	d
 d
eZG dd deZdS )    N   )get_suitable_downloader)FileDownloader)FFmpegFD   )Request)DownloadErrorstr_or_nonetry_getc                   @   s   e Zd ZdZdd ZdS )NiconicoDmcFDz4 Downloading niconico douga from DMC with heartbeat c           
         s6  ddl m} dj d |j}||\}}t|jdjj}d } d gt	 |d }|d 
 }	|d	d
t||	 fdd|d   djf  zB  t|jdkr|||d |d d  |||}W 5 r0 d   d W 5 Q R X X |S )Nr   )
NiconicoIE[z] Downloading from DMC)paramsFurldatainterval   c                	      sr   zj   W n( tk
r<   dj d Y nX &  sdtd< d   W 5 Q R X d S )Nr   z] Heartbeat failedr   )	ydlurlopenread	Exception	to_screenFD_NAME	threadingTimerstart Zdownload_complete	heartbeatZheartbeat_intervalZheartbeat_lockrequestselfZtimerr   >/tmp/pip-unpacked-wheel-zk9bgjdq/yt_dlp/downloader/niconico.pyr   !   s    z.NiconicoDmcFD.real_download.<locals>.heartbeatpingz*[%s] Heartbeat with %d second interval ...r   TZHlsFDid)Zextractor.niconicor   r   r   r   Z_get_heartbeat_infor   r   r   Lockencodegetr   canceltype__name__updateZ_extract_m3u8_formatsreal_download)
r    filename	info_dictr   ZieZheartbeat_info_dictfdsuccessZheartbeat_urlZheartbeat_datar   r   r!   r+      s2    


zNiconicoDmcFD.real_downloadNr)   
__module____qualname____doc__r+   r   r   r   r!   r      s   r   c                   @   s   e Zd ZdZdd ZdS )NiconicoLiveFDz/ Downloads niconico live without being stopped c                    s   |d |d |d |d | dd| ddtjjpFi }| }|dd	i fd
d  fdd}tj|dd}|  |	||S )Nvideo_idr   wsoriginlive_qualityhighlive_latencyprotocolZm3u8c              
      s|  | rlj tdd id}j jddr<d |tdd dd	d
ddddd n}|  |	 }|sqxt
|}|rxt|tsqx|ddkr|d |d qx|ddkr| W 5 Q R  dS |ddkr.| t|dd tp|}t|W  5 Q R  S j jddrxt|dkr\|d d d }d|  qxW 5 Q R X d S )NZOriginzhttps://)headersverboseFz%[debug] Sending startWatching requestZstartWatchingzhls+fmp4)Zqualityr;   ZlatencyZ	chasePlayZ	webSocketT)r;   Zcommentable)streamroom	reconnect)r(   r   r(   r"   z{"type":"pong"}z{"type":"keepSeat"}Z
disconnecterrorc                 S   s   | d d S )Nbodycoder   )xr   r   r!   <lambda>t       zFNiconicoLiveFD.real_download.<locals>.communicate_ws.<locals>.<lambda>d   z...z[debug] Server said: )r   r   r   r   r&   r   sendjsondumpsrecvloads
isinstancedictZwrite_debugr
   strr   len)r@   r6   rK   r   message)r:   r8   r    ws_extractorws_origin_hostws_urlr   r!   communicate_wsL   sN    




z4NiconicoLiveFD.real_download.<locals>.communicate_wsc                     s   d} ztz | }|dkr"W W \d S W nP t k
rt } z2ddt| td W Y 
W qW 5 d }~X Y nX W 5 d} X qd S )NFTzD[{}] {}: Connection error occured, reconnecting after 10 seconds: {}zniconico:live
   )BaseExceptionr   formatr	   timesleep)r@   rete)rU   r    r5   r   r!   ws_main{   s    
"z-NiconicoLiveFD.real_download.<locals>.ws_mainT)targetdaemon)
r&   r   r   r   copyr*   r   Threadr   download)r    r,   r-   dlZnew_info_dictr]   threadr   )rU   r:   r8   r    r5   rR   rS   rT   r!   r+   >   s"     /zNiconicoLiveFD.real_downloadNr0   r   r   r   r!   r4   ;   s   r4   )rI   r   rY    r   commonr   Zexternalr   Z
networkingr   utilsr   r	   r
   r   r4   r   r   r   r!   <module>   s   /