U
    g                     @   sp   d dl Z d dlZ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
 G dd deZG d	d
 d
eZdS )    N   )FileDownloader)FFmpegFD   )
websocketsc                   @   s    e Zd ZdZdd Zdd ZdS )FFmpegSinkFDz8 A sink to ffmpeg for downloading fragments in any form c                    sL     }d|d< fdd G  fdddt}|jjp@i ||S )N-urlc                    sp   z0z
| I d H  W n tk
r,   Y nX W 5 t t |  |  W 5 Q R X tt tj	 X d S N)
contextlibsuppressOSErrorflushcloseoskillgetpidsignalSIGINTreal_connection)procstdin)	info_dictself ?/tmp/pip-unpacked-wheel-q5ljy6pj/yt_dlp/downloader/websocket.py	call_conn   s    
z-FFmpegSinkFD.real_download.<locals>.call_connc                       s$   e Zd Zedd Z fddZdS )z1FFmpegSinkFD.real_download.<locals>.FFmpegStdinFDc                 S   s   t  S r
   )r   get_basename)clsr   r   r   r      s    z>FFmpegSinkFD.real_download.<locals>.FFmpegStdinFD.get_basenamec                    s&   t jtjd ||fd}|  d S )NT)targetdaemonargs)	threadingThreadasynciorunstart)r   r   r   threadr   r   r   on_process_started#   s    zDFFmpegSinkFD.real_download.<locals>.FFmpegStdinFD.on_process_startedN)__name__
__module____qualname__classmethodr   r)   r   r(   r   r   FFmpegStdinFD   s   
r.   )copyr   Zydlparamsdownload)r   filenamer   Z	info_copyr.   r   )r   r   r   r   real_download   s
    	zFFmpegSinkFD.real_downloadc                    s   t ddS )z Override this in subclasses z-This method must be implemented by subclassesN)NotImplementedError)r   sinkr   r   r   r   r   )   s    zFFmpegSinkFD.real_connectionN)r*   r+   r,   __doc__r3   r   r   r   r   r   r      s   r   c                   @   s   e Zd Zdd ZdS )WebSocketFragmentFDc              
      sf   t j|d |di d4 I d H 4}| I d H }t|trF|d}|| q$W 5 Q I d H R X d S )Nr	   Zhttp_headers)extra_headersutf8)r   connectgetrecv
isinstancestrencodewrite)r   r5   r   wsr<   r   r   r   r   /   s
    $

z#WebSocketFragmentFD.real_connectionN)r*   r+   r,   r   r   r   r   r   r7   .   s   r7   )r$   r   r   r   r"   commonr   Zexternalr   Zdependenciesr   r   r7   r   r   r   r   <module>   s   "