
    <Cje                        d Z ddlZddlZddlZddlZddlZddlZddlZd Zd Z	d Z
d Zd Zd ZddlZd	 ZddlZdd
lmZ d ZddlZdd
lmZ d Zd ZddlZddlZdd
lmZ d ZddlZddlZd Zd Zd Zd Zedk(  r e        yy)uj   
根据字幕图片和双语时间生成完整视频流
用法: python generate_bilingual_video.py <adid>
    Nc           	         ddl }|j                         j                  j                  }|j                         j                  }d}	 t        j                  |d      }|j                         }|j                  d| f       g }|j                         D ]6  }|\  }	}
}}}t        |
      }t        |      }|j                  |	||||f       8 ||r|j                          S S # t        $ rG}ddl}t        d| d| d|        |j!                          g cY d}~|r|j                          S S d}~ww xY w# |r|j                          w w xY w)	u(   
    从数据库获取字幕信息
    r   Ng      $@timeoutzt
            SELECT idx, start, end, cn, en FROM srts 
            WHERE adid = ? 
            ORDER BY idx
           错误 [函数: 
   , 行号:    ]: 操作失败: )inspectcurrentframef_codeco_namef_linenosqlite3connectcursorexecutefetchallintappendclose	Exception	tracebackprint	print_exc)adiddb_pathr	   	func_nameline_noconnr   	subtitlesrowidxstartendcnenstart_msend_mser   s                     7c:\dev\xtrs\vdcb\srtsegjoin\generate_bilingual_video.pyget_subtitlesr*      sF    $$&--55I""$--GDw5  W		 	??$C&)#CR5zHXFc8VR<= %  JJL    :gY>OPQsST	JJL  JJL s1   BC   	D0))D+D0D3 +D00D3 3Ec           	      `   ddl }|j                         j                  j                  }|j                         j                  }d}	 t        j                  |d      }|j                         }|j                  d| f       |j                         }|r|d   |r|j                          S S d|  |r|j                          S S # t        $ rJ}ddl}	t        d| d| d	|        |	j                          d|  cY d}~|r|j                          S S d}~ww xY w# |r|j                          w w xY w)
u"   
    从数据库获取adname
    r   N   r   z7SELECT DISTINCT adname FROM srts WHERE adid = ? LIMIT 1adid_r   r   r   )r	   r
   r   r   r   r   r   r   r   fetchoner   r   r   r   r   )
r   r   r	   r   r   r   r   resultr(   r   s
             r)   
get_adnamer0   4   s$    $$&--55I""$--GDw4PSWRYZ"!9 JJL  tf~ JJL    :gY>OPQsSTtf~JJL  JJL s7   AC *C 	D,D7D8D DD D-c                    d}t        | |      }| d}t        j                  j                  dd|      }t	        | |      }t        j                  j                  d| d      }d } ||      }g }	t        |      D ]  \  }
\  }}}}}|
dkD  r||
dz
     d	   nd}|
dkD  r||z
  nd}|
t        |      dz
  k  r||
dz      d   }||z
  }n|}||kD  r||z
  nd}|
dk(  rd}n||z   d	z  }|
t        |      dz
  k(  r|dz
  }n||z   d	z  }|
dk(  rd}nd
||z
  z
  }|dk  rd}|
t        |      dz
  k(  rd}nd
||z
  z
  }|dk  rd}t        j                  j                  |d|dd| d| d      }t        j                  |      }d}|r2|d   }t        |      dz
  }t        |      dz
  }||| }	 t        |      }t        j                  j                  |d|dd      } t        j                  |       }!d}"|!r&|
dz  st        d|!d            ||!d         }#|#dz  }"||z   |z   |"z   }$|	j                  ||$f        |	S # t        $ r}t        d|       g cY d}~c S d}~ww xY w)u"   
    读取双语时间信息
    \\ll\D\xtrssvjj\db\dpd.db	_cn_audioz\\ll\D\xtrssvjjttsz.mp3c           
          ddddddddd	|  g	}t        j                  |d
d
      }|j                  dk(  r/t        t	        |j
                  j                               dz        S y)Nffprobez-vquietz-show_entrieszformat=durationz-ofz"default=noprint_wrappers=1:nokey=1-ifile:T)capture_outputtextr     )
subprocessrun
returncoder   floatstdoutstrip)	file_pathcmdr/   s      r)   get_file_durationz-get_bilingual_time.<locals>.get_file_durationd   s    w9JESwy}  AF  GP  FQ  R  SDtD !uV]]0023d:;;    r         i  seg03d-z-*.mp3      xxxNz*-04d
   u   使用网络TTS文件: gffffff?)r0   ospathjoinr*   	enumeratelenglobr   r   r   r   )%r   r   adnamecn_audio_dir
en_tts_dirr   
audio_filerE   audio_durationbilingual_timesir!   r"   r#   r$   r%   prevendstartgap	nextstartendgapstartposendposaddstartaddendcn_audio_filecn_filescn_durationcn_filefilenamestartposidxfilenameendposidxdurstrexen_tts_patternen_filesen_durationoriginal_durationbilingual_times%                                        r)   get_bilingual_timers   O   s   
 +G g&F XY'L0%@J dG,I 0VHD/BJ 'z2N O(1)(<$$CR'(1u)AaC.#!&'!e57?s9~a!!A#q)I_F 'I(6(<Y_!F 6H%A-H Iq  #a'FIo!+F 6Heh./H1} Iq  FFSL)F{ \SS	8*AfXU[3\]99]+QKG #M 21 4!'l1n./@AF [
 jBs3it2DE99^,R4/}=> 1(1+ >+c1K "K/&8;F^45O )=R +  eB	s   +H==	I II I c                 ^   d}t        | |      }t        d|        | d}t        j                  j	                  |      st        d|        yt        |       }t        dt        |       d       |st        d       yt        j                         5 }g }|D ]  \  }}t        j                  j                  |d	|d
d      }	t        j                  j	                  |	      st        d|	        Y|dz  }
t        j                  j                  |d|d
d      }ddddd|	dddddddddddt        |
      d |g}t        j                  |d!"       t        j                  j	                  |      s|j                  |        t        d#t        |       d$       |st        d%       	 d&d&d&       yt        j                  j                  |d'      }t        |d(d)*      5 }|D ]4  }|j                  d+t        j                  j!                  |       d,       6 	 d&d&d&       t        j                  j                  || d-      }ddd.d/d0d1d|d2d3|g}t        d4       t        j                  |d!"      }|j"                  d5k(  rt        d6|        	 d&d&d&       y!	 |j$                  j'                  d)d78      }t        d:|        	 d&d&d&       y# 1 sw Y   xY w#  	 |j$                  j'                  d9d78      }n#  t        |j$                        }Y nxY wY cxY w# 1 sw Y   y&xY w);"   
    生成完整的视频流
    r2   adname: _images&   错误：字幕图片目录不存在: F   找到     句双语时间信息$   错误：未找到双语时间信息vertical_subtitle_rJ   .png    警告：图片文件不存在: r<   	fragment_.mp4ffmpeg-y-loop1r8   -c:vlibx264-tune
stillimage-c:aaac-b:a192k-pix_fmtyuv420p-t	-shortestTr:   
   生成了     个视频片段$   错误：未生成任何视频片段Nfilelist.txtwutf-8encodingfile ''
_bilingual_video.mp4-fconcat-safe0-ccopy   开始拼接视频流...r      拼接完成！输出文件: replaceerrorsgbk   拼接失败！错误信息: )r0   r   rQ   rR   existsrs   rU   tempfileTemporaryDirectoryrS   strr=   r>   r   openwriteabspathr?   stderrdecode)r   r   rW   	image_dirr\   temp_dirvideo_fragmentsr!   duration_ms
image_fileduration_secoutput_filerD   filelist_pathffragmentr/   	error_msgs                     r)   make_bili_vdr      s)   
 +G g&F	HVH
 ('"I 77>>)$6ykBC ).O	GC())?
@A45 
	$	$	&( /Ci3Ec#Yd1STJ77>>*-8EF '-L '',,x9SIT1JKK $j	Ic,'C NN3t4ww~~k*&&{3A !0D 	
3/00@AB89U 
'	&Z X~>-w71+&!: ;3?@ , 8
 ggll98L.MNd(S-&
 	()D9!1+?@G 
'	&L3"MM000K	 1)=>] 
'	&^ 87233 & 4 4U9 4 MI3 #FMM 2IY 
'	&sb   CL#39L#5.L##:KA8L# K!=L#K	L#!L $LL LL L##L,c                 T    d}t        j                  |d| j                               }|S )Nz\s*[(_-]\d+[)]?$ )resubrB   )rW   patterncleaneds      r)   clean_filename_suffixr   +  s&     "GffWb&,,.1GNrF   c                 f   d}t        |       }t        j                  j                  || d      }t	        j                  |      }t        d|       |r't        |t        j                  j                        }|S t        d       t        t        j                  j                  t                     y )Ny:\xtrssvjjz*.jpgzsearch_pattern:keyu   ❌ 未找到封面图)
r   rQ   rR   rS   rV   r   maxgetmtimebasename__file__)filemain	cover_dircover_imgfilenamemainsearch_patternfound_covers
image_paths         r)   calccoverimgfilenamer   5  s    I/9WW\\)0E/Fe-LMN99^,L	
N+277+;+;<
	
"#	"''

8
$%rF   c                    d}t         j                  j                  |       }t         j                  j                  |      \  }}|}t	        d|        	 t        j
                  |      }g }|D ]V  }||v s|j                         j                  d      s(|j                  t         j                  j                  ||             X |r5t        |t         j                  j                        }	t	        d|	        |	S 	 t	        d       t	        t         j                  j                  t                     y # t        $ r}
t	        d|
        Y d }
~
Td }
~
ww xY w)Nr   u)   [DEBUG_RAW] 正在绝对匹配关键词: z.jpgr   u%   🎯 【大捷】成功捞出封面: u   ❌ 目录读取失败: u.   ❌ 纯文本过滤后依然未找到封面图)rQ   rR   r   splitextr   listdirlowerendswithr   rS   r   r   r   r   )r   r   	base_namename_without_ext_core_keyword	all_filesr   r   r   r(   s              r)   r   r   C  s(   I   *I''**95a $L	5l^
DE.JJy)	Aq QWWY%7%7%?##BGGLLA$>?  \rww/?/?@J9*FG  

:;	"''

8
$%  .(,--.s%    D7 6D7 A'D7 7	E EE)Pathc                    t        t        |      j                               }|  d}d}ddddddd	| d
ddddt        |      ddddddddddddd|g}	 t        j                  |d      }|j
                  dk(  rt        d|        y |j                  j                  dd !      }t        d"|        y # t        $ r}t        d#|        Y d }~y d }~ww xY w)$N
_cover.mp4rG   r   r   -hide_bannerr   r   r8   r9   r   r   r   r   r   r   r   -vfz!scale=trunc(iw/2)*2:trunc(ih/2)*2r   lavfi0anullsrc=channel_layout=stereo:sample_rate=44100r   r   r   r   r   Tr   r   u   ✅ 封面视频已生成: r   ignorer   u#   ❌ 生成失败！错误详情：
u   💥 脚本崩溃: )
r   r   resolver=   r>   r?   r   r   r   r   )	rW   coverimgfileimg_abs_pathoutput_videor   rD   r/   r   r(   s	            r)   create_cover_videor   j  s   tL)1134LXZ(LL 	$l^$	c,I2gtOC$)D9!/~>? ,,WX,FI8DE )#A3'(()s   4B5 	+B5 5	C>CCc                    d}|  d}ddddddd	d
dddd
dddddddddddddd|g}	 t        |d      5 }|j                         }d d d        t        j                  |t        j                  t        j                  t        j                        }|j                        \  }}	|j                  dk(  rSdd l}
|
j                  j                  |      r |
j                  |        |
j                  ||       t        d|        y t        d|	j                  d d!"              y # 1 sw Y   xY w# t        $ r}t        d#|        Y d }~y d }~ww xY w)$Ntemp_safe_cover.mp4r   r   r   r   r   r   r   
image2piper8   rK   r   r   r   z0scale=trunc(iw/2)*2:trunc(ih/2)*2,format=yuv420pr   r   r   r   r   r   r   r   r   r   rbstdinrA   r   inputr   u   ✅ 真正成功了：u   ❌ 还是报错：r   r   r      💥 崩溃: r   readr=   PopenPIPEcommunicater?   rQ   rR   r   removerenamer   r   r   rW   r   temp_outputfinal_outputrD   r   img_dataprocessrA   r   rQ   r(   s               r)   create_cover_video_perfectr    sX   'KXZ(L 	$lcgtOA	cC #,%vvxH & ""3joojoo^h^m^mn ,,8,<"ww~~l+YRYY|-DBIIk<0*<.9:'gh(O'PQR &%   #aS!""#5   D1 D%CD1 D1 %D.*D1 1	E:EEc                    d}|  d}ddddddd	d
dddd
dddddddddddddd|g}	 t        |d      5 }|j                         }d d d        t        j                  |t        j                  t        j                  t        j                        }|j                        \  }}	|j                  dk(  rSdd l}
|
j                  j                  |      r |
j                  |        |
j                  ||       t        d|        y t        d|	j                  d d!"              y # 1 sw Y   xY w# t        $ r}t        d#|        Y d }~y d }~ww xY w)$Nr   r   r   r   r   r   r   r   r   r8   rK   r   r   r   zscale=960:544,format=yuv420pr   r   r   r   r   r   r   r   r   r   r   r   r   r   u"   ✅ 完美生成 544x960 封面：u   ❌ 报错：r   r   r   r   r   r   s               r)   r  r    sW   'KXZ(L 	$lcgtO-	cC"#,%vvxH & ""3joojoo^h^m^mn ,,8,<"ww~~l+YRYY|-DBIIk<06|nEFM&---"I!JKL &%  #aS!""#r  c                    dt        j                          d}|  d}d}ddddd	d
dddd
dd|ddddddddddd|g}	 t        |d      5 }|j                         }d d d        t	        j
                  |t        j                  t        j                  t        j                        }|j                        \  }	}
|j                  dk(  rYt         j                  j                  |      rt        j                  |       t        j                  ||       t        d|        y t        d|
j                  d d!"              y # 1 sw Y   xY w# t        $ r}t        d#|        Y d }~y d }~ww xY w)$Ntemp_r   r   zgscale=544:960:force_original_aspect_ratio=decrease,pad=544:960:(ow-iw)/2:(oh-ih)/2:black,format=yuv420pr   r   r   r   r   r8   rK   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   u$   ✅ 竖屏封面(544x960)已生成:    ❌ 报错: r   r   r   r   )rQ   getpidr   r   r=   r   r   r   r?   rR   r   r   r   r   r   r   )rW   r   r   r   video_filterrD   r   r   r   rA   r   r(   s               r)   r   r     sb   "))+d+KXZ(L	  	$lD#gtO|	cC#,%vvxH & ""3joojoo^h^m^mn ,,8,<"ww~~l+RYY|-DIIk<08GHLwx!H IJK &%  #aS!""#s6   E ECE !E E
E 	E.E))E.c                    dt        j                          d}d}ddddt        |      dd	d
ddddt        |      d
ddddddddddddd|g}	 t        |d      5 }|j	                         }d d d        t        j                  |t
        j                  t
        j                  t
        j                        }|j                        \  }	}
|j                  dk(  r[t         j                  j                  |      rt        j                  |       t        j                  ||       t        d| d       |S t        d |
j                  d!d"#              	 |S # 1 sw Y   xY w# t         $ r}t        d$|        Y d }~|S d }~ww xY w)%N
temp_task_r   rG   r   r   r   r   r   r   r   r   r8   rK   r   r   r   zascale=544:960:force_original_aspect_ratio=decrease,pad=544:960:(ow-iw)/2:(oh-ih)/2,format=yuv420pr   r   r   r   r   r   r   r   r   r   r   r   u   ✅ u"    生成成功，时长已对齐。r  r   r   r   u   💥 异常: )rQ   r  r   r   r   r=   r   r   r   r?   rR   r   r   r   r   r   r   )rW   r   r   r   r   rD   r   r   r   rA   r   r(   s               r)   r   r     sv   ryy{m40KL 	$c,#t\4c,w6hr	
C#,%vvxH & ""3joojoo^h^m^mn ,,8,<"ww~~l+RYY|-DIIk<0D&HIJLwx!H IJK  &%  #aS!""#s7   E! E)C	E! 3E! EE! !	F*E>>Fc                    d}t        | |      }t        d|        t        |      }| d}|rCt        |||      }t        j
                  j                  |      rt        d       nt        d       | d}t        j
                  j                  |      st        d|        yt        |       }t        d	t        |       d
       |st        d       yt        j                         5 }g }|D ]  \  }	}
|	dz  dk(  rt        d|	dz   dt        |             t        j
                  j                  |d|	dd      }t        j
                  j                  |      st        d|        ||
dz  }t        j
                  j                  |d|	dd      }ddddd|dddd d!d"d#d$d%d&d't        |      d(|g}t        j                  |d)*       t        j
                  j                  |      s|j                  |        t        d+t        |       d,       |st        d-       	 d.d.d.       yt        j
                  j                  |d/      }t!        |d0d12      5 }t        j
                  j                  |      r2|j#                  d3t        j
                  j%                  |       d4       |D ]4  }|j#                  d3t        j
                  j%                  |       d4       6 	 d.d.d.       t        j
                  j                  || d5      }ddd6d7d8d9d|d:d;|g}t        d<       t        j                  |d)*      }|j&                  dk(  rt        d=|        	 d.d.d.       y)	 |j(                  j+                  d1d>?      }t        dA|        	 d.d.d.       y# 1 sw Y   xY w#  	 |j(                  j+                  d@d>?      }n#  t        |j(                        }Y nxY wY cxY w# 1 sw Y   y.xY w)Bru   r2   rv   r   u   vvv 封面视频已生成u1   !!! 封面视频未生成 -封面文件不存在?rw   rx   Fry   rz   r{   rP   r   u   生成各视频句段:rG   /r|   rJ   r}   r~   r<   r   r   r   r   r   r   r8   r   r   r   r   r   r   r   r   r   r   r   r   Tr   r   r   r   Nr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r0   r   r   r   rQ   rR   r   rs   rU   r   r   rS   r   r=   r>   r   r   r   r   r?   r   r   )r   r   rW   r   covervideofiler   r\   r   r   r!   r   r   r   r   rD   r   r   r   r/   r   s                       r)   r   r   B  s   
 +G g&F	HVH
'/Lxz*N)&,~N77>>.)-.EF('"I77>>)$6ykBC ).O	GC())?
@A45 
	$	$	&( /C2vqy.s1uS_9MNi3Ec#Yd1STJ77>>*-8EF '-L '',,x9SIT1JKK $j	Ic,'C NN3t4ww~~k*&&{3E !0H 	
3/00@AB89Y 
'	&^ X~>-w71ww~~n-&!@ AEF+&!: ;3?@ , 8 ggll98L.MNd(S-&
 	()D9!1+?@O 
'	&T3"MM000K	 1)=>e 
'	&b 87633 & 4 4U9 4 MI3 #FMM 2Ia 
'	&sc   *D O-+:O-..O-BN(A8O-*N+O-N(	$O-+O*.OO*O%#O*(O--O6c                  &   t        t        j                        dk7  r+t        d       t        d       t        j                  d       	 t        t        j                  d         } t        d       t        t        j                  j                  t                     t        d         t        |       }|rt        d       y
t        d	       t        j                  d       y
# t        $ r# t        d       t        j                  d       Y w xY wu   
    主函数
    rH   u1   用法: python generate_bilingual_video.py <adid>u/   示例: python generate_bilingual_video.py 8496rG   u   错误：adid必须是数字u#   === 双语视频流生成工具 ===zadid: u   
视频流生成完成！u   
视频流生成失败！NrU   sysargvr   exitr   
ValueErrorrQ   rR   r   r   r   r   successs     r)   mainr         388}AB?@388A;
 
/1	"''

8
$%	F4&/4 G*+*+  ,-   	C$ $)DDc                  &   t        t        j                        dk7  r+t        d       t        d       t        j                  d       	 t        t        j                  d         } t        d       t        t        j                  j                  t                     t        d         t        |       }|rt        d       y
t        d	       t        j                  d       y
# t        $ r# t        d       t        j                  d       Y w xY wr  r  r  s     r)   r  r    r  r  __main__)__doc__rQ   r   r  r   r=   rV   r   r*   r0   rs   r   r   r   pathlibr   r   r  r  __name__ rF   r)   <module>r      s   
 
 	 
    #H6objV	& 
"H  $)J  )#V%#P  	 -#b  	$Jtl66 zF rF   