U
    gE                     @   sp   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mZmZ dZdZG d	d
 d
eZdS )    N   )PostProcessor)FFmpegPostProcessorFFmpegSubtitlesConvertorPP)SponsorBlockPP   )PostProcessingError
orderedSetprepend_extensionz"[SponsorBlock]: %(category_names)lc                   @   sh   e Zd ZdeddddZejdddd Zd	d
 Zdd Z	dd Z
dd ZdddZedd ZdS )ModifyChaptersPPNF)sponsorblock_chapter_titleforce_keyframesc                C   sT   t | | t|pg | _t|p"g ttj  | _t|p>g | _|| _	|| _
d S N)r   __init__set_remove_chapters_patternsr   ZNON_SKIPPABLE_CATEGORIESkeys_remove_sponsor_segments_ranges_to_remove_sponsorblock_chapter_title_force_keyframes)self
downloaderZremove_chapters_patternsZremove_sponsor_segmentsZremove_rangesr   r    r   H/tmp/pip-unpacked-wheel-q5ljy6pj/yt_dlp/postprocessor/modify_chapters.pyr      s    zModifyChaptersPP.__init__)Zimagesc                    s    | t|dp g t|dp2g \}}|sJ|sJg |fS |d }|sxd|dpj||d dg}|| \|d< sg |fS |d sd g |fS |d|d d	 d
  }|d< ||dr4||d s	d
  d g |fS |ds*tdn
d | dddd  D   fdd|d dg}|fdd|D  g }|D ]P\}}	t|j}
t|d}t|| t|	| ||
|
 || q||fS )NchaptersZsponsorblock_chaptersfilepathr   durationtitle)
start_timeend_timer   zDYou have requested to remove the entire video, which is not possibler    r   z	Skipping z* since the video appears to be already cutZ__real_downloadzqCannot cut video since the real and expected durations mismatch. Different chapters may have already been removedz&Expected and actual durations mismatchzConcat spec = {}z, c                 s   s,   | ]$}| d d d| dd V  qdS )inpointg        -outpointinfN)get).0cr   r   r   	<genexpr>9   s     z'ModifyChaptersPP.run.<locals>.<genexpr>c                    s   |  |  jo| fS r   )remove_chaptersr   )fileZis_sub)concat_optscutsr   r   r   r*   ;   s    z-ModifyChaptersPP.run.<locals>.remove_chaptersFc                 3   s   | ]} |d V  qdS )TNr   )r'   in_file)r*   r   r   r)   ?   s     Zuncut)Z_fixup_chapters_mark_chapters_to_removecopydeepcopyr&   Z_get_real_video_duration_remove_marked_arrange_sponsorsreport_warningZ_duration_mismatch	to_screenZpp_keyr   Zwrite_debug_make_concat_optsformatjoinextend_get_supported_subsosstatst_mtimer
   replaceZ	try_utimeappend)r   infor   sponsor_chaptersZreal_durationZoriginal_durationZin_out_filesZfiles_to_remover.   out_filemtimeZ
uncut_filer   )r,   r-   r*   r   r   run   sL    

 

 
zModifyChaptersPP.runc                    s   | j rXd}|s| d d}|D ]( t fdd| j D r d d< d}q |rX| d | jrd}|st| d d}|D ]  d	 | jkrxd d< d}qx|r| d
 |dd | jD  ||fS )NTz"Chapter information is unavailableFc                 3   s   | ]}|  d  V  qdS )r   N)search)r'   regexr(   r   r   r)   T   s     z<ModifyChaptersPP._mark_chapters_to_remove.<locals>.<genexpr>removez(There are no chapters matching the regexz'SponsorBlock information is unavailablecategoryz+There are no matching SponsorBlock chaptersc                 s   s,   | ]$\}}||d d ||dfgddV  qdS )Zmanually_removedzManually removedT)r   r    rH   _categoriesrG   Nr   )r'   startendr   r   r   r)   f   s   )r   r4   anyr   r8   r   )r   r   r@   Zwarn_no_chapter_to_remover   rF   r   r/   M   s4    




z)ModifyChaptersPP._mark_chapters_to_removec                 c   sj   | dpi  D ]R}| d}|rtj|s2q|d }|tjkr^| d| d| d q|V  qd S )NZrequested_subtitlesr   extz%Cannot remove chapters from external z subtitles; "z" is now out of sync)r&   valuesr:   pathexistsr   ZSUPPORTED_EXTSr3   )r   r?   subZsub_filerM   r   r   r   r9   p   s    

z$ModifyChaptersPP._get_supported_subsc                    s  g   fdd} fddg fdd}dd t |D }t| t|\}}}|rlt|\}}}|d	 |d
 krd|kr|n|| || }}qZd|krd|krt|d	 |d	 |d	< n<|d	 |d	 k rj|d	 |d
< d|d< t||d
 ||f qZd|krd|d< |d	 |d	 krL|d
 |d	< || || }}qZd|krt||d	 g d}	g }
|d D ]B}|d |d
 k r|
| |d |d	 krt|	d | qt|
|d< |d |	d krt||	d
 ||	f |d
 |d	< || || }}qZ|d|| qZd|krld|krl|d	 |d	 k rj|d	 |d
< d|d< t||d
 ||f qZd|ks~t	dd|d< d|d< |d	 |d	 krtt
||d	 d}	t||	d
 ||	f nJ|d	 |d	 krtt
||d	 d}t||d
 ||f |d	 |d	< d|kr6|d |d  |d< d|krL|d |d< |d
 |d	< || || }}qZd|krz|n|| |  fS )Nc                    sb   d| kst d r d nd }|rL|d | d krLt|d | d |d< n
 |  t d S )NrG   zNot a cut is appended to cutsr!   r    r   r   )AssertionErrormaxr>   len)r(   Zlast_to_cutr-   r   r   
append_cut   s    
zDModifyChaptersPP._remove_marked_arrange_sponsors.<locals>.append_cutc                    s   |  dt d }}|t k r | }|d | d kr<q|d | d krx|t|d | d 7 }|t|d | d 8 }|d7 }q|S )Ncut_idxr   r   r    r   )poprT   minrS   )r(   rW   ZexcessZcutrU   r   r   excess_duration   s    
zIModifyChaptersPP._remove_marked_arrange_sponsors.<locals>.excess_durationc                    sh   d| kst d| d | d   |  }|dkr4d S rDd d nd}| j||| d |  d S )NrG   zCut is appended to chaptersr    r   r   r!   )r   r    )rR   updater>   )r(   lengthrJ   )rZ   new_chaptersr   r   append_chapter   s    zHModifyChaptersPP._remove_marked_arrange_sponsors.<locals>.append_chapterc                 S   s   g | ]\}}|d  ||fqS r   r   )r'   ir(   r   r   r   
<listcomp>   s     zDModifyChaptersPP._remove_marked_arrange_sponsors.<locals>.<listcomp>r    r   rG   T_was_cutrI   )r   rI   r   r   rW   zNormal chapters overlapr_   )	enumerateheapqheapifyheappoprS   heappushdictr>   
setdefaultrR   r0   r1   _remove_tiny_rename_sponsors)r   r   rV   r^   _Zcur_iZcur_chapterr`   r(   Zafter_cZcur_catsZcat_start_endZ	after_curr   )r-   rZ   r]   r   r2   }   s    	









z0ModifyChaptersPP._remove_marked_arrange_sponsorsc              	   C   s  g }t |D ]\}}d|ks&d|kr|d |d  tk r|sf|t|d k r|d ||d  d< qnp|d }|t|d k r||d  }d|k}d|k}d|kr|r|rd|kr|s|r|d |d< q|d |d< q|dd  |dd }	|	rt|	dd	 d
\}
}}}||
tdd |	D |tdd |	D d | j| j	|
 |d< |rd|d kr|d d |d kr|d |d d< q|| q|S )Nrb   rI   r    r   r   r!   
categoriesc                 S   s   | d | d  S )Nr   r   r   rF   r   r   r   <lambda>)      z?ModifyChaptersPP._remove_tiny_rename_sponsors.<locals>.<lambda>)keyc                 s   s   | ]}|d  V  qdS )r   Nr   r'   xr   r   r   r)   ,  s     z@ModifyChaptersPP._remove_tiny_rename_sponsors.<locals>.<genexpr>c                 s   s   | ]}|d  V  qdS )   Nr   rp   r   r   r   r)   .  s     )rH   rl   nameZcategory_namesr   )rc   _TINY_CHAPTER_DURATIONrT   rX   rY   r[   r	   Z_downloaderZevaluate_outtmplr   r0   r>   )r   r   r]   r`   r(   Zold_cZnext_cZprev_is_sponsorZnext_is_sponsorZcatsrH   rk   Zcategory_namer   r   r   rj   
  sV    z-ModifyChaptersPP._remove_tiny_rename_sponsorsc                 C   sj   |}t |d}|r(| |dd |D }| d|  | |gt| || ||krf| j|d d |S )Ntempc                 s   s(   | ] }|d  |d fD ]
}|V  qqdS )r   r    Nr   )r'   r(   tr   r   r   r)   =  s       z3ModifyChaptersPP.remove_chapters.<locals>.<genexpr>zRemoving chapters from )msg)r
   r   r4   Zconcat_filesrT   Z_delete_downloaded_files)r   filenameZranges_to_cutr,   r   r.   rA   r   r   r   r*   9  s    
z ModifyChaptersPP.remove_chaptersc                 C   sl   i g}| D ]\}|d dkr0|d d|d d< q
|d d|d d< |d |k r
| d|d di q
|S )Nr   r   r    z.6fr!   r"   r$   )r>   )Zchapters_to_remover   optssr   r   r   r5   D  s    z"ModifyChaptersPP._make_concat_opts)NNN)F)__name__
__module____qualname__"DEFAULT_SPONSORBLOCK_CHAPTER_TITLEr   r   Z_restrict_torC   r/   r9   r2   rj   r*   staticmethodr5   r   r   r   r   r      s    	

4# /
r   )r0   rd   r:   commonr   Zffmpegr   r   Zsponsorblockr   utilsr   r	   r
   rt   r~   r   r   r   r   r   <module>   s   