"""애니메이션 도구 테스트 — API 파싱 + 제목 매칭 검증."""
import asyncio
import sys
import os
import io
if sys.stdout.encoding != "utf-8":
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace")
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
async def test_anissia():
"""Anissia API 테스트."""
print("=== Anissia API Test ===")
from tools.anissia_client import AnissiaClient
client = AnissiaClient()
# 편성표 조회 (일요일)
schedule = await client.get_schedule(0)
print(f" 일요일 편성: {len(schedule)}개")
for a in schedule[:3]:
print(f" [{a.anime_no}] {a.subject} ({a.original_subject}) 자막:{a.caption_count}")
# 검색
results = await client.search_anime("프리렌")
print(f" '프리렌' 검색: {len(results)}건")
for a in results:
print(f" {a.subject} — {a.original_subject}")
# 자막 조회 (첫 번째 결과)
if schedule:
first = schedule[0]
captions = await client.get_captions(first.anime_no)
print(f" '{first.subject}' 자막: {len(captions)}명")
for c in captions:
print(f" {c.name} — {c.episode}화 — {c.website[:50] if c.website else '(없음)'}")
print(" ✅ Anissia OK\n")
async def test_nyaa():
"""Nyaa.si RSS 테스트."""
print("=== Nyaa RSS Test ===")
from tools.nyaa_client import NyaaClient
client = NyaaClient()
results = await client.search("Frieren")
print(f" 'Frieren ASW HEVC' 검색: {len(results)}건")
for t in results[:5]:
ep_str = f"{t.episode}화" if t.episode else "?"
print(f" [{t.group}] {ep_str} {t.size} seeders:{t.seeders}")
print(f" magnet: {t.magnet_link[:60]}...")
print(" ✅ Nyaa OK\n")
async def test_title_matcher():
"""제목 매칭 테스트."""
print("=== Title Matcher Test ===")
from tools.title_matcher import (
japanese_to_romaji, normalize_title, title_similarity,
make_nas_folder_name, get_quarter,
)
# 로마자 변환
tests = [
("葬送のフリーレン", "sousou no furiren"),
("鬼滅の刃", "kimetsu no yaiba"),
("ワンピース", "wanpisu"),
]
for jp, expected_approx in tests:
romaji = japanese_to_romaji(jp)
print(f" {jp} → {romaji} (기대: ~{expected_approx})")
# 유사도 계산
pairs = [
("Sousou no Frieren", "sousou no furiren"),
("Kimetsu no Yaiba", "kimetsu no yaiba"),
("완전 다른 제목", "completely different"),
]
for a, b in pairs:
sim = title_similarity(a, b)
print(f" 유사도 '{a}' vs '{b}': {sim:.2f}")
# NAS 폴더명
folder = make_nas_folder_name("장송의프리렌 2기", "2026-01-11")
print(f" NAS 폴더: {folder}")
assert folder == "[26_1분기]장송의프리렌 2기", f"Expected [26_1분기]장송의프리렌 2기, got {folder}"
# 분기 계산
q_tests = [
("2026-01-11", (26, 1)),
("2026-04-01", (26, 2)),
("2026-07-15", (26, 3)),
("2026-10-05", (26, 4)),
]
for date, expected in q_tests:
result = get_quarter(date)
assert result == expected, f"get_quarter({date}) = {result}, expected {expected}"
print(f" {date} → {result[0]}년 {result[1]}분기 ✓")
print(" ✅ Title Matcher OK\n")
async def test_subtitle_parser():
"""자막 파서 테스트 (HTML 파싱)."""
print("=== Subtitle Parser Test ===")
from tools.subtitle_downloader import (
parse_google_drive_links,
parse_tistory_links,
parse_naver_links,
)
# Google Drive 파싱
gdrive_html = '''
1화 자막
2화 자막
'''
gd_results = parse_google_drive_links(gdrive_html)
print(f" Google Drive 파싱: {len(gd_results)}건")
for r in gd_results:
print(f" {r.filename} → {r.download_url} (ep={r.episode})")
assert len(gd_results) >= 2, "Google Drive 파싱 실패"
# Tistory 파싱
tistory_html = '''
file.zip
'''
ts_results = parse_tistory_links(tistory_html)
print(f" Tistory 파싱: {len(ts_results)}건")
assert len(ts_results) >= 1, "Tistory 파싱 실패"
# Naver 파싱
naver_html = '''
다운로드
'''
nv_results = parse_naver_links(naver_html)
print(f" Naver 파싱: {len(nv_results)}건")
assert len(nv_results) >= 1, "Naver 파싱 실패"
print(" ✅ Subtitle Parser OK\n")
async def test_qbit_connection():
"""qBittorrent 연결 테스트."""
print("=== qBittorrent Connection Test ===")
from tools.qbit_client import QBitClient
client = QBitClient()
result = await client.test_connection()
if result["connected"]:
print(f" ✅ 연결 성공: v{result['version']} (API {result['api_version']})")
else:
print(f" ⚠️ 연결 실패: {result.get('error', '?')}")
print(f" URL: {result['url']}")
print(" (qBittorrent Web UI가 꺼져있을 수 있음)")
print()
async def main():
await test_title_matcher()
await test_subtitle_parser()
await test_anissia()
await test_nyaa()
await test_qbit_connection()
print("🎉 All tests completed!")
if __name__ == "__main__":
asyncio.run(main())