diff --git a/pytchat/config/__init__.py b/pytchat/config/__init__.py index 1a84b59..a36d2b0 100644 --- a/pytchat/config/__init__.py +++ b/pytchat/config/__init__.py @@ -1,13 +1,11 @@ import logging from . import mylogger -LOGGER_MODE = None - headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36'} -def logger(module_name: str): - module_logger = mylogger.get_logger(module_name, mode = LOGGER_MODE) +def logger(module_name: str, loglevel = None): + module_logger = mylogger.get_logger(module_name, loglevel = loglevel) return module_logger diff --git a/pytchat/config/mylogger.py b/pytchat/config/mylogger.py index 83e325f..852d244 100644 --- a/pytchat/config/mylogger.py +++ b/pytchat/config/mylogger.py @@ -3,21 +3,21 @@ import logging import datetime -def get_logger(modname,mode=logging.DEBUG): +def get_logger(modname,loglevel=logging.DEBUG): logger = getLogger(modname) - if mode == None: + if loglevel == None: logger.addHandler(NullHandler()) return logger - logger.setLevel(mode) + logger.setLevel(loglevel) #create handler1 for showing info handler1 = StreamHandler() my_formatter = MyFormatter() handler1.setFormatter(my_formatter) - handler1.setLevel(mode) + handler1.setLevel(loglevel) logger.addHandler(handler1) #create handler2 for recording log file - if mode <= logging.DEBUG: + if loglevel <= logging.DEBUG: handler2 = FileHandler(filename="log.txt", encoding='utf-8') handler2.setLevel(logging.ERROR) handler2.setFormatter(my_formatter) diff --git a/pytchat/core_async/livechat.py b/pytchat/core_async/livechat.py index 17140f8..d22145f 100644 --- a/pytchat/core_async/livechat.py +++ b/pytchat/core_async/livechat.py @@ -17,7 +17,6 @@ from ..paramgen import liveparam, arcparam from ..processors.default.processor import DefaultProcessor from ..processors.combinator import Combinator -logger = config.logger(__name__) headers = config.headers MAX_RETRY = 10 @@ -74,6 +73,7 @@ class LiveChatAsync: ''' _setup_finished = False + _logger = config.logger(__name__) def __init__(self, video_id, seektime = 0, @@ -85,7 +85,8 @@ class LiveChatAsync: exception_handler = None, direct_mode = False, force_replay = False, - topchat_only = False + topchat_only = False, + logger = config.logger(__name__), ): self.video_id = video_id self.seektime = seektime @@ -107,6 +108,9 @@ class LiveChatAsync: self._first_fetch = True self._fetch_url = "live_chat/get_live_chat?continuation=" self._topchat_only = topchat_only + self._logger = logger + LiveChatAsync._logger = logger + if not LiveChatAsync._setup_finished: LiveChatAsync._setup_finished = True if exception_handler: @@ -185,14 +189,14 @@ class LiveChatAsync: continuation = metadata.get('continuation') except ChatParseException as e: #self.terminate() - logger.debug(f"[{self.video_id}]{str(e)}") + self._logger.debug(f"[{self.video_id}]{str(e)}") return except (TypeError , json.JSONDecodeError) : #self.terminate() - logger.error(f"{traceback.format_exc(limit = -1)}") + self._logger.error(f"{traceback.format_exc(limit = -1)}") return - logger.debug(f"[{self.video_id}]finished fetching chat.") + self._logger.debug(f"[{self.video_id}]finished fetching chat.") async def _check_pause(self, continuation): if self._pauser.empty(): @@ -252,7 +256,7 @@ class LiveChatAsync: await asyncio.sleep(1) continue else: - logger.error(f"[{self.video_id}]" + self._logger.error(f"[{self.video_id}]" f"Exceeded retry count. status_code={status_code}") return None return livechat_json @@ -307,7 +311,7 @@ class LiveChatAsync: try: self.terminate() except CancelledError: - logger.debug(f'[{self.video_id}]cancelled:{sender}') + self._logger.debug(f'[{self.video_id}]cancelled:{sender}') def terminate(self): ''' @@ -317,7 +321,7 @@ class LiveChatAsync: if self._direct_mode == False: #bufferにダミーオブジェクトを入れてis_alive()を判定させる self._buffer.put_nowait({'chatdata':'','timeout':0}) - logger.info(f'[{self.video_id}]finished.') + self._logger.info(f'[{self.video_id}]finished.') @classmethod def _set_exception_handler(cls, handler): @@ -326,12 +330,12 @@ class LiveChatAsync: @classmethod async def shutdown(cls, event, sig = None, handler=None): - logger.debug("shutdown...") + cls._logger.debug("shutdown...") tasks = [t for t in asyncio.all_tasks() if t is not asyncio.current_task()] [task.cancel() for task in tasks] - logger.debug(f"complete remaining tasks...") + cls._logger.debug(f"complete remaining tasks...") await asyncio.gather(*tasks,return_exceptions=True) loop = asyncio.get_event_loop() loop.stop() \ No newline at end of file diff --git a/pytchat/core_multithread/livechat.py b/pytchat/core_multithread/livechat.py index 71662e7..e2b0136 100644 --- a/pytchat/core_multithread/livechat.py +++ b/pytchat/core_multithread/livechat.py @@ -16,7 +16,6 @@ from ..paramgen import liveparam, arcparam from ..processors.default.processor import DefaultProcessor from ..processors.combinator import Combinator -logger = config.logger(__name__) headers = config.headers MAX_RETRY = 10 @@ -74,7 +73,9 @@ class LiveChat: _setup_finished = False #チャット監視中のListenerのリスト - _listeners= [] + _listeners = [] + _logger = config.logger(__name__) + def __init__(self, video_id, seektime = 0, processor = DefaultProcessor(), @@ -84,7 +85,8 @@ class LiveChat: done_callback = None, direct_mode = False, force_replay = False, - topchat_only = False + topchat_only = False, + logger = config.logger(__name__) ): self.video_id = video_id self.seektime = seektime @@ -106,6 +108,8 @@ class LiveChat: self._first_fetch = True self._fetch_url = "live_chat/get_live_chat?continuation=" self._topchat_only = topchat_only + self._logger = logger + LiveChat._logger = logger if not LiveChat._setup_finished: LiveChat._setup_finished = True if interruptable: @@ -115,7 +119,6 @@ class LiveChat: LiveChat._listeners.append(self) def _setup(self): - #logger.debug("setup") #direct modeがTrueでcallback未設定の場合例外発生。 if self._direct_mode: if self._callback is None: @@ -181,13 +184,13 @@ class LiveChat: time.sleep(diff_time if diff_time > 0 else 0) continuation = metadata.get('continuation') except ChatParseException as e: - logger.debug(f"[{self.video_id}]{str(e)}") + self._logger.debug(f"[{self.video_id}]{str(e)}") return except (TypeError , json.JSONDecodeError) : - logger.error(f"{traceback.format_exc(limit = -1)}") + self._logger.error(f"{traceback.format_exc(limit = -1)}") return - logger.debug(f"[{self.video_id}]finished fetching chat.") + self._logger.debug(f"[{self.video_id}]finished fetching chat.") def _check_pause(self, continuation): if self._pauser.empty(): @@ -244,7 +247,7 @@ class LiveChat: time.sleep(1) continue else: - logger.error(f"[{self.video_id}]" + self._logger.error(f"[{self.video_id}]" f"Exceeded retry count. status_code={status_code}") return None return livechat_json @@ -299,7 +302,7 @@ class LiveChat: try: self.terminate() except CancelledError: - logger.debug(f'[{self.video_id}]cancelled:{sender}') + self._logger.debug(f'[{self.video_id}]cancelled:{sender}') def terminate(self): ''' @@ -309,10 +312,10 @@ class LiveChat: if self._direct_mode == False: #bufferにダミーオブジェクトを入れてis_alive()を判定させる self._buffer.put({'chatdata':'','timeout':0}) - logger.info(f'[{self.video_id}]finished.') + self._logger.info(f'[{self.video_id}]finished.') @classmethod def shutdown(cls, event, sig = None, handler=None): - logger.debug("shutdown...") + cls._logger.debug("shutdown...") for t in LiveChat._listeners: t._is_alive = False \ No newline at end of file diff --git a/pytchat/parser/live.py b/pytchat/parser/live.py index b7b0614..7429e50 100644 --- a/pytchat/parser/live.py +++ b/pytchat/parser/live.py @@ -5,16 +5,12 @@ Parser of live chat JSON. """ import json -from .. import config from .. exceptions import ( ResponseContextError, NoContentsException, NoContinuationsException, ChatParseException ) - -logger = config.logger(__name__) - class Parser: __slots__ = ['is_replay'] @@ -65,8 +61,7 @@ class Parser: raise ChatParseException('Finished chat data') unknown = list(cont.keys())[0] if unknown: - logger.debug(f"Received unknown continuation type:{unknown}") - metadata = cont.get(unknown) + raise ChatParseException(f"Received unknown continuation type:{unknown}") else: raise ChatParseException('Cannot extract continuation data') return self._create_data(metadata, contents)