fix jobview

This commit is contained in:
jxxghp
2024-12-25 08:24:57 +08:00
parent 5bfa36418b
commit b9756db115
+66 -31
View File
@@ -1,10 +1,12 @@
import queue import queue
import re import re
import threading import threading
from copy import deepcopy
from pathlib import Path from pathlib import Path
from queue import Queue from queue import Queue
from typing import List, Optional, Tuple, Union, Dict, Callable, Any from typing import List, Optional, Tuple, Union, Dict, Callable, Any
from app import schemas
from app.chain import ChainBase from app.chain import ChainBase
from app.chain.media import MediaChain from app.chain.media import MediaChain
from app.chain.storage import StorageChain from app.chain.storage import StorageChain
@@ -41,13 +43,20 @@ class JobManager:
# 整理中的作业 # 整理中的作业
""" """
{ {
meidaid: [{ meidaid: {
"task": TransferTask, "media": schema.MediaInfo,
"state": "running" | "waiting" | "failed" | "completed", "season": int,
}] "tasks": [
{
"fileitem": schema.FileItem,
"meta": schema.MetaBase,
"state": "running" | "waiting" | "failed" | "completed",
}
]
}
} }
""" """
_job_view: Dict[Tuple, List[Dict[str, Any]]] = {} _job_view: Dict[Tuple, Dict[str, Any]] = {}
# 汇总季集清单 # 汇总季集清单
_season_episodes: Dict[Tuple, List[int]] = {} _season_episodes: Dict[Tuple, List[int]] = {}
@@ -65,21 +74,46 @@ class JobManager:
else: else:
return media.tmdb_id or media.douban_id, season return media.tmdb_id or media.douban_id, season
@staticmethod
def __get_media(task: TransferTask) -> schemas.MediaInfo:
"""
获取媒体信息
"""
mediainfo = deepcopy(task.mediainfo)
mediainfo.clear()
return schemas.MediaInfo(**mediainfo.to_dict())
@staticmethod
def __get_meta(task: TransferTask) -> schemas.MetaInfo:
"""
获取元数据
"""
return schemas.MetaInfo(**task.meta.to_dict())
def add_task(self, task: TransferTask): def add_task(self, task: TransferTask):
""" """
添加整理任务 添加整理任务
""" """
if not task or not task.mediainfo or not task.meta: if not any([task, task.mediainfo, task.meta, task.fileitem]):
return return
with job_lock: with job_lock:
__mediaid__ = self.__get_id(task) __mediaid__ = self.__get_id(task)
if __mediaid__ not in self._job_view: if __mediaid__ not in self._job_view:
self._job_view[__mediaid__] = [] self._job_view[__mediaid__] = {
# 添加任务 "media": self.__get_media(task),
self._job_view[__mediaid__].append({ "season": task.meta.begin_season,
"task": task, "tasks": [{
"state": "waiting" "state": "waiting",
}) "fileitem": task.fileitem,
"meta": self.__get_meta(task)
}]
}
else:
self._job_view[__mediaid__]["tasks"].append({
"state": "waiting",
"fileitem": task.fileitem,
"meta": self.__get_meta(task)
})
# 添加季集信息 # 添加季集信息
if self._season_episodes.get(__mediaid__): if self._season_episodes.get(__mediaid__):
self._season_episodes[__mediaid__].extend(task.meta.episode_list) self._season_episodes[__mediaid__].extend(task.meta.episode_list)
@@ -91,15 +125,13 @@ class JobManager:
""" """
任务运行中 任务运行中
""" """
if not task or not task.mediainfo or not task.meta:
return
with job_lock: with job_lock:
__mediaid__ = self.__get_id(task) __mediaid__ = self.__get_id(task)
if __mediaid__ not in self._job_view: if __mediaid__ not in self._job_view:
return return
# 更新状态 # 更新状态
for job in self._job_view[__mediaid__]: for job in self._job_view[__mediaid__]["tasks"]:
if job["task"] == task: if job["fileitem"] == task.fileitem:
job["state"] = "running" job["state"] = "running"
break break
@@ -107,15 +139,13 @@ class JobManager:
""" """
任务完成 任务完成
""" """
if not task or not task.mediainfo or not task.meta:
return
with job_lock: with job_lock:
__mediaid__ = self.__get_id(task) __mediaid__ = self.__get_id(task)
if __mediaid__ not in self._job_view: if __mediaid__ not in self._job_view:
return return
# 更新状态 # 更新状态
for job in self._job_view[__mediaid__]: for job in self._job_view[__mediaid__]["tasks"]:
if job["task"] == task: if job["fileitem"] == task.fileitem:
job["state"] = "completed" job["state"] = "completed"
break break
@@ -130,16 +160,17 @@ class JobManager:
if __mediaid__ not in self._job_view: if __mediaid__ not in self._job_view:
return return
# 更新状态 # 更新状态
for job in self._job_view[__mediaid__]: for job in self._job_view[__mediaid__]["tasks"]:
if job["task"] == task: if job["fileitem"] == task.fileitem:
job["state"] = "failed" job["state"] = "failed"
break break
# 移除剧集信息 # 移除剧集信息
if __mediaid__ in self._season_episodes: if __mediaid__ in self._season_episodes:
self._season_episodes[__mediaid__] = list( self._season_episodes[__mediaid__] = list(
set(self._season_episodes[__mediaid__]) - set(task.meta.episode_list)) set(self._season_episodes[__mediaid__]) - set(task.meta.episode_list)
)
def remove_job(self, media: MediaInfo, season: int = None) -> Optional[List[Dict[str, Any]]]: def remove_job(self, media: MediaInfo, season: int = None) -> Optional[Dict[str, Any]]:
""" """
移除作业 移除作业
""" """
@@ -154,7 +185,7 @@ class JobManager:
if __mediaid__ in self._season_episodes: if __mediaid__ in self._season_episodes:
self._season_episodes.pop(__mediaid__) self._season_episodes.pop(__mediaid__)
def is_finished(self, media: MediaInfo, season: int = None): def is_finished(self, media: MediaInfo, season: int = None) -> bool:
""" """
任务检查某项任务是否全部为已完成状态 任务检查某项任务是否全部为已完成状态
""" """
@@ -162,22 +193,22 @@ class JobManager:
return False return False
__mediaid__ = self.__get_id(media=media, season=season) __mediaid__ = self.__get_id(media=media, season=season)
if __mediaid__ not in self._job_view: if __mediaid__ not in self._job_view:
return True return False
with job_lock: with job_lock:
return all([job["state"] in ["completed", "failed"] for job in self._job_view[__mediaid__]]) return all([job["state"] == "completed" for job in self._job_view[__mediaid__]["tasks"]])
def total(self): def total(self) -> int:
""" """
获取所有task任务总数 获取所有task任务总数
""" """
with job_lock: with job_lock:
return sum([len(jobs) for jobs in self._job_view.values()]) return sum([len(jobs) for jobs in self._job_view.values()])
def list_jobs(self) -> Dict: def list_jobs(self) -> List[dict]:
""" """
获取任务列表 获取任务列表
""" """
return self._job_view return list(self._job_view.values())
def season_episodes(self, media: MediaInfo, season: int = None) -> List[int]: def season_episodes(self, media: MediaInfo, season: int = None) -> List[int]:
""" """
@@ -301,7 +332,11 @@ class TransferChain(ChainBase, metaclass=Singleton):
if transferinfo.need_notify: if transferinfo.need_notify:
se_str = None se_str = None
if task.mediainfo.type == MediaType.TV: if task.mediainfo.type == MediaType.TV:
se_str = f"{task.meta.season} {StringUtils.format_ep(self.jobview.season_episodes(task.mediainfo, task.meta.begin_season))}" season_episodes = self.jobview.season_episodes(task.mediainfo, task.meta.begin_season)
if season_episodes:
se_str = f"{task.meta.season} {StringUtils.format_ep(season_episodes)}"
else:
se_str = f"{task.meta.season}"
self.send_transfer_message(meta=task.meta, self.send_transfer_message(meta=task.meta,
mediainfo=task.mediainfo, mediainfo=task.mediainfo,
transferinfo=transferinfo, transferinfo=transferinfo,