diff --git a/app/doubansync.py b/app/doubansync.py index edf08571..81ea7dc9 100644 --- a/app/doubansync.py +++ b/app/doubansync.py @@ -25,6 +25,7 @@ class DoubanSync: downloader = None dbhelper = None subscribe = None + message = None _interval = None _auto_search = None _auto_rss = None @@ -33,6 +34,9 @@ class DoubanSync: _types = None def __init__(self): + self.init_config() + + def init_config(self): self.douban = DouBan() self.searcher = Searcher() self.downloader = Downloader() @@ -40,9 +44,6 @@ class DoubanSync: self.message = Message() self.dbhelper = DbHelper() self.subscribe = Subscribe() - self.init_config() - - def init_config(self): douban = Config().get_config('douban') if douban: # 同步间隔 diff --git a/app/helper/__init__.py b/app/helper/__init__.py index f3238006..51ea3a8a 100644 --- a/app/helper/__init__.py +++ b/app/helper/__init__.py @@ -1,4 +1,4 @@ -from .chrome_helper import ChromeHelper +from .chrome_helper import ChromeHelper, init_chrome from .indexer_helper import IndexerHelper, IndexerConf from .meta_helper import MetaHelper from .progress_helper import ProgressHelper diff --git a/app/helper/chrome_helper.py b/app/helper/chrome_helper.py index 8c9817a3..cabde330 100644 --- a/app/helper/chrome_helper.py +++ b/app/helper/chrome_helper.py @@ -238,3 +238,10 @@ class ChromeWithPrefs(uc.Chrome): # pylint: disable=protected-access # remove the experimental_options to avoid an error del options._experimental_options["prefs"] + + +def init_chrome(): + """ + 初始化chrome驱动 + """ + ChromeHelper().init_driver() diff --git a/app/plugins/__init__.py b/app/plugins/__init__.py new file mode 100644 index 00000000..c768bbd1 --- /dev/null +++ b/app/plugins/__init__.py @@ -0,0 +1 @@ +from .event_manager import EventManager, Event diff --git a/app/plugins/event_manager.py b/app/plugins/event_manager.py new file mode 100644 index 00000000..23f1c992 --- /dev/null +++ b/app/plugins/event_manager.py @@ -0,0 +1,109 @@ +from queue import Queue, Empty +from threading import Thread, Timer + +import log +from app.utils.commons import singleton + + +@singleton +class EventManager: + """ + 事件管理器 + """ + + def __init__(self): + # 事件队列 + self._eventQueue = Queue() + # 事件响应函数字典 + self._handlers = {} + # 事件处理线程 + self._thread = Thread(target=self.__run) + # 开关 + self._active = True + # 默认启动 + self.start() + + def __run(self): + """ + 事件处理线程 + """ + while self._active: + try: + event = self._eventQueue.get(block=True, timeout=1) + log.info(f"处理事件:{event}") + self.__process_event(event) + except Empty: + pass + + def __process_event(self, event): + """ + 处理事件 + """ + if event.etype in self._handlers: + for handler in self._handlers[event.etype]: + try: + handler(event) + except Exception as err: + log.error(f"处理事件出错:{err}") + + def start(self): + """ + 启动 + """ + # 将事件管理器设为启动 + self._active = True + # 启动事件处理线程 + log.info("事件管理器启动") + self._thread.start() + + def stop(self): + """ + 停止 + """ + # 将事件管理器设为停止 + self._active = False + # 等待事件处理线程退出 + log.info("【System】事件管理器停止") + self._thread.join() + + def add_event_listener(self, etype, handler): + """ + 注册事件处理 + """ + try: + handlerList = self._handlers[etype] + except KeyError: + handlerList = [] + self._handlers[etype] = handlerList + if handler not in handlerList: + handlerList.append(handler) + + def remove_event_listener(self, etype, handler): + """ + 移除监听器的处理函数 + """ + try: + handlerList = self._handlers[etype] + if handler in handlerList: + handlerList.remove(handler) + if not handlerList: + del self._handlers[etype] + except KeyError: + pass + + def send_event(self, event): + """ + 发送事件 + """ + self._eventQueue.put(event) + + +class Event: + """ + 事件对象 + """ + def __init__(self, etype=None): + # 事件类型 + self.etype = etype + # 字典用于保存具体的事件数据 + self.dict = {} diff --git a/app/rss.py b/app/rss.py index f22de7f3..d0324d3e 100644 --- a/app/rss.py +++ b/app/rss.py @@ -20,21 +20,22 @@ class Rss: _sites = [] filter = None media = None + sites = None downloader = None searcher = None dbhelper = None subscribe = None def __init__(self): + self.init_config() + + def init_config(self): self.media = Media() self.downloader = Downloader() self.sites = Sites() self.filter = Filter() self.dbhelper = DbHelper() self.subscribe = Subscribe() - self.init_config() - - def init_config(self): self._sites = self.sites.get_sites(rss=True) def rssdownload(self): diff --git a/app/searcher.py b/app/searcher.py index f4a828c3..6999f37f 100644 --- a/app/searcher.py +++ b/app/searcher.py @@ -20,15 +20,15 @@ class Searcher: _search_auto = True def __init__(self): + self.init_config() + + def init_config(self): self.downloader = Downloader() self.media = Media() self.message = Message() self.progress = ProgressHelper() self.dbhelper = DbHelper() self.indexer = Indexer() - self.init_config() - - def init_config(self): self._search_auto = Config().get_config("pt").get('search_auto', True) def search_medias(self, diff --git a/run.py b/run.py index 465d3de7..08604d4a 100644 --- a/run.py +++ b/run.py @@ -37,13 +37,14 @@ from web.main import App from app.utils import SystemUtils, ConfigLoadCache from app.utils.commons import INSTANCES from app.db import init_db, update_db, init_data -from app.helper import IndexerHelper, DisplayHelper, ChromeHelper +from app.helper import IndexerHelper, DisplayHelper, init_chrome from app.brushtask import BrushTask from app.rsschecker import RssChecker from app.scheduler import run_scheduler, restart_scheduler from app.sync import run_monitor, restart_monitor from app.torrentremover import TorrentRemover from app.speedlimiter import SpeedLimiter +from app.plugins import EventManager from check_config import update_config, check_config from version import APP_VERSION @@ -124,9 +125,8 @@ def start_service(): TorrentRemover() # 启动播放限速服务 SpeedLimiter() - # 初始化浏览器驱动 - if not is_windows_exe: - ChromeHelper().init_driver() + # 启动事件管理器 + EventManager() def monitor_config(): @@ -194,6 +194,9 @@ if __name__ == '__main__': if len(os.popen("tasklist| findstr %s" % os.path.basename(sys.executable), 'r').read().splitlines()) <= 2: p1 = threading.Thread(target=traystart, daemon=True) p1.start() + else: + # 初始化浏览器驱动 + init_chrome() # gunicorn 启动 App.run(**get_run_config()) diff --git a/web/backend/wallpaper.py b/web/backend/wallpaper.py index 2a64b5c7..2bced329 100644 --- a/web/backend/wallpaper.py +++ b/web/backend/wallpaper.py @@ -15,7 +15,7 @@ def get_login_wallpaper(today=datetime.datetime.strftime(datetime.datetime.now() wallpaper = Config().get_config('app').get('wallpaper') tmdbkey = Config().get_config('app').get('rmt_tmdbkey') if (not wallpaper or wallpaper == "themoviedb") and tmdbkey: - img_url = __get_themoviedb_wallpaper(today) + img_url = __get_themoviedb_wallpaper() else: img_url = __get_bing_wallpaper(today) if img_url: @@ -25,7 +25,7 @@ def get_login_wallpaper(today=datetime.datetime.strftime(datetime.datetime.now() return "" -def __get_themoviedb_wallpaper(today): +def __get_themoviedb_wallpaper(): """ 获取TheMovieDb的随机背景图 """