YoutubeScript / cli.py
Heebin Moon
Claude Opus 4.6
Initial commit: YouTube transcript formatter
a2749f3
Raw History Blame Contribute Delete
3.23 kB
#!/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()