fix(pipeline): 자막 중복 다운로드 방지 — NAS 실시간 스캔 + 파일명 비교 스킵
This commit is contained in:
@@ -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)
|
||||
|
||||
# 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)
|
||||
# offset이 있으면 시즌 상대 번호도 추가
|
||||
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:
|
||||
|
||||
Reference in New Issue
Block a user