fix(pipeline): 자막 중복 다운로드 방지 — NAS 실시간 스캔 + 파일명 비교 스킵

This commit is contained in:
2026-03-19 07:02:12 +09:00
parent 595c6ee676
commit f96c28a72d

View File

@@ -724,16 +724,23 @@ class AnimePipeline:
nas_folder = unit.nas_path
nas_folder.mkdir(parents=True, exist_ok=True)
# WorkUnit에서 기존 자막 에피소드 가져옴 (재스캔 없음)
# ── 기존 자막 에피소드 + 파일 집합 (NAS 실시간 스캔) ──
existing_sub_eps = set()
existing_sub_files: set[str] = set()
offset = unit.episode_offset
for sf in unit.existing_subs:
ep = self._extract_episode(sf)
if ep is not None:
existing_sub_eps.add(ep)
# offset이 있으면 시즌 상대 번호도 추가
if offset > 0 and ep > offset:
existing_sub_eps.add(ep - offset)
# resolve 시점의 캐시 대신 실제 NAS 폴더에서 현재 자막 파일 스캔
try:
for f in nas_folder.iterdir():
if f.suffix.lower() in SUB_EXTS and f.is_file():
existing_sub_files.add(f.name.lower())
ep = self._extract_episode(f.name)
if ep is not None:
existing_sub_eps.add(ep)
if offset > 0 and ep > offset:
existing_sub_eps.add(ep - offset)
except (OSError, PermissionError) as e:
logger.warning(f"NAS 자막 스캔 오류: {e}")
if existing_sub_eps:
logger.info(f"기존 자막 에피소드 (스킵): {sorted(existing_sub_eps)}")
@@ -771,11 +778,23 @@ class AnimePipeline:
logger.info(f"자막 스킵 (기존 존재): {sub.episode}화 - {sub.filename}")
continue
# 에피소드 번호를 모르는 경우: 파일명 직접 비교로 스킵
if sub.episode is None and sub.filename.lower() in existing_sub_files:
logger.info(f"자막 스킵 (파일명 존재): {sub.filename}")
continue
try:
await self.sub_downloader.download_file(sub, str(nas_folder))
path = await self.sub_downloader.download_file(sub, str(nas_folder))
result.subtitles.append(sub)
# 다운 후 실제 파일명으로 existing 갱신 (세션 내 중복 방지)
actual_name = Path(path).name
existing_sub_files.add(actual_name.lower())
if sub.episode is not None:
existing_sub_eps.add(sub.episode)
# 실제 파일명에서도 에피소드 추출해서 등록
actual_ep = self._extract_episode(actual_name)
if actual_ep is not None:
existing_sub_eps.add(actual_ep)
except Exception as e:
result.errors.append(f"자막 다운로드 실패 ({sub.filename}): {e}")
except Exception as e: