Files
guitar_score/test_pipeline.py

110 lines
3.4 KiB
Python

#!/usr/bin/env python3
"""로컬 캐시된 mp4 파일로 파이프라인 테스트 (다운로드 스킵)
1080p 다운로드 모드: python test_pipeline.py --download
"""
import sys
import os
from pathlib import Path
import importlib.util
import argparse
import gc
# youtube_tab_to_pdf 모듈 임포트
spec = importlib.util.spec_from_file_location(
"pipeline", str(Path(__file__).parent / "youtube_tab_to_pdf.py"))
pipeline = importlib.util.module_from_spec(spec)
spec.loader.exec_module(pipeline)
# 테스트용 YouTube URLs
TEST_URLS = {
"video_1": "https://www.youtube.com/watch?v=x76IMSvWR0o", # 晴る
"video_2": "https://www.youtube.com/watch?v=90BWvJY6KbE", # 新宝島
"video_3": "https://www.youtube.com/watch?v=Ri9g4lwnrJQ", # 空奏列車
}
def test_video(mp4_path: Path, label: str):
"""단일 영상 테스트 — 다운로드 없이 로컬 파일 직접 사용"""
print(f"\n{'='*60}")
print(f"테스트: {label}")
print(f"파일: {mp4_path.name}")
print(f"{'='*60}")
output_dir = Path("output")
debug_dir = output_dir / "debug_frames" / label
debug_dir.mkdir(parents=True, exist_ok=True)
# Step 2: 프레임 추출
frames = pipeline.extract_frames(mp4_path)
# Step 3: 패턴 감지
pattern = pipeline.detect_pattern(frames)
# Step 4: 고유 프레임 추출
if pattern == "scroll":
unique = pipeline.extract_unique_scroll(frames)
elif pattern == "split":
unique = pipeline.extract_unique_split(frames)
else:
unique = pipeline.extract_unique_overlay(frames)
# Step 5: PDF 생성
pdf_path = output_dir / f"test_{label}.pdf"
pipeline.generate_pdf(unique, pdf_path, debug_dir=debug_dir)
print(f"\n결과: {pattern} / {len(unique)}개 고유 프레임")
return pattern, len(unique)
def download_test_videos():
"""1080p로 테스트 영상 다운로드"""
output_dir = Path("output")
output_dir.mkdir(exist_ok=True)
for label, url in TEST_URLS.items():
print(f"\n--- {label} 다운로드 ---")
try:
video_path, title = pipeline.download_video(url, output_dir)
print(f" → 완료: {video_path.name}")
except Exception as e:
print(f" → 실패: {e}")
def main():
parser = argparse.ArgumentParser()
parser.add_argument("--download", action="store_true",
help="1080p로 테스트 영상 다운로드")
args = parser.parse_args()
if args.download:
download_test_videos()
return
output_dir = Path("output")
mp4_files = sorted(output_dir.glob("*.mp4"))
if not mp4_files:
print("테스트할 영상(mp4)이 output 폴더에 없습니다.")
print(" → python test_pipeline.py --download 로 영상 다운로드")
sys.exit(1)
print(f"캐시된 영상 {len(mp4_files)}개 발견:")
for f in mp4_files:
print(f" - {f.name} ({f.stat().st_size / 1024 / 1024:.1f} MB)")
results = {}
for i, mp4 in enumerate(mp4_files):
label = f"video_{i+1}"
pattern, count = test_video(mp4, label)
results[label] = (mp4.name, pattern, count)
gc.collect() # 1080p 프레임 메모리 해제
print(f"\n{'='*60}")
print("전체 결과 요약:")
print(f"{'='*60}")
for label, (name, pattern, count) in results.items():
print(f" {label}: {pattern:8s}{count:4d}개 프레임 | {name[:40]}")
if __name__ == "__main__":
main()