mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-09-06 16:07:01 +08:00
fix:静态类引用
This commit is contained in:
+15
-17
@@ -5,7 +5,6 @@ import threading
|
|||||||
import traceback
|
import traceback
|
||||||
from copy import deepcopy
|
from copy import deepcopy
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from queue import Queue
|
|
||||||
from time import sleep
|
from time import sleep
|
||||||
from typing import List, Optional, Tuple, Union, Dict, Callable
|
from typing import List, Optional, Tuple, Union, Dict, Callable
|
||||||
|
|
||||||
@@ -16,9 +15,9 @@ from app.chain.storage import StorageChain
|
|||||||
from app.chain.tmdb import TmdbChain
|
from app.chain.tmdb import TmdbChain
|
||||||
from app.core.config import settings, global_vars
|
from app.core.config import settings, global_vars
|
||||||
from app.core.context import MediaInfo
|
from app.core.context import MediaInfo
|
||||||
|
from app.core.event import eventmanager
|
||||||
from app.core.meta import MetaBase
|
from app.core.meta import MetaBase
|
||||||
from app.core.metainfo import MetaInfoPath
|
from app.core.metainfo import MetaInfoPath
|
||||||
from app.core.event import eventmanager
|
|
||||||
from app.db.downloadhistory_oper import DownloadHistoryOper
|
from app.db.downloadhistory_oper import DownloadHistoryOper
|
||||||
from app.db.models.downloadhistory import DownloadHistory
|
from app.db.models.downloadhistory import DownloadHistory
|
||||||
from app.db.models.transferhistory import TransferHistory
|
from app.db.models.transferhistory import TransferHistory
|
||||||
@@ -28,11 +27,11 @@ from app.helper.directory import DirectoryHelper
|
|||||||
from app.helper.format import FormatParser
|
from app.helper.format import FormatParser
|
||||||
from app.helper.progress import ProgressHelper
|
from app.helper.progress import ProgressHelper
|
||||||
from app.log import logger
|
from app.log import logger
|
||||||
|
from app.schemas import StorageOperSelectionEventData
|
||||||
from app.schemas import TransferInfo, TransferTorrent, Notification, EpisodeFormat, FileItem, TransferDirectoryConf, \
|
from app.schemas import TransferInfo, TransferTorrent, Notification, EpisodeFormat, FileItem, TransferDirectoryConf, \
|
||||||
TransferTask, TransferQueue, TransferJob, TransferJobTask
|
TransferTask, TransferQueue, TransferJob, TransferJobTask
|
||||||
from app.schemas.types import TorrentStatus, EventType, MediaType, ProgressKey, NotificationType, MessageChannel, \
|
from app.schemas.types import TorrentStatus, EventType, MediaType, ProgressKey, NotificationType, MessageChannel, \
|
||||||
SystemConfigKey, ChainEventType, ContentType
|
SystemConfigKey, ChainEventType, ContentType
|
||||||
from app.schemas import StorageOperSelectionEventData
|
|
||||||
from app.utils.singleton import Singleton
|
from app.utils.singleton import Singleton
|
||||||
from app.utils.string import StringUtils
|
from app.utils.string import StringUtils
|
||||||
|
|
||||||
@@ -213,6 +212,7 @@ class JobManager:
|
|||||||
set(self._season_episodes[mediaid]) - set(task.meta.episode_list)
|
set(self._season_episodes[mediaid]) - set(task.meta.episode_list)
|
||||||
)
|
)
|
||||||
return task
|
return task
|
||||||
|
return None
|
||||||
|
|
||||||
def remove_job(self, task: TransferTask) -> Optional[TransferJob]:
|
def remove_job(self, task: TransferTask) -> Optional[TransferJob]:
|
||||||
"""
|
"""
|
||||||
@@ -226,6 +226,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__)
|
||||||
return self._job_view.pop(__mediaid__)
|
return self._job_view.pop(__mediaid__)
|
||||||
|
return None
|
||||||
|
|
||||||
def is_done(self, task: TransferTask) -> bool:
|
def is_done(self, task: TransferTask) -> bool:
|
||||||
"""
|
"""
|
||||||
@@ -359,22 +360,18 @@ class TransferChain(ChainBase, metaclass=Singleton):
|
|||||||
文件整理处理链
|
文件整理处理链
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# 可处理的文件后缀
|
|
||||||
all_exts = settings.RMT_MEDIAEXT
|
|
||||||
|
|
||||||
# 待整理任务队列
|
|
||||||
_queue = Queue()
|
|
||||||
|
|
||||||
# 文件整理线程
|
|
||||||
_transfer_thread = None
|
|
||||||
|
|
||||||
# 队列间隔时间(秒)
|
|
||||||
_transfer_interval = 15
|
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
|
# 可处理的文件后缀
|
||||||
|
self.all_exts = settings.RMT_MEDIAEXT
|
||||||
|
# 待整理任务队列
|
||||||
|
self._queue = queue.Queue()
|
||||||
|
# 文件整理线程
|
||||||
|
self._transfer_thread = None
|
||||||
|
# 队列间隔时间(秒)
|
||||||
|
self._transfer_interval = 15
|
||||||
|
# 事件管理器
|
||||||
self.jobview = JobManager()
|
self.jobview = JobManager()
|
||||||
|
|
||||||
# 启动整理任务
|
# 启动整理任务
|
||||||
self.__init()
|
self.__init()
|
||||||
|
|
||||||
@@ -1101,7 +1098,8 @@ class TransferChain(ChainBase, metaclass=Singleton):
|
|||||||
# 自定义识别
|
# 自定义识别
|
||||||
if formaterHandler:
|
if formaterHandler:
|
||||||
# 开始集、结束集、PART
|
# 开始集、结束集、PART
|
||||||
begin_ep, end_ep, part = formaterHandler.split_episode(file_name=file_path.name, file_meta=file_meta)
|
begin_ep, end_ep, part = formaterHandler.split_episode(file_name=file_path.name,
|
||||||
|
file_meta=file_meta)
|
||||||
if begin_ep is not None:
|
if begin_ep is not None:
|
||||||
file_meta.begin_episode = begin_ep
|
file_meta.begin_episode = begin_ep
|
||||||
file_meta.part = part
|
file_meta.part = part
|
||||||
|
|||||||
+1
-3
@@ -69,9 +69,6 @@ class EventManager(metaclass=Singleton):
|
|||||||
EventManager 负责管理和调度广播事件和链式事件,包括订阅、发送和处理事件
|
EventManager 负责管理和调度广播事件和链式事件,包括订阅、发送和处理事件
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# 退出事件
|
|
||||||
__event = threading.Event()
|
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.__executor = ThreadHelper() # 动态线程池,用于消费事件
|
self.__executor = ThreadHelper() # 动态线程池,用于消费事件
|
||||||
self.__consumer_threads = [] # 用于保存启动的事件消费者线程
|
self.__consumer_threads = [] # 用于保存启动的事件消费者线程
|
||||||
@@ -81,6 +78,7 @@ class EventManager(metaclass=Singleton):
|
|||||||
self.__disabled_handlers = set() # 禁用的事件处理器集合
|
self.__disabled_handlers = set() # 禁用的事件处理器集合
|
||||||
self.__disabled_classes = set() # 禁用的事件处理器类集合
|
self.__disabled_classes = set() # 禁用的事件处理器类集合
|
||||||
self.__lock = threading.Lock() # 线程锁
|
self.__lock = threading.Lock() # 线程锁
|
||||||
|
self.__event = threading.Event() # 退出事件
|
||||||
|
|
||||||
def start(self):
|
def start(self):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -9,8 +9,6 @@ class CustomizationMatcher(metaclass=Singleton):
|
|||||||
"""
|
"""
|
||||||
识别自定义占位符
|
识别自定义占位符
|
||||||
"""
|
"""
|
||||||
customization = None
|
|
||||||
custom_separator = None
|
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.systemconfig = SystemConfigOper()
|
self.systemconfig = SystemConfigOper()
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ class ReleaseGroupsMatcher(metaclass=Singleton):
|
|||||||
"""
|
"""
|
||||||
识别制作组、字幕组
|
识别制作组、字幕组
|
||||||
"""
|
"""
|
||||||
__release_groups: str = None
|
|
||||||
# 内置组
|
# 内置组
|
||||||
RELEASE_GROUPS: dict = {
|
RELEASE_GROUPS: dict = {
|
||||||
"0ff": ['FF(?:(?:A|WE)B|CD|E(?:DU|B)|TV)'],
|
"0ff": ['FF(?:(?:A|WE)B|CD|E(?:DU|B)|TV)'],
|
||||||
|
|||||||
+4
-4
@@ -16,14 +16,14 @@ class ModuleManager(metaclass=Singleton):
|
|||||||
模块管理器
|
模块管理器
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# 模块列表
|
|
||||||
_modules: dict = {}
|
|
||||||
# 运行态模块列表
|
|
||||||
_running_modules: dict = {}
|
|
||||||
# 子模块类型集合
|
# 子模块类型集合
|
||||||
SubType = Union[DownloaderType, MediaServerType, MessageChannel, StorageSchema, OtherModulesType]
|
SubType = Union[DownloaderType, MediaServerType, MessageChannel, StorageSchema, OtherModulesType]
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
# 模块列表
|
||||||
|
self._modules: dict = {}
|
||||||
|
# 运行态模块列表
|
||||||
|
self._running_modules: dict = {}
|
||||||
self.load_modules()
|
self.load_modules()
|
||||||
|
|
||||||
def load_modules(self):
|
def load_modules(self):
|
||||||
|
|||||||
+9
-10
@@ -10,6 +10,7 @@ from concurrent.futures import ThreadPoolExecutor, as_completed
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Any, Dict, List, Optional, Type, Union, Callable, Tuple
|
from typing import Any, Dict, List, Optional, Type, Union, Callable, Tuple
|
||||||
|
|
||||||
|
from app.helper.sites import SitesHelper
|
||||||
from fastapi import HTTPException
|
from fastapi import HTTPException
|
||||||
from starlette import status
|
from starlette import status
|
||||||
from watchdog.events import FileSystemEventHandler
|
from watchdog.events import FileSystemEventHandler
|
||||||
@@ -21,7 +22,6 @@ from app.core.event import eventmanager, Event
|
|||||||
from app.db.plugindata_oper import PluginDataOper
|
from app.db.plugindata_oper import PluginDataOper
|
||||||
from app.db.systemconfig_oper import SystemConfigOper
|
from app.db.systemconfig_oper import SystemConfigOper
|
||||||
from app.helper.plugin import PluginHelper
|
from app.helper.plugin import PluginHelper
|
||||||
from app.helper.sites import SitesHelper
|
|
||||||
from app.log import logger
|
from app.log import logger
|
||||||
from app.schemas.types import EventType, SystemConfigKey
|
from app.schemas.types import EventType, SystemConfigKey
|
||||||
from app.utils.crypto import RSAUtils
|
from app.utils.crypto import RSAUtils
|
||||||
@@ -88,16 +88,15 @@ class PluginManager(metaclass=Singleton):
|
|||||||
插件管理器
|
插件管理器
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# 插件列表
|
|
||||||
_plugins: dict = {}
|
|
||||||
# 运行态插件列表
|
|
||||||
_running_plugins: dict = {}
|
|
||||||
# 配置Key
|
|
||||||
_config_key: str = "plugin.%s"
|
|
||||||
# 监听器
|
|
||||||
_observer: Observer = None
|
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
# 插件列表
|
||||||
|
self._plugins: dict = {}
|
||||||
|
# 运行态插件列表
|
||||||
|
self._running_plugins: dict = {}
|
||||||
|
# 配置Key
|
||||||
|
self._config_key: str = "plugin.%s"
|
||||||
|
# 监听器
|
||||||
|
self._observer: Observer = None
|
||||||
# 开发者模式监测插件修改
|
# 开发者模式监测插件修改
|
||||||
if settings.DEV or settings.PLUGIN_AUTO_RELOAD:
|
if settings.DEV or settings.PLUGIN_AUTO_RELOAD:
|
||||||
self.__start_monitor()
|
self.__start_monitor()
|
||||||
|
|||||||
@@ -13,10 +13,9 @@ class WorkFlowManager(metaclass=Singleton):
|
|||||||
工作流管理器
|
工作流管理器
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# 所有动作定义
|
|
||||||
_actions: Dict[str, Any] = {}
|
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
# 所有动作定义
|
||||||
|
self._actions: Dict[str, Any] = {}
|
||||||
self.init()
|
self.init()
|
||||||
|
|
||||||
def init(self):
|
def init(self):
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ import os
|
|||||||
|
|
||||||
|
|
||||||
class DisplayHelper(metaclass=Singleton):
|
class DisplayHelper(metaclass=Singleton):
|
||||||
_display: Display = None
|
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
if not SystemUtils.is_docker():
|
if not SystemUtils.is_docker():
|
||||||
|
|||||||
@@ -70,6 +70,9 @@ def enable_doh(enable: bool):
|
|||||||
|
|
||||||
|
|
||||||
class DohHelper(metaclass=Singleton):
|
class DohHelper(metaclass=Singleton):
|
||||||
|
"""
|
||||||
|
DoH帮助类,用于处理DNS over HTTPS解析。
|
||||||
|
"""
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
enable_doh(settings.DOH_ENABLE)
|
enable_doh(settings.DOH_ENABLE)
|
||||||
|
|
||||||
|
|||||||
+13
-16
@@ -59,26 +59,23 @@ class Monitor(metaclass=Singleton):
|
|||||||
目录监控处理链,单例模式
|
目录监控处理链,单例模式
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# 退出事件
|
|
||||||
_event = threading.Event()
|
|
||||||
|
|
||||||
# 监控服务
|
|
||||||
_observers = []
|
|
||||||
|
|
||||||
# 定时服务
|
|
||||||
_scheduler = None
|
|
||||||
|
|
||||||
# 存储快照缓存目录
|
|
||||||
_snapshot_cache_dir = None
|
|
||||||
|
|
||||||
# 存储过照间隔(分钟)
|
|
||||||
_snapshot_interval = 5
|
|
||||||
|
|
||||||
# TTL缓存,10秒钟有效
|
|
||||||
_cache = TTLCache(maxsize=1024, ttl=10)
|
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
|
# 退出事件
|
||||||
|
self._event = threading.Event()
|
||||||
|
# 监控服务
|
||||||
|
self._observers = []
|
||||||
|
# 定时服务
|
||||||
|
self._scheduler = None
|
||||||
|
# 存储快照缓存目录
|
||||||
|
self._snapshot_cache_dir = None
|
||||||
|
# 存储过照间隔(分钟)
|
||||||
|
self._snapshot_interval = 5
|
||||||
|
# TTL缓存,10秒钟有效
|
||||||
|
self._cache = TTLCache(maxsize=1024, ttl=10)
|
||||||
|
# 监控的文件扩展名
|
||||||
self.all_exts = settings.RMT_MEDIAEXT
|
self.all_exts = settings.RMT_MEDIAEXT
|
||||||
# 初始化快照缓存目录
|
# 初始化快照缓存目录
|
||||||
self._snapshot_cache_dir = settings.TEMP_PATH / "snapshots"
|
self._snapshot_cache_dir = settings.TEMP_PATH / "snapshots"
|
||||||
|
|||||||
+13
-13
@@ -40,20 +40,20 @@ class Scheduler(metaclass=Singleton):
|
|||||||
"""
|
"""
|
||||||
定时任务管理
|
定时任务管理
|
||||||
"""
|
"""
|
||||||
# 定时服务
|
|
||||||
_scheduler = None
|
|
||||||
# 退出事件
|
|
||||||
_event = threading.Event()
|
|
||||||
# 锁
|
|
||||||
_lock = threading.RLock()
|
|
||||||
# 各服务的运行状态
|
|
||||||
_jobs = {}
|
|
||||||
# 用户认证失败次数
|
|
||||||
_auth_count = 0
|
|
||||||
# 用户认证失败消息发送
|
|
||||||
_auth_message = False
|
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
# 定时服务
|
||||||
|
self._scheduler = None
|
||||||
|
# 退出事件
|
||||||
|
self._event = threading.Event()
|
||||||
|
# 锁
|
||||||
|
self._lock = threading.RLock()
|
||||||
|
# 各服务的运行状态
|
||||||
|
self._jobs = {}
|
||||||
|
# 用户认证失败次数
|
||||||
|
self._auth_count = 0
|
||||||
|
# 用户认证失败消息发送
|
||||||
|
self._auth_message = False
|
||||||
self.init()
|
self.init()
|
||||||
|
|
||||||
@eventmanager.register(EventType.ConfigChanged)
|
@eventmanager.register(EventType.ConfigChanged)
|
||||||
@@ -443,7 +443,7 @@ class Scheduler(metaclass=Singleton):
|
|||||||
return
|
return
|
||||||
with self._lock:
|
with self._lock:
|
||||||
job_id = f"workflow-{workflow.id}"
|
job_id = f"workflow-{workflow.id}"
|
||||||
service = self._jobs.pop(job_id, None)
|
service = self._jobs.pop(job_id, {})
|
||||||
if not service:
|
if not service:
|
||||||
return
|
return
|
||||||
try:
|
try:
|
||||||
|
|||||||
Reference in New Issue
Block a user