#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
通用字幕图片生成工具
用法: python generate_subtitles.py <adid>
"""

import os
import sys
import sqlite3
from PIL import Image, ImageDraw, ImageFont
import shutil


def is_chinese_char(char):
    """检查字符是否为中文字符"""
    return '\u4e00' <= char <= '\u9fff'


def wrap_text(text, max_width, font):
    """
    自动换行文本
    - 中文按字符换行
    - 英文按单词换行
    """
    lines = []
    current_line = []
    current_width = 0
    
    # 检查是否包含中文字符
    has_chinese = any(is_chinese_char(c) for c in text)
    
    if has_chinese:
        # 中文按字符分割
        for char in text:
            char_width = font.getbbox(char)[2] - font.getbbox(char)[0]
            if current_width + char_width <= max_width:
                current_line.append(char)
                current_width += char_width
            else:
                lines.append(''.join(current_line))
                current_line = [char]
                current_width = char_width
    else:
        # 英文按单词分割
        words = text.split()
        for word in words:
            word_width = font.getbbox(word)[2] - font.getbbox(word)[0]
            space_width = font.getbbox(' ')[2] - font.getbbox(' ')[0]
            
            if current_line:
                if current_width + space_width + word_width <= max_width:
                    current_line.append(' ')
                    current_line.append(word)
                    current_width += space_width + word_width
                else:
                    lines.append(''.join(current_line))
                    current_line = [word]
                    current_width = word_width
            else:
                current_line.append(word)
                current_width = word_width
    
    if current_line:
        lines.append(''.join(current_line))
    
    return lines

def get_subtitles(adid, db_path):
    """从数据库获取字幕信息"""
    import inspect
    func_name = inspect.currentframe().f_code.co_name
    line_no = inspect.currentframe().f_lineno
    
    conn = None
    try:
        conn = sqlite3.connect(db_path, timeout=10.0)
        cursor = conn.cursor()
        
        cursor.execute("""
            SELECT idx, cn, en FROM srts 
            WHERE adid = ? AND cn IS NOT NULL AND cn != '' 
            ORDER BY idx
        """, (adid,))
        
        subtitles = []
        for row in cursor.fetchall():
            idx, cn, en = row
            subtitles.append((idx, cn, en))
        
        return subtitles
    except Exception as e:
        import traceback
        print(f"错误 [函数: {func_name}, 行号: {line_no}]: 操作失败: {e}")
        traceback.print_exc()
        return []
    finally:
        if conn:
            conn.close()
def get_adname(adid, db_path):
    """从数据库获取adname"""
    import inspect
    func_name = inspect.currentframe().f_code.co_name
    line_no = inspect.currentframe().f_lineno
    
    conn = None
    try:
        conn = sqlite3.connect(db_path, timeout=10.0)
        cursor = conn.cursor()
        
        cursor.execute("SELECT DISTINCT adname FROM srts WHERE adid = ? LIMIT 1", (adid,))
        result = cursor.fetchone()
        
        if result:
            return result[0]
        return f"adid_{adid}"
    except Exception as e:
        import traceback
        print(f"错误 [函数: {func_name}, 行号: {line_no}]: 操作失败: {e}")
        traceback.print_exc()
        return f"adid_{adid}"
    finally:
        if conn:
            conn.close()


def get_author(adname):
    """从author数据库获取作者信息"""
    import inspect
    func_name = inspect.currentframe().f_code.co_name
    line_no = inspect.currentframe().f_lineno
    
    author_db_path = r"\\ll\d\wxvddata\dpd.db"
    conn = None
    try:
        conn = sqlite3.connect(author_db_path, timeout=10.0)
        cursor = conn.cursor()
        
        # 使用adname的前60个字符进行模糊匹配
        search_name = adname[:60]
        cursor.execute("SELECT author FROM ads WHERE name LIKE ? LIMIT 1", (f"%{search_name}%",))
        result = cursor.fetchone()
        
        if result:
            return result[0]
        return None
    except Exception as e:
        import traceback
        print(f"错误 [函数: {func_name}, 行号: {line_no}]: 操作失败: {e}")
        traceback.print_exc()
        return None
    finally:
        if conn:
            conn.close()


def clean_title(adname):
    """
    清理标题：
    1. 如果开头是日期格式（如26-04-08_13_52_45-），则截掉
    2. 如果标题太长，只取"鸡蛋最容易被污染的是沙门氏菌"
    """
    import re
    # 匹配日期格式：DD-MM-YY_HH_MM_SS-
    pattern = r'^\d{2}-\d{2}-\d{2}_\d{2}_\d{2}_\d{2}-'
    match = re.match(pattern, adname)
    if match:
        # 截掉日期部分
        title = adname[match.end():]
    else:
        title = adname
    
    # 如果标题包含"鸡蛋最容易被污染的是沙门氏菌"，则只取这部分
    if "鸡蛋最容易被污染的是沙门氏菌" in title:
        return "鸡蛋最容易被污染的是沙门氏菌"
    
    return title


def generate_subtitle_images(adid,adname,author,subs):
    """生成字幕图片"""
    # 配置
    db_path = r'\\ll\D\xtrssvjj\db\dpd.db'
    
    # 获取adname和author
    # adname = get_adname(adid, db_path)
    if author=='':
        author = get_author(adname)
    
    # 清理标题（去掉日期前缀）
    title = clean_title(adname)
    
    print(f"原始adname: {adname}")
    print(f"清理后标题: {title}")
    print(f"author: {author}")
    
    # 输出目录
    output_dir = f"{adname}_images"
    
    # 清理输出目录
    if os.path.exists(output_dir):
        shutil.rmtree(output_dir)
    os.makedirs(output_dir)
    
    # 获取字幕
    # subtitles = get_subtitles(adid, db_path)
    print(f"找到 {len(subs)} 句字幕")
    
    if not subs:
        print("错误：未找到字幕信息")
        return False
    
    # 配置字体
    try:
        title_font = ImageFont.truetype("simsun.ttc", 42)
        subtitle_font = ImageFont.truetype("simsun.ttc", 34)
        cn_font = ImageFont.truetype("simsun.ttc", 40)  # 中文字幕减一号字
        en_font = ImageFont.truetype("arial.ttf", 48)
    except Exception as e:
        print(f"字体加载失败: {e}")
        return False
    
    # 背景尺寸：竖屏 544x960
    width, height = 544, 960
    
    # 生成图片
    for i, (idx, cn, en) in enumerate(subs):
        # 去掉字幕最后的标点
        if cn and (cn.endswith('，') or cn.endswith('。')):
            cn = cn[:-1]
        if en and (en.endswith(',') or en.endswith('.')):
            en = en[:-1]
        
        # 创建背景
        image = Image.new('RGB', (width, height), (0, 0, 0))
        draw = ImageDraw.Draw(image)
        
        # 绘制标题（下移四行，从100px移到170px）
        # 使用清理后的标题（去掉日期前缀）
        title_lines = wrap_text(title, 500, title_font)
        title_y = 170
        for line in title_lines:
            line_width = title_font.getbbox(line)[2] - title_font.getbbox(line)[0]
            x = (width - line_width) // 2
            draw.text((x, title_y), line, font=title_font, fill=(255, 255, 255))
            title_y += 53  # 标题行间距
        
        # 绘制副标题（与标题隔开一行，26px）
        subtitle = f"译自@{author}"
        subtitle_width = subtitle_font.getbbox(subtitle)[2] - subtitle_font.getbbox(subtitle)[0]
        x = (width - subtitle_width) // 2
        draw.text((x, title_y + 26), subtitle, font=subtitle_font, fill=(255, 255, 255))
        
        # 绘制中文字幕（与副标题隔开三行，80px）
        cn_y = title_y + 26 + 80
        cn_lines = wrap_text(cn, 500, cn_font)
        for line in cn_lines:
            line_width = cn_font.getbbox(line)[2] - cn_font.getbbox(line)[0]
            x = (width - line_width) // 2
            draw.text((x, cn_y), line, font=cn_font, fill=(255, 215, 0))  # 黄色
            cn_y += 57  # 行间距
        
        # 绘制英文字幕（与中文字幕隔开一行，26px）
        if en:
            en_y = cn_y + 26
            en_lines = wrap_text(en, 500, en_font)
            for line in en_lines:
                line_width = en_font.getbbox(line)[2] - en_font.getbbox(line)[0]
                x = (width - line_width) // 2
                draw.text((x, en_y), line, font=en_font, fill=(255, 255, 255))
                en_y += 61  # 行间距
        
        # 保存图片
        output_path = os.path.join(output_dir, f"vertical_subtitle_{idx:03d}.png")
        image.save(output_path)
        
        # 显示进度
        if (i) % 100 == 0:
            print(f"生成字幕图片 {i+1}/{len(subs)}")
    
    print(f"完成！生成了 {len(subs)} 张字幕图片")
    print(f"输出目录: {output_dir}")
    return True
def main():
    """主函数"""
    if len(sys.argv) != 2:
        print("用法: python generate_subtitles.py <adid>")
        print("示例: python generate_subtitles.py 8442")            
    try:
        adid = int(sys.argv[1])
    except Exception:
        print("错误：adid必须是数字")
        adid=281756
    print(f"=== 字幕图片生成工具 ===")
    print(f"adid: {adid}")
    
    # 复述图片相关规则和避坑
    print("\n【图片相关规则】")
    print("1. 图片尺寸：720x1280（竖屏）")
    print("2. 背景色：黑色")
    print("3. 标题：使用完整adname，白色，字号42，居中显示")
    print("4. 副标题：格式为'译自@作者名'，白色，字号34，位于标题下方26px")
    print("5. 中文字幕：黄色(255,215,0)，字号44，位于副标题下方130px")
    print("6. 英文字幕：白色，字号48，位于中文字幕下方26px")
    print("7. 字体：标题/副标题/中文用simsun.ttc，英文用arial.ttf")
    print("8. 折行：中文按字符，英文按单词")
    print("9. 标点处理：去掉句末标点（中文的，。和英文的,.）")
    print("10. 实时显示进度：每处理10个文件显示一次进度")
    
    print("\n【避坑记录】")
    print("- 错误3：Pillow的getsize()方法错误，已修复为使用getbbox()")
    print("- 错误8：英文文本最后一行单词间空格丢失，已修复为使用' '.join()")
    
    success = generate_subtitle_images(adid)
    
    if success:
        print("\n字幕图片生成完成！")
    else:
        print("\n字幕图片生成失败！")
        sys.exit(1)


if __name__ == "__main__":
    main()
