File size: 3,233 Bytes
a2749f3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#!/usr/bin/env python3
"""YouTube Script Extractor - CLI."""

import argparse
import os
import sys

from dotenv import load_dotenv

load_dotenv()

from transcriber import process_video


def main():
    parser = argparse.ArgumentParser(
        description="YouTube ์˜์ƒ์—์„œ ์Œ์„ฑ์ธ์‹์œผ๋กœ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.",
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog="""
์‚ฌ์šฉ ์˜ˆ์‹œ:
  # Whisper API ์‚ฌ์šฉ (๋น ๋ฅด๊ณ  ์ •ํ™•)
  python cli.py "https://www.youtube.com/watch?v=..." --mode api

  # ๋กœ์ปฌ Whisper ์‚ฌ์šฉ (๋ฌด๋ฃŒ)
  python cli.py "https://www.youtube.com/watch?v=..." --mode local --model base

  # SRT ์ž๋ง‰๋งŒ ์ƒ์„ฑ
  python cli.py "https://www.youtube.com/watch?v=..." --format srt

  # ์ถœ๋ ฅ ๋””๋ ‰ํ† ๋ฆฌ ์ง€์ •
  python cli.py "https://www.youtube.com/watch?v=..." --output ./my_scripts
        """,
    )

    parser.add_argument("url", help="YouTube ์˜์ƒ URL")
    parser.add_argument(
        "--mode",
        choices=["api", "local"],
        default=os.environ.get("DEFAULT_MODE", "api"),
        help="๋ณ€ํ™˜ ๋ชจ๋“œ (๊ธฐ๋ณธ: api)",
    )
    parser.add_argument(
        "--api-key",
        default=None,
        help="OpenAI API ํ‚ค (๋ฏธ์ง€์ • ์‹œ OPENAI_API_KEY ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์‚ฌ์šฉ)",
    )
    parser.add_argument(
        "--model",
        default=os.environ.get("DEFAULT_MODEL", "base"),
        choices=["tiny", "base", "small", "medium", "large"],
        help="๋กœ์ปฌ Whisper ๋ชจ๋ธ ํฌ๊ธฐ (๊ธฐ๋ณธ: base)",
    )
    parser.add_argument(
        "--format",
        default="txt,srt",
        help="์ถœ๋ ฅ ํ˜•์‹, ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„ (๊ธฐ๋ณธ: txt,srt)",
    )
    parser.add_argument(
        "--output",
        default="./output",
        help="์ถœ๋ ฅ ๋””๋ ‰ํ† ๋ฆฌ (๊ธฐ๋ณธ: ./output)",
    )

    args = parser.parse_args()

    # API ํ‚ค ์ฒ˜๋ฆฌ
    api_key = args.api_key or os.environ.get("OPENAI_API_KEY")
    if args.mode == "api" and not api_key:
        print("์˜ค๋ฅ˜: API ๋ชจ๋“œ์—์„œ๋Š” OpenAI API ํ‚ค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.")
        print("  --api-key ์ธ์ž๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ OPENAI_API_KEY ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜์„ธ์š”.")
        sys.exit(1)

    formats = [f.strip() for f in args.format.split(",")]

    def on_progress(msg: str):
        print(f"  โ†’ {msg}")

    print(f"YouTube Script Extractor")
    print(f"  URL: {args.url}")
    print(f"  ๋ชจ๋“œ: {'Whisper API' if args.mode == 'api' else f'๋กœ์ปฌ Whisper ({args.model})'}")
    print(f"  ์ถœ๋ ฅ: {', '.join(formats)}")
    print()

    try:
        result = process_video(
            url=args.url,
            mode=args.mode,
            api_key=api_key,
            model_size=args.model,
            output_dir=args.output,
            formats=formats,
            on_progress=on_progress,
        )

        print()
        print(f"์ œ๋ชฉ: {result['title']}")
        print(f"๊ฐ์ง€๋œ ์–ธ์–ด: {result['language']}")
        print(f"์ƒ์„ฑ๋œ ํŒŒ์ผ:")
        for fmt, path in result["files"].items():
            print(f"  [{fmt.upper()}] {path}")

    except KeyboardInterrupt:
        print("\n์ค‘๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.")
        sys.exit(130)
    except Exception as e:
        print(f"\n์˜ค๋ฅ˜ ๋ฐœ์ƒ: {e}")
        sys.exit(1)


if __name__ == "__main__":
    main()