From 227e325db257ce1313c21412b61c15f0c80b31c1 Mon Sep 17 00:00:00 2001 From: projectdx Date: Mon, 29 Dec 2025 20:49:03 +0900 Subject: [PATCH] feat: Enhance download cancellation by storing downloader instance and refining cancellation status handling. --- lib/ffmpeg_queue_v1.py | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/lib/ffmpeg_queue_v1.py b/lib/ffmpeg_queue_v1.py index 955834d..41873fe 100644 --- a/lib/ffmpeg_queue_v1.py +++ b/lib/ffmpeg_queue_v1.py @@ -327,6 +327,17 @@ class FfmpegQueue(object): proxy=_proxy ) + # 다운로더 인스턴스를 entity에 저장 (취소 시 사용) + entity_ref.downloader = downloader + + # cancel 상태 체크 + if entity_ref.cancel: + downloader.cancel() + entity_ref.ffmpeg_status_kor = "취소됨" + entity_ref.refresh_status() + downloader_self.current_ffmpeg_count -= 1 + return + success, message = downloader.download() # 다운로드 완료 후 카운트 감소 @@ -399,10 +410,17 @@ class FfmpegQueue(object): except Exception as sub_err: logger.error(f"Subtitle download error: {sub_err}") else: - entity_ref.ffmpeg_status = -1 - entity_ref.ffmpeg_status_kor = f"실패: {message}" + # 취소된 경우와 실패를 구분 + if entity_ref.cancel or "Cancelled" in message: + entity_ref.ffmpeg_status = -1 + entity_ref.ffmpeg_status_kor = "취소됨" + entity_ref.ffmpeg_percent = 0 + logger.info(f"Download cancelled: {output_file_ref}") + else: + entity_ref.ffmpeg_status = -1 + entity_ref.ffmpeg_status_kor = f"실패" + logger.error(f"Download failed: {message}") entity_ref.refresh_status() - logger.error(f"Download failed: {message}") # 스레드 시작 download_thread = threading.Thread( @@ -641,7 +659,13 @@ class FfmpegQueue(object): ffmpeg.Ffmpeg.stop_by_idx(idx) except Exception as e: logger.debug(f"ffmpeg stop error (non-critical): {e}") - # 커스텀 다운로더의 경우 cancel 플래그만 설정 + # 커스텀 다운로더의 경우 downloader.cancel() 호출 + if hasattr(entity, 'downloader') and entity.downloader is not None: + try: + entity.downloader.cancel() + logger.info(f"Called downloader.cancel() for entity {entity_id}") + except Exception as e: + logger.debug(f"downloader cancel error: {e}") entity.cancel = True entity.ffmpeg_status_kor = "취소" entity.refresh_status()