4646class JobManager :
4747 """
4848 作业管理器
49+ task任务负责一个文件的整理,job作业负责一个媒体的整理
4950 """
5051
5152 # 整理中的作业
@@ -111,7 +112,7 @@ def __get_meta(task: TransferTask) -> schemas.MetaInfo:
111112
112113 def add_task (self , task : TransferTask , state : Optional [str ] = "waiting" ):
113114 """
114- 添加整理任务
115+ 添加整理任务,自动分组到对应的作业中
115116 """
116117 if not any ([task , task .meta , task .fileitem ]):
117118 return
@@ -165,7 +166,7 @@ def running_task(self, task: TransferTask):
165166
166167 def finish_task (self , task : TransferTask ):
167168 """
168- 设置任务为完成
169+ 设置任务为完成/成功
169170 """
170171 with job_lock :
171172 __mediaid__ = self .__get_id (task )
@@ -198,7 +199,7 @@ def fail_task(self, task: TransferTask):
198199
199200 def remove_task (self , fileitem : FileItem ) -> Optional [TransferJobTask ]:
200201 """
201- 移除任务
202+ 根据文件项移除任务
202203 """
203204 with job_lock :
204205 for mediaid in list (self ._job_view ):
@@ -293,21 +294,33 @@ def is_success(self, task: TransferTask) -> bool:
293294 media_success = True
294295 return meta_success and media_success
295296
297+ def is_torrent_done (self , download_hash : str ) -> bool :
298+ """
299+ 检查指定种子的所有任务是否都已完成
300+ """
301+ with job_lock :
302+ for job in self ._job_view .values ():
303+ for task in job .tasks :
304+ if task .download_hash == download_hash :
305+ if task .state not in ["completed" , "failed" ]:
306+ return False
307+ return True
308+
296309 def has_tasks (self , meta : MetaBase , mediainfo : Optional [MediaInfo ] = None , season : Optional [int ] = None ) -> bool :
297310 """
298- 判断是否有任务正在处理
311+ 判断作业是否还有任务正在处理
299312 """
300313 if mediainfo :
301314 __mediaid__ = self .__get_media_id (media = mediainfo , season = season )
302315 if __mediaid__ in self ._job_view :
303316 return True
304317
305318 __metaid__ = self .__get_meta_id (meta = meta , season = season )
306- return __metaid__ in self ._job_view
319+ return __metaid__ in self ._job_view and len ( self . _job_view [ __metaid__ ]. tasks ) > 0
307320
308321 def success_tasks (self , media : MediaInfo , season : Optional [int ] = None ) -> List [TransferJobTask ]:
309322 """
310- 获取某项任务成功的任务
323+ 获取作业中所有成功的任务
311324 """
312325 __mediaid__ = self .__get_media_id (media = media , season = season )
313326 if __mediaid__ not in self ._job_view :
@@ -316,7 +329,7 @@ def success_tasks(self, media: MediaInfo, season: Optional[int] = None) -> List[
316329
317330 def all_tasks (self , media : MediaInfo , season : Optional [int ] = None ) -> List [TransferJobTask ]:
318331 """
319- 获取全部任务
332+ 获取作业中全部任务
320333 """
321334 __mediaid__ = self .__get_media_id (media = media , season = season )
322335 if __mediaid__ not in self ._job_view :
@@ -325,7 +338,7 @@ def all_tasks(self, media: MediaInfo, season: Optional[int] = None) -> List[Tran
325338
326339 def count (self , media : MediaInfo , season : Optional [int ] = None ) -> int :
327340 """
328- 获取作业成功总数
341+ 获取作业中成功总数
329342 """
330343 __mediaid__ = self .__get_media_id (media = media , season = season )
331344 if __mediaid__ not in self ._job_view :
@@ -334,7 +347,7 @@ def count(self, media: MediaInfo, season: Optional[int] = None) -> int:
334347
335348 def size (self , media : MediaInfo , season : Optional [int ] = None ) -> int :
336349 """
337- 获取作业成功文件总大小
350+ 获取作业中所有成功文件总大小
338351 """
339352 __mediaid__ = self .__get_media_id (media = media , season = season )
340353 if __mediaid__ not in self ._job_view :
@@ -355,13 +368,13 @@ def total(self) -> int:
355368
356369 def list_jobs (self ) -> List [TransferJob ]:
357370 """
358- 获取所有任务列表
371+ 获取所有作业的任务列表
359372 """
360373 return list (self ._job_view .values ())
361374
362375 def season_episodes (self , media : MediaInfo , season : Optional [int ] = None ) -> List [int ]:
363376 """
364- 获取季集清单
377+ 获取作业的季集清单
365378 """
366379 __mediaid__ = self .__get_media_id (media = media , season = season )
367380 return self ._season_episodes .get (__mediaid__ ) or []
@@ -627,10 +640,15 @@ def __notify():
627640 if self .jobview .is_done (task ):
628641 # 查询作业中的所有任务
629642 tasks = self .jobview .all_tasks (task .mediainfo , task .meta .begin_season )
643+ processed_hashes = set ()
630644 for t in tasks :
631- if t .download_hash :
632- # 设置种子状态为已整理
633- self .transfer_completed (hashs = t .download_hash , downloader = t .downloader )
645+ if t .download_hash and t .download_hash not in processed_hashes :
646+ # 检查该种子的所有任务(跨作业)是否都已完成
647+ if self .jobview .is_torrent_done (t .download_hash ):
648+ # 设置种子状态为已整理
649+ self .transfer_completed (hashs = t .download_hash , downloader = t .downloader )
650+ # 记录已处理的哈希,避免重复处理
651+ processed_hashes .add (t .download_hash )
634652 # 清理作业
635653 self .jobview .remove_job (task )
636654
0 commit comments