
    Pj)                         d Z ddlZddlZddlZddlmZmZmZ ddlZd Z	d Z
d Zd Zd Zd	 Zd
 Zd Zedk(  r e        yy)uL   
通用字幕图片生成工具
用法: python generate_subtitles.py <adid>
    N)Image	ImageDraw	ImageFontc                 "    d| cxk  xr dk  S c S )u!   检查字符是否为中文字符u   一u   鿿 )chars    1c:\dev\xtrs\vdcb\srtsegjoin\generate_subtitles.pyis_chinese_charr
      s    t'x''''    c                    g }g }d}t        d | D              }|ru| D ]o  }|j                  |      d   |j                  |      d   z
  }||z   |k  r|j                  |       ||z  }K|j                  dj                  |             |g}|}q n| j	                         }	|	D ]  }
|j                  |
      d   |j                  |
      d   z
  }|j                  d      d   |j                  d      d   z
  }|r\||z   |z   |k  r+|j                  d       |j                  |
       |||z   z  }|j                  dj                  |             |
g}|}|j                  |
       |} |r |j                  dj                  |             |S )uT   
    自动换行文本
    - 中文按字符换行
    - 英文按单词换行
    r   c              3   2   K   | ]  }t        |        y w)N)r
   ).0cs     r	   	<genexpr>zwrap_text.<locals>.<genexpr>   s     7$Qoa($s        )anygetbboxappendjoinsplit)text	max_widthfontlinescurrent_linecurrent_widthhas_chineser   
char_widthwordsword
word_widthspace_widths                r	   	wrap_textr%      s    ELM 7$77KDd+A.d1CA1FFJz)Y6##D)+RWW\23 $v *  

Dd+A.d1CA1FFJ,,s+A.c1B11EEK ;.;yH '', ''-![:%==MLL!67$(6L$.M##D) * " RWW\*+Lr   c           	      b   ddl }|j                         j                  j                  }|j                         j                  }d}	 t        j                  |d      }|j                         }|j                  d| f       g }|j                         D ]  }|\  }	}
}|j                  |	|
|f        ||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   N      $@timeoutz
            SELECT idx, cn, en FROM srts 
            WHERE adid = ? AND cn IS NOT NULL AND cn != '' 
            ORDER BY idx
           错误 [函数: 
   , 行号:    ]: 操作失败: )inspectcurrentframef_codeco_namef_linenosqlite3connectcursorexecutefetchallr   close	Exception	tracebackprint	print_exc)adiddb_pathr-   	func_nameline_noconnr4   	subtitlesrowidxcnener9   s                 r	   get_subtitlesrG   F   s(   $$&--55I""$--GDw5  W		 	??$CKCRc2r]+ %  JJL    :gY>OPQsST	JJL  JJL s1   A,C 	D)D8D9D DD D.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   从数据库获取adnamer   Nr'   r(   z7SELECT DISTINCT adname FROM srts WHERE adid = ? LIMIT 1adid_r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   fetchoner7   r8   r9   r:   r;   )
r<   r=   r-   r>   r?   r@   r4   resultrF   r9   s
             r	   
get_adnamerM   g   s"   $$&--55I""$--GDw5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           	      f   ddl }|j                         j                  j                  }|j                         j                  }d}d}	 t        j                  |d      }|j                         }| dd }|j                  dd| df       |j                         }|r|d   |r|j                          S S 	 |r|j                          yy# t        $ rE}	ddl}
t        d	| d
| d|	        |
j                          Y d}	~	|r|j                          yyd}	~	ww xY w# |r|j                          w w xY w)u$   从author数据库获取作者信息r   Nz\\ll\d\wxvddata\dpd.dbr'   r(   <   z0SELECT author FROM ads WHERE name LIKE ? LIMIT 1%r*   r+   r,   rJ   )adnamer-   r>   r?   author_db_pathr@   r4   search_namerL   rF   r9   s              r	   
get_authorrT      s/   $$&--55I""$--G.ND~t< SbkIaP[}\]L^K`a"!9 JJL   JJL    :gY>OPQsSTJJL  JJL s+   AC
 
	D(D;D DD D0c                 p    ddl }d}|j                  ||       }|r| |j                         d }n| }d|v ry|S )u   
    清理标题：
    1. 如果开头是日期格式（如26-04-08_13_52_45-），则截掉
    2. 如果标题太长，只取"鸡蛋最容易被污染的是沙门氏菌"
    r   Nz%^\d{2}-\d{2}-\d{2}_\d{2}_\d{2}_\d{2}-u*   鸡蛋最容易被污染的是沙门氏菌)rematchend)rQ   rV   patternrW   titles        r	   clean_titler[      sH     6GHHWf%Euyy{|$ 4u<;Lr   c           	         d}t        | |      }t        |      }t        |      }t        d|        t        d|        t        d|        | d}t        j
                  j                  |      rt        j                  |       t	        j                  |       t        | |      }t        dt        |       d       |st        d       y		 t        j                  d
d      }t        j                  d
d      }t        j                  d
d      }	t        j                  dd      }
d\  }}t        |      D ]n  \  }\  }}}|r'|j!                  d      s|j!                  d      r|dd }|r'|j!                  d      s|j!                  d      r|dd }t#        j$                  d||fd      }t'        j(                  |      }t+        |d|      }d}|D ]O  }|j-                  |      d   |j-                  |      d   z
  }||z
  dz  }|j/                  ||f||d       |d z  }Q d!| }|j-                  |      d   |j-                  |      d   z
  }||z
  dz  }|j/                  ||d"z   f||d       |d"z   d#z   }t+        |d|	      }|D ]O  }|	j-                  |      d   |	j-                  |      d   z
  }||z
  dz  }|j/                  ||f||	d$       |d%z  }Q |rf|d"z   }t+        |d|
      }|D ]O  }|
j-                  |      d   |
j-                  |      d   z
  }||z
  dz  }|j/                  ||f||
d       |d&z  }Q t        j
                  j1                  |d'|d(d)      }|j3                  |       |d*z   d+z  dk(  sRt        d,|d*z    d-t        |              q t        d.t        |       d/       t        d0|        y1# t        $ r}t        d|        Y d}~y	d}~ww xY w)2u   生成字幕图片z\\ll\D\xtrssvjj\db\dpd.dbu   原始adname: u   清理后标题: zauthor: _imagesu   找到 u
    句字幕u   错误：未找到字幕信息Fz
simsun.ttc*   "   (   z	arial.ttf0   u   字体加载失败: N)i   i  u   ，u   。,.RGB)r   r   r   i     r   r   )   rg   rg   )r   fill5   u   译自@   P   )rg      r   9   =   vertical_subtitle_03dz.png   
   u   生成字幕图片 /u   完成！生成了 u    张字幕图片u   输出目录: T)rM   rT   r[   r:   ospathexistsshutilrmtreemakedirsrG   lenr   truetyper8   	enumerateendswithr   newr   Drawr%   r   r   r   save) r<   r=   rQ   authorrZ   
output_dirrA   
title_fontsubtitle_fontcn_fonten_fontrF   widthheightirC   rD   rE   imagedrawtitle_linestitle_yline
line_widthxsubtitlesubtitle_widthcn_ycn_linesen_yen_linesoutput_paths                                    r	   generate_subtitle_imagesr      s5    +G g&FF E	N6(
#$	eW
%&	HVH
 87#J 
ww~~j!j!KK
 dG,I	GC	N#:
././''b9
!**<<$$\26$$["5 ME6 &i0=CR2;;u%U);CRB2;;s#r{{3'7CRB 		%%)<~~e$  sJ7D#++D1!4z7I7I$7OPQ7RRJ#)AIIq'lDzIPrMG	   VH%&..x8;m>S>ST\>]^_>``^#)		1gl#XM	X |b Rg.D .q1GOOD4I!4LLJ#)AIIq$iG-IHBJD	  "9D S'2H $__T2158Ma8PP
Z'A-		1d)To	N
	 ! ggll:1CC9D/QR

; ER<1'!uAc)n-=>?i 1l 
I//?
@A	N:,
'(A  $QC()s   AO 	O2O--O2c                     t        t        j                        dk7  rt        d       t        d       	 t	        t        j                  d         } t        d       t        d|         t        d	       t        d
       t        d       t        d       t        d       t        d       t        d       t        d       t        d       t        d       t        d       t        d       t        d       t        d       t        |       }|rt        d       yt        d       t        j                  d       y# t
        $ r t        d       d} Y w xY w)u	   主函数r   u+   用法: python generate_subtitles.py <adid>u)   示例: python generate_subtitles.py 8442rq   u   错误：adid必须是数字iL u    === 字幕图片生成工具 ===zadid: u   
【图片相关规则】u&   1. 图片尺寸：720x1280（竖屏）u   2. 背景色：黑色uA   3. 标题：使用完整adname，白色，字号42，居中显示uW   4. 副标题：格式为'译自@作者名'，白色，字号34，位于标题下方26pxuK   5. 中文字幕：黄色(255,215,0)，字号44，位于副标题下方130pxuB   6. 英文字幕：白色，字号48，位于中文字幕下方26pxuE   7. 字体：标题/副标题/中文用simsun.ttc，英文用arial.ttfu-   8. 折行：中文按字符，英文按单词uG   9. 标点处理：去掉句末标点（中文的，。和英文的,.）u?   10. 实时显示进度：每处理10个文件显示一次进度u   
【避坑记录】uH   - 错误3：Pillow的getsize()方法错误，已修复为使用getbbox()uX   - 错误8：英文文本最后一行单词间空格丢失，已修复为使用' '.join()u   
字幕图片生成完成！u   
字幕图片生成失败！N)rz   sysargvr:   intr8   r   exit)r<   successs     r	   mainr      s   
388};<9:388A; 
,.	F4&/ 

&'	
23	
!"	
MN	
cd	
WX	
NO	
QR	
9:	
ST	
KL	
 !	
TU	
de&t,G-.-.;  ,-s   D= =EE__main__)__doc__rt   r   r2   PILr   r   r   rw   r
   r%   rG   rM   rT   r[   r   r   __name__r   r   r	   <module>r      s_   
 
 
  + + (
/dB6<.fR$N zF r   