GPT Proto
Home/Skills/youtube-clipper

youtube-clipper

It helps you download long videos from YouTube, analyzes the video to provide a "long-to-short" editing proposal, and automatically adds bilingual Chinese and English subtitles.

Download for Windows

generate_summary.py

#!/usr/bin/env python3
"""
生成总结文案
基于章节信息生成适合社交媒体的文案
"""

import sys
import json
from pathlib import Path
from typing import Dict


def generate_summary(
    chapter_info: Dict,
    output_path: str = None
) -> str:
    """
    生成总结文案

    注意:此函数需要在 Claude Code Skill 环境中调用
    Claude 会自动处理文案生成逻辑

    Args:
        chapter_info: 章节信息,包含:
            - title: 章节标题
            - time_range: 时间范围
            - summary: 核心摘要
            - keywords: 关键词列表
        output_path: 输出文件路径(可选)

    Returns:
        str: 生成的文案
    """
    print(f"\n📝 生成总结文案...")
    print(f"   章节: {chapter_info.get('title', 'Unknown')}")

    # 输出章节信息(供 Claude 分析)
    print("\n" + "="*60)
    print("章节信息(JSON 格式):")
    print("="*60)
    print(json.dumps(chapter_info, indent=2, ensure_ascii=False))

    print("\n" + "="*60)
    print("文案生成要求:")
    print("="*60)
    print("""
请基于上述章节信息生成适合社交媒体的文案。

文案要求:
1. 吸引人的标题(10-20字)
2. 核心观点(3-5个要点,每个1-2句话)
3. 适合平台:
   - 小红书:口语化,有emoji,1000字以内
   - 抖音:精炼,突出金句,300字以内
   - 微信公众号:详细,结构清晰,不限字数

输出格式(Markdown):

# [标题]

## 核心观点

1. 观点1
2. 观点2
3. 观点3

## 适合平台

### 小红书版本(1000字)
[文案内容]

### 抖音版本(300字)
[文案内容]

### 微信公众号版本
[文案内容]

## 标签

#标签1 #标签2 #标签3
""")

    # 生成基础文案(占位符)
    summary_template = f"""# {chapter_info.get('title', '未命名章节')}

## 章节信息

- 时间范围: {chapter_info.get('time_range', 'N/A')}
- 核心摘要: {chapter_info.get('summary', 'N/A')}
- 关键词: {', '.join(chapter_info.get('keywords', []))}

## 核心观点

[待生成 - Claude 会在 Skill 执行时自动填充]

## 适合平台

### 小红书版本

[待生成]

### 抖音版本

[待生成]

### 微信公众号版本

[待生成]

## 标签

{' '.join(['#' + kw for kw in chapter_info.get('keywords', [])])}

---

生成时间: {chapter_info.get('generated_at', 'N/A')}
"""

    # 保存到文件(如果指定)
    if output_path:
        output_path = Path(output_path)
        output_path.parent.mkdir(parents=True, exist_ok=True)

        with open(output_path, 'w', encoding='utf-8') as f:
            f.write(summary_template)

        print(f"✅ 文案已保存: {output_path}")

    return summary_template


def load_chapter_info(json_path: str) -> Dict:
    """
    从 JSON 文件加载章节信息

    Args:
        json_path: JSON 文件路径

    Returns:
        Dict: 章节信息
    """
    json_path = Path(json_path)
    if not json_path.exists():
        raise FileNotFoundError(f"JSON file not found: {json_path}")

    print(f"📂 加载章节信息: {json_path.name}")

    with open(json_path, 'r', encoding='utf-8') as f:
        chapter_info = json.load(f)

    return chapter_info


def create_chapter_info(
    title: str,
    time_range: str,
    summary: str,
    keywords: list
) -> Dict:
    """
    创建章节信息字典

    Args:
        title: 章节标题
        time_range: 时间范围(如 "00:00 - 03:15")
        summary: 核心摘要
        keywords: 关键词列表

    Returns:
        Dict: 章节信息
    """
    from datetime import datetime

    return {
        'title': title,
        'time_range': time_range,
        'summary': summary,
        'keywords': keywords,
        'generated_at': datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    }


def main():
    """命令行入口"""
    if len(sys.argv) < 2:
        print("Usage: python generate_summary.py <chapter_info_json> [output_file]")
        print("   or: python generate_summary.py --create <title> <time_range> <summary> <keywords> [output_file]")
        print("\nArguments:")
        print("  chapter_info_json - 章节信息 JSON 文件路径")
        print("  output_file       - 输出文件路径(可选,默认为 summary.md)")
        print("\nCreate mode arguments:")
        print("  --create    - 创建模式")
        print("  title       - 章节标题")
        print("  time_range  - 时间范围(如 '00:00 - 03:15')")
        print("  summary     - 核心摘要")
        print("  keywords    - 关键词(逗号分隔)")
        print("\nExample:")
        print("  python generate_summary.py chapter.json")
        print("  python generate_summary.py chapter.json summary.md")
        print("  python generate_summary.py --create 'AGI指数曲线' '00:00-03:15' '核心摘要' 'AGI,指数增长,Claude' summary.md")
        sys.exit(1)

    try:
        if sys.argv[1] == '--create':
            # 创建模式
            if len(sys.argv) < 6:
                print("❌ 创建模式需要提供: title, time_range, summary, keywords")
                sys.exit(1)

            title = sys.argv[2]
            time_range = sys.argv[3]
            summary = sys.argv[4]
            keywords = sys.argv[5].split(',')
            output_file = sys.argv[6] if len(sys.argv) > 6 else 'summary.md'

            chapter_info = create_chapter_info(title, time_range, summary, keywords)

        else:
            # JSON 模式
            json_file = sys.argv[1]
            output_file = sys.argv[2] if len(sys.argv) > 2 else 'summary.md'

            chapter_info = load_chapter_info(json_file)

        # 生成文案
        summary = generate_summary(chapter_info, output_file)

        print("\n" + "="*60)
        print("生成的文案预览:")
        print("="*60)
        print(summary)

        print("\n⚠️  提示:此脚本需要在 Claude Code Skill 中运行")
        print("   Claude 会自动生成详细的文案内容")
        print("   当前仅输出模板")

    except Exception as e:
        print(f"\n❌ 错误: {str(e)}")
        import traceback
        traceback.print_exc()
        sys.exit(1)


if __name__ == "__main__":
    main()