diff --git a/core/manager.py b/core/manager.py index df2d7ca..cb2b42e 100644 --- a/core/manager.py +++ b/core/manager.py @@ -6,6 +6,7 @@ from common.items import TabInfo from config import ConfigManager from browser import BrowserManager from proxy import ProxyManager +from output import OutputManager _log = logging.getLogger("CoreManager") _log.setLevel(logging.DEBUG) @@ -15,6 +16,7 @@ class CoreManager(metaclass=Singleton): config_manager: "ConfigManager" browser_manager: "BrowserManager" proxy_manager: "ProxyManager" + output_manager: "OutputManager" def __del__(self): """ @@ -35,6 +37,13 @@ class CoreManager(metaclass=Singleton): pass finally: _log.debug("析构Mitm代理管理器完毕") + try: + _log.debug("析构输出管理器") + self.output_manager.terminate() + except: + pass + finally: + _log.debug("析构输出管理器完毕") def __init__(self): """ @@ -50,6 +59,9 @@ class CoreManager(metaclass=Singleton): _log.debug("初始化浏览器管理器") self.browser_manager = BrowserManager(self.config_manager) _log.info("初始化浏览器管理器完毕") + _log.debug("初始化输出管理器") + self.output_manager = OutputManager(self.config_manager) + _log.info("初始化输出管理器完毕") self._open_config_tabs() def restart(self): @@ -57,11 +69,28 @@ class CoreManager(metaclass=Singleton): self.__del__() self.__init__() - def open_tab(self, tab_info: "TabInfo"): + def open_tab(self, url: "str", tab_type: "int" = TabInfo.TAB_TYPE_OTHER): + tab_info = TabInfo() + tab_info.url = url + tab_info.tab_type = TabInfo.TAB_TYPE_LIVE self.browser_manager.open_tab(tab_info) - def close_tab(self, tab_info: "TabInfo"): - self.browser_manager.close_tab(tab_info) + def close_tab(self, url): + handler = self.browser_manager.find_tab_handler_by_url(url) + if handler is not None: + tab_info = TabInfo() + tab_info.tab_handler = handler + self.browser_manager.close_tab(tab_info) + + def refresh_tab(self, tab_info): + ... + + def on_broadcast(self, room_id: str): + live_url = "https://live.douyin.com/" + room_id + tab_info = TabInfo() + tab_info.url = live_url + tab_info.tab_type = TabInfo.TAB_TYPE_LIVE + self.browser_manager.create_or_refresh(tab_info) def _open_config_tabs(self): rooms = self.config_manager.config["douyin"]["rooms"] @@ -73,7 +102,4 @@ class CoreManager(metaclass=Singleton): live_url = "https://live.douyin.com/" + room else: live_url = room - tab_info = TabInfo() - tab_info.url = live_url - tab_info.tab_type = TabInfo.TAB_TYPE_LIVE - self.open_tab(tab_info) + self.open_tab(live_url, TabInfo.TAB_TYPE_LIVE) diff --git a/messages/base.py b/messages/base.py index 623d310..2d4f020 100644 --- a/messages/base.py +++ b/messages/base.py @@ -1,8 +1,3 @@ -import traceback -from datetime import datetime - -from config.helper import config - class Base: instance = None diff --git a/output/IOutput.py b/output/IOutput.py index d3dd3a1..89eecb9 100644 --- a/output/IOutput.py +++ b/output/IOutput.py @@ -1,43 +1,52 @@ -from messages.base import Base -from messages.chat import ChatMessage -from messages.control import ControlMessage -from messages.fansclub import FansclubMessage -from messages.gift import GiftMessage -from messages.like import LikeMessage -from messages.member import MemberMessage -from messages.roomuserseq import RoomUserSeqMessage -from messages.social import SocialMessage +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from messages.base import Base + from messages.chat import ChatMessage + from messages.control import ControlMessage + from messages.fansclub import FansclubMessage + from messages.gift import GiftMessage + from messages.like import LikeMessage + from messages.member import MemberMessage + from messages.roomuserseq import RoomUserSeqMessage + from messages.social import SocialMessage + from config import ConfigManager class IOutput(): + _config_manager: "ConfigManager" + def __del__(self): self.terminate() - def output(self, message_type: str, message_obj: Base): + def __init__(self, config_manager: "ConfigManager"): + self._config_manager = config_manager + + def output(self, message_type: str, message_obj: "Base"): ... - def chat_output(self, message: ChatMessage): + def chat_output(self, message: "ChatMessage"): ... - def like_output(self, message: LikeMessage): + def like_output(self, message: "LikeMessage"): ... - def member_output(self, message: MemberMessage): + def member_output(self, message: "MemberMessage"): ... - def social_output(self, message: SocialMessage): + def social_output(self, message: "SocialMessage"): ... - def gift_output(self, message: GiftMessage): + def gift_output(self, message: "GiftMessage"): ... - def userseq_output(self, message: RoomUserSeqMessage): + def userseq_output(self, message: "RoomUserSeqMessage"): ... - def control_output(self, message: ControlMessage): + def control_output(self, message: "ControlMessage"): ... - def fansclub_output(self, message: FansclubMessage): + def fansclub_output(self, message: "FansclubMessage"): ... def other_output(self, message_type: str, message_raw: bytes): diff --git a/output/__init__.py b/output/__init__.py index e69de29..d31de2b 100644 --- a/output/__init__.py +++ b/output/__init__.py @@ -0,0 +1 @@ +from .manager import OutputManager \ No newline at end of file diff --git a/output/debug.py b/output/debug.py index b83028b..7722883 100644 --- a/output/debug.py +++ b/output/debug.py @@ -2,17 +2,17 @@ import os import time import traceback -from config.helper import config from output.IOutput import IOutput class DebugWriter(IOutput): - def __init__(self): + def __init__(self, config_manager): + super(DebugWriter, self).__init__(config_manager) # 获取对应配置文件 - self.unknown_output_dir = config()['output']['debug']['save_path']['unknown'] + self.unknown_output_dir = self._config_manager.config['output']['debug']['save_path'] if not os.path.isdir(self.unknown_output_dir): os.makedirs(self.unknown_output_dir) - self.error_output_dir = config()['output']['debug']['save_path']['error'] + self.error_output_dir = os.path.join(self._config_manager.config['output']['debug']['save_path'], "error") if not os.path.isdir(self.error_output_dir): os.makedirs(self.error_output_dir) diff --git a/output/manager.py b/output/manager.py index 367dfd0..74f7f0c 100644 --- a/output/manager.py +++ b/output/manager.py @@ -2,7 +2,7 @@ import gzip import threading from typing import TYPE_CHECKING -from config.helper import config +from common import Singleton from messages.chat import ChatMessage from messages.control import ControlMessage from messages.fansclub import FansclubMessage @@ -21,9 +21,11 @@ if TYPE_CHECKING: from typing import Type, Optional, List from output.IOutput import IOutput from proxy.common import MessagePayload + from config import ConfigManager -class OutputManager(): +class OutputManager(metaclass=Singleton): + _config_manager: "ConfigManager" _mapping: "dict[str, Type[IOutput]]" = { "print": Print, "xml": XMLWriter, @@ -33,14 +35,15 @@ class OutputManager(): _thread: "Optional[threading.Thread]"= None _should_exit = threading.Event() - def __init__(self): - _config = config()['output']['use'] + def __init__(self, config_manager: "ConfigManager"): + self._config_manager = config_manager + _config = self._config_manager.config['output']['use'] if type(_config) != list: _config = [_config] for _c in _config: if _c not in self._mapping: raise Exception("不支持的输出方式") - self._writer.append(self._mapping[_c]()) + self._writer.append(self._mapping[_c](self._config_manager)) def __del__(self): self.terminate() diff --git a/output/xml.py b/output/xml.py index 151e475..e05df5c 100644 --- a/output/xml.py +++ b/output/xml.py @@ -1,4 +1,3 @@ -from config.helper import config from output.IOutput import IOutput from typing import IO import time @@ -9,10 +8,11 @@ class XMLWriter(IOutput): 可输出与B站弹幕姬兼容的xml弹幕格式,可用于转成ass字幕 """ - def __init__(self): + def __init__(self, config_manager): + super(XMLWriter, self).__init__(config_manager) self._file_mappings: "dict[str, IO[str]]" = {} self.time_mappings: "dict[str, float]" = {} - self._file_name_pattern: "str" = config()['output']['xml']['file_pattern'] + self._file_name_pattern: "str" = self._config_manager.config['output']['xml']['file_pattern'] def _get_fd_by_room_id(self, room_id: str) -> IO[str]: if room_id in self._file_mappings: