
    i                     t    d Z ddlZddlZddlZddlmZmZ ddlZ ej        e	          Z
 G d d          ZdS )z(
Utility functions for video processing
    N)OptionalTuplec                      e Zd ZdZededefd            Zededede	fd            Z
ededed	ed
ede	f
d            Ze	 d$dededede	fd            Ze	 d%dededede	fd            Zededede	fd            Zedededede	fd            Zededede	fd            Zedededede	fd            Ze	 d&dededede	fd            Ze	 d'dedededede	f
d            Zededefd             Zed!edefd"            Zd#S )(VideoProcessorz'Video processing utilities using FFmpeg	file_pathreturnc                    K   	 ddddddd| g}t          j        |dd	          }t          j        |j                  S # t
          $ r)}t                              d
|            i cY d}~S d}~ww xY w)zGet video metadataffprobez-vquietz-print_formatjsonz-show_formatz-show_streamsTcapture_outputtextzError getting video info: N)
subprocessrunr   loadsstdout	Exceptionloggererror)r   cmdresultes       /app/utils/video_utils.pyget_video_infozVideoProcessor.get_video_info   s      	4	C  ^C4HHHF:fm,,, 	 	 	LL9a99:::IIIIII	s   9> 
A1A,&A1,A1input_filesoutput_filec           
        K   	 |dz   }t          |d          5 }| D ]}|                    d| d           	 ddd           n# 1 swxY w Y   dddd	d
d|dd|g
}t          j        |dd          }t	          j        |           |j        dk    rdS t                              d|j	                    dS # t          $ r(}t                              d|            Y d}~dS d}~ww xY w)zMerge multiple videosz.txtwzfile 'z'
Nffmpegz-fconcatz-safe0-i-ccopyTr   r   zFFmpeg error: FzError merging videos: )openwriter   r   osremove
returncoder   r   stderrr   )r   r   concat_fileffiler   r   r   s           r   merge_videoszVideoProcessor.merge_videos   so     	%.Kk3'' 01' 0 0DGG.T...////00 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 $'3k4C  ^C4HHHFIk""" A%%t=fm==>>>u 	 	 	LL5!5566655555	s@   B8 AB8 A		B8 A	AB8 "B8 8
C*C%%C*
input_file
start_timedurationc           
         K   	 dd| d|d|dd|g
}t          j        |d           dS # t          $ r(}t                              d	|            Y d
}~dS d
}~ww xY w)z
Trim videor    r#   -ssz-tr$   r%   TcheckzError trimming video: NFr   r   r   r   r   )r0   r   r1   r2   r   r   s         r   
trim_videozVideoProcessor.trim_video9   s      
	$
z4fkC
 N3d++++4 	 	 	LL5!5566655555	   "( 
AAAfastmodec                    K   	 |dk    rdd| dddddd	d
d|g}ndd| dddddddd	d
d|g}t          j        |d           dS # t          $ r(}t                              d|            Y d}~dS d}~ww xY w)zCompress videohevcr    r#   -c:vlibx265z-crf28-c:aaacz-b:a128klibx26423z-presetr:   Tr5   zError compressing video: NFr7   )r0   r   r;   r   r   s        r   compress_videozVideoProcessor.compress_videoI   s      	v~~dJIvtE66	 dJIvtvE66 N3d++++4 	 	 	LL8Q8899955555	s   ;A 
A3A..A3rD   codecc                    K   	 dd| d|dd|g}t          j        |d           dS # t          $ r(}t                              d|            Y d	}~d
S d	}~ww xY w)z Encode video to different formatr    r#   r>   rA   rB   Tr5   zError encoding video: NFr7   )r0   r   rG   r   r   s        r   encode_videozVideoProcessor.encode_videoc   s      
	$
vuC
 N3d++++4 	 	 	LL5!5566655555	    & 
AAAc           	         K   	 dd| ddddd|g	}t          j        |d	           dS # t          $ r(}t                              d
|            Y d}~dS d}~ww xY w)zExtract audio from videor    r#   z-vnz-acodec
libmp3lamez-q:a2Tr5   zError extracting audio: NFr7   r0   r   r   r   s       r   extract_audiozVideoProcessor.extract_audios   s      
	$
y,[C
 N3d++++4 	 	 	LL7A7788855555	s   !' 
AAA
video_file
audio_filec                    K   	 dd| d|dddddddd	|g}t          j        |d
           d
S # t          $ r(}t                              d|            Y d}~dS d}~ww xY w)zAdd audio to videor    r#   r>   r%   rA   rB   -mapz0:v:0z1:a:0Tr5   zError adding audio: NFr7   )rP   rQ   r   r   r   s        r   	add_audiozVideoProcessor.add_audio   s      	$
D*	C N3d++++4 	 	 	LL33344455555	s   &, 
AAAc                    K   	 dd| dd|g}t          j        |d           dS # t          $ r(}t                              d|            Y d}~d	S d}~ww xY w)
zExtract subtitles from videor    r#   rS   z0:s:0Tr5   zError extracting subtitles: NFr7   rN   s       r   extract_subtitlesz VideoProcessor.extract_subtitles   s      		$
C N3d++++4 	 	 	LL;;;<<<55555	s   $ 
AAAsubtitle_filec           
         K   	 dd| d|dddd|g
}t          j        |d           dS # t          $ r(}t                              d	|            Y d
}~dS d
}~ww xY w)zAdd subtitles to videor    r#   r$   r%   z-c:smov_textTr5   zError adding subtitles: NFr7   )rP   rW   r   r   r   s        r   add_subtitleszVideoProcessor.add_subtitles   s      
	$
D-ffjC
 N3d++++4 	 	 	LL7A7788855555	r9   00:00:01	timestampc                    K   	 dd| d|dd|g}t          j        |d           dS # t          $ r(}t                              d|            Y d	}~d
S d	}~ww xY w)zGenerate screenshot from videor    r#   r4   z-vframes1Tr5   zError generating screenshot: NFr7   )r0   r   r\   r   r   s        r   generate_screenshotz"VideoProcessor.generate_screenshot   s      
	$
y*cC
 N3d++++4 	 	 	LL<<<===55555	rJ   bottom-rightwatermark_filepositionc           
         K   	 dddddd}|                     |d          }dd| d|d	d
| dd|g
}t          j        |d           dS # t          $ r(}t                              d|            Y d}~dS d}~ww xY w)zAdd watermark to videoz10:10z	W-w-10:10z	10:H-h-10zW-w-10:H-h-10z(W-w)/2:(H-h)/2)ztop-leftz	top-rightzbottom-leftr`   centerr    r#   z-filter_complexzoverlay=z-codec:ar%   Tr5   zError adding watermark: NF)getr   r   r   r   r   )rP   ra   r   rb   	positionsoverlay_posr   r   s           r   add_watermarkzVideoProcessor.add_watermark   s      	 $(* /+ I $--/BBK $
D.!#;k#;#;FKC
 N3d++++4 	 	 	LL7A7788855555	s   AA	 	
A;A66A;c                     t           j                            |           rt           j                            |           ndS )zGet file size in bytesr   )r(   pathexistsgetsize)r   s    r   get_file_sizezVideoProcessor.get_file_size   s0     .0W^^I-F-FMrwy)))AM    
size_bytesc                 B    dD ]}| dk     r
| dd| c S | dz  } | ddS )z%Format bytes to human readable format)BKBMBGBg      @z.2f z TB )ro   units     r   format_sizezVideoProcessor.format_size   sY     , 	! 	!DF""$111411111& JJ%%%%%rn   N)r:   )rD   )r[   )r`   )__name__
__module____qualname____doc__staticmethodstrdictr   listboolr/   r8   rF   rI   rO   rT   rV   rZ   r_   rh   intrm   rx   rv   rn   r   r   r      s)       11     \  3 4    \2 S s $'36;?   \ (.  3 "%37   \2 '0 s  !$59   \  # $    \ C S $',0   \  C c d    \  C (+04   \ 3= c  -0BF   \ =K  S (+7:PT   \2 N N N N N \N & & & & & \& & &rn   r   )r|   r(   r   loggingtypingr   r   r   	getLoggerry   r   r   rv   rn   r   <module>r      s     
			      " " " " " " " " 		8	$	$[& [& [& [& [& [& [& [& [& [&rn   