diff --git a/tools/anime_pipeline.py b/tools/anime_pipeline.py index 06ae448..599d995 100644 --- a/tools/anime_pipeline.py +++ b/tools/anime_pipeline.py @@ -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: