U
    g)                     @   s   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mZ ddl	m
Z
 ddlmZ ddlmZmZmZmZmZmZmZ erd d	lmZmZ d d
lmZ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   )PostProcessor)FFmpegPostProcessorFFmpegThumbnailsConvertorPP   )imghdr)mutagen)PopenPostProcessingErrorcheck_executableencodeArgumentencodeFilenameprepend_extensionshell_quote)FLACPicture)MP4MP4Cover)OggOpus)	OggVorbisc                   @   s   e Zd ZdS )EmbedThumbnailPPErrorN)__name__
__module____qualname__ r   r   G/tmp/pip-unpacked-wheel-q5ljy6pj/yt_dlp/postprocessor/embedthumbnail.pyr      s   r   c                   @   s:   e Zd ZdddZdd Zdd Zejdd	d
d ZdS )EmbedThumbnailPPNFc                 C   s   t | | || _d S )N)r   __init___already_have_thumbnail)self
downloaderZalready_have_thumbnailr   r   r   r   !   s    zEmbedThumbnailPP.__init__c              
      s    fdd}z8d}| j |d dgdd}t||}|d krB| W S W n< tk
r } z| d|  |  W Y S d }~X Y nX t|dt|d	fS )
Nc                     s*     d  d } }| r&|r&| |fS d S )Nwidthheightget)r!   r"   thumbnail_dictr   r   guess&   s    z9EmbedThumbnailPP._get_thumbnail_resolution.<locals>.guessz!,\s*(?P<w>\d+)x(?P<h>\d+)\s*[,\[]z-hide_banner)r   )Zexpected_retcodesz)unable to find the thumbnail resolution; wh)
run_ffmpegresearchr
   report_warningintgroup)r   filenamer&   r'   Z
size_regexZsize_resultZmobjerrr   r%   r   _get_thumbnail_resolution%   s    z*EmbedThumbnailPP._get_thumbnail_resolutionc                 C   s   |  | d| d d S )Nz: Adding thumbnail to "")	to_screen)r   Zexer0   r   r   r   _report_run6   s    zEmbedThumbnailPP._report_run)Zimagesc                 C   sL  |d }t |d}|ds.| d g |fS tdd t|d d d d dD d }|d krp| d	 g |fS |d | d }tjt|s| 	d
 g |fS t
| j}||| |d | d  }}tj|d dd  }|d dkr|dkr||d}d}tt|j}	d}
|d dkrpddddddddddddddg}| d| | ||g|| nn|d dkr&t|  }d|dd  }| |d!|\}}|d k	r|dd"| g |d8 }|d#| |d$| d%| d$| d&| g | d| | ||| n|d d'krd(| d)g k}trP|rVd*}
n| d+| tjtjd,}zt|d-}|  }W 5 Q R X t!j"|d.}|st#d/n||krt#d0| t$|}t||| d1g|j%d2< |&  |}W n8 t'k
r* } z| 	d3|  d*}
W 5 d }~X Y nX |
s0d}
td4d d5D d }|d krd| d6 d*}
n|st| d7 t|dt|dt(d8t|dt(d9t|dg}|d:d; | )d<D 7 }| d=| | *d>t+|  t,j-|dt.j/t.j/d?\}}}|r| 	d@|0   d*}
ndA|kr0| 	dB d*}
|
sd}
zz|  dP}| |dCd\}}|d k	r|dd"| g |d8 }|dD| dEg | d| | ||g|| W n6 t1k
r } zd*}
t2dF| W 5 d }~X Y nX n|d dGkrts
t2dH| d+| t3t4t5dI|d  |}t6 }dt!"| |_7t|d-}|  |_8W 5 Q R X dJ|_9| :||d | }|d k	r|\|_;|_<|d dKkr|=| nt>?|@ AdL|dM< |&  |}nt2dN|
r||krt|| | B||	|	 ||k}| jC|s"| jDs&|nd |r:| jDs:|nd |dO g |fS )QNfilepathtempZ
thumbnailsz$There aren't any thumbnails to embedc                 s   s"   | ]\}}| d r| V  qdS )r6   Nr#   ).0itr   r   r   	<genexpr>B   s     
 z'EmbedThumbnailPP.run.<locals>.<genexpr>r   zThere are no thumbnails on diskz=Skipping embedding the thumbnail because the file is missing.ext)ZmkvZmka)jpgjpegpngr@   TZmp3z-ccopy-mapz0:0z1:0z-write_id3v11z-id3v2_version3z-metadata:s:vztitle="Album cover"zcomment=Cover (front)ffmpegzimage/r>   r?   )tagsmimetypez-0:z-attachz-metadata:s:z	mimetype=zfilename=cover.)Zm4aZmp4Zm4vZmovzembed-thumbnail-atomicparsleyZcompat_optsFr   )r?   r@   rb)r)   zcould not determine image typezincompatible image type: )dataZimageformatZcovrzunable to embed using mutagen; c                 s   s   | ]}t |d gr|V  qdS )z-vN)r   )r8   xr   r   r   r;      s   )AtomicParsleyatomicparsleyzlibatomicparsley.sozCNeither mutagen nor AtomicParsley was found. Falling back to ffmpegz4mutagen was not found. Falling back to AtomicParsleyz	--artworkz-oc                 S   s   g | ]}t |qS r   )r   )r8   or   r   r   
<listcomp>   s     z(EmbedThumbnailPP.run.<locals>.<listcomp>rK   rL   zAtomicParsley command line: )textstdoutstderrz0Unable to embed thumbnails using AtomicParsley; z
No changesz5The file format doesn't support embedding a thumbnail)dispositionattached_picz-disposition:rS   z(Unable to embed using ffprobe & ffmpeg; )oggopusflaczSmodule mutagen was not found. Please install using `python3 -m pip install mutagen`)rU   rV   rT      rV   asciiZMETADATA_BLOCK_PICTUREz]Supported filetypes for thumbnail embedding are: mp3, mkv/mka, ogg/opus/flac, m4a/mp4/m4v/mov)info)rB   rC   )Er   r$   r4   next	enumerateospathexistsr   r-   r   Z_downloaderZ
fixup_webpsplitextZconvert_thumbnailstatst_mtimer5   Zrun_ffmpeg_multiple_fileslistZstream_copy_optsreplaceZget_stream_numberextendZ_ffmpeg_filename_argumentr*   	get_paramr   r   ZFORMAT_JPEGZ
FORMAT_PNGopenreadr   what
ValueErrorr   rF   save	Exceptionr   Z_configuration_argsZwrite_debugr   r	   run
subprocessPIPEstripr
   r   r   r   r   r   mimerI   typer2   r!   r"   Zadd_picturebase64	b64encodewritedecodeZ	try_utimeZ_delete_downloaded_filesr   )r   rY   r0   Ztemp_filenameidxZthumbnail_filenameZ	convertorZoriginal_thumbnailZthumbnail_extmtimesuccessoptionsrG   Z
old_streamZ
new_streamZprefer_atomicparsleyfZ	thumbfileZ
thumb_datatype_metar1   rL   cmdrP   rQ   
returncodeZpicresZ	convertedr   r   r   rl   9   s<   


(


              
   






  
"
zEmbedThumbnailPP.run)NF)	r   r   r   r   r2   r5   r   Z_restrict_torl   r   r   r   r   r      s
   

r   )!rr   r\   r+   rm   commonr   rE   r   r   compatr   Zdependenciesr   utilsr	   r
   r   r   r   r   r   Zmutagen.flacr   r   Zmutagen.mp4r   r   Zmutagen.oggopusr   Zmutagen.oggvorbisr   r   r   r   r   r   r   <module>   s   $
