diff --git a/pytchat/__init__.py b/pytchat/__init__.py index 213ccdb..b87e086 100644 --- a/pytchat/__init__.py +++ b/pytchat/__init__.py @@ -19,5 +19,6 @@ from .api import ( CompatibleProcessor, SimpleDisplayProcessor, JsonfileArchiveProcessor, - SpeedCalculator - ) \ No newline at end of file + SpeedCalculator, + DummyProcessor +) \ No newline at end of file diff --git a/pytchat/api.py b/pytchat/api.py index 25c78e5..92164d6 100644 --- a/pytchat/api.py +++ b/pytchat/api.py @@ -8,3 +8,4 @@ from .processors.compatible.processor import CompatibleProcessor from .processors.simple_display_processor import SimpleDisplayProcessor from .processors.jsonfile_archive_processor import JsonfileArchiveProcessor from .processors.speed_calculator import SpeedCalculator +from .processors.dummy_processor import DummyProcessor diff --git a/pytchat/core_async/livechat.py b/pytchat/core_async/livechat.py index 77fbc3c..7d5e640 100644 --- a/pytchat/core_async/livechat.py +++ b/pytchat/core_async/livechat.py @@ -15,6 +15,7 @@ from .. import mylogger from ..exceptions import ChatParseException,IllegalFunctionCall from ..paramgen import liveparam from ..processors.default.processor import DefaultProcessor +from ..processors.combinator import Combinator logger = mylogger.get_logger(__name__,mode=config.LOGGER_MODE) MAX_RETRY = 10 @@ -72,7 +73,10 @@ class LiveChatAsync: exception_handler = None, direct_mode = False): self.video_id = video_id - self.processor = processor + if isinstance(processor, tuple): + self.processor = Combinator(processor) + else: + self.processor = processor self._buffer = buffer self._callback = callback self._done_callback = done_callback diff --git a/pytchat/core_async/replaychat.py b/pytchat/core_async/replaychat.py index 80169d8..951c58e 100644 --- a/pytchat/core_async/replaychat.py +++ b/pytchat/core_async/replaychat.py @@ -16,6 +16,7 @@ from .. import mylogger from ..exceptions import ChatParseException,IllegalFunctionCall from ..paramgen import arcparam from ..processors.default.processor import DefaultProcessor +from ..processors.combinator import Combinator logger = mylogger.get_logger(__name__,mode=config.LOGGER_MODE) MAX_RETRY = 10 @@ -78,7 +79,10 @@ class ReplayChatAsync: direct_mode = False): self.video_id = video_id self.seektime = seektime - self.processor = processor + if isinstance(processor, tuple): + self.processor = Combinator(processor) + else: + self.processor = processor self._buffer = buffer self._callback = callback self._done_callback = done_callback diff --git a/pytchat/core_multithread/livechat.py b/pytchat/core_multithread/livechat.py index 9d70b00..da9e52c 100644 --- a/pytchat/core_multithread/livechat.py +++ b/pytchat/core_multithread/livechat.py @@ -14,6 +14,7 @@ from .. import mylogger from ..exceptions import ChatParseException,IllegalFunctionCall from ..paramgen import liveparam from ..processors.default.processor import DefaultProcessor +from ..processors.combinator import Combinator logger = mylogger.get_logger(__name__,mode=config.LOGGER_MODE) MAX_RETRY = 10 @@ -72,7 +73,10 @@ class LiveChat: direct_mode = False ): self.video_id = video_id - self.processor = processor + if isinstance(processor, tuple): + self.processor = Combinator(processor) + else: + self.processor = processor self._buffer = buffer self._callback = callback self._done_callback = done_callback diff --git a/pytchat/core_multithread/replaychat.py b/pytchat/core_multithread/replaychat.py index a72cf98..936f337 100644 --- a/pytchat/core_multithread/replaychat.py +++ b/pytchat/core_multithread/replaychat.py @@ -15,6 +15,7 @@ from .. import mylogger from ..exceptions import ChatParseException,IllegalFunctionCall from ..paramgen import arcparam from ..processors.default.processor import DefaultProcessor +from ..processors.combinator import Combinator logger = mylogger.get_logger(__name__,mode=config.LOGGER_MODE) MAX_RETRY = 10 @@ -78,7 +79,10 @@ class ReplayChat: ): self.video_id = video_id self.seektime = seektime - self.processor = processor + if isinstance(processor, tuple): + self.processor = Combinator(processor) + else: + self.processor = processor self._buffer = buffer self._callback = callback self._done_callback = done_callback diff --git a/pytchat/processors/combinator.py b/pytchat/processors/combinator.py new file mode 100644 index 0000000..1b76df5 --- /dev/null +++ b/pytchat/processors/combinator.py @@ -0,0 +1,39 @@ +from .chat_processor import ChatProcessor + +class Combinator(ChatProcessor): + ''' + Combinator combines multiple chat processors. + Specify processors as tuple at `processor` params of LiveChat object. + + For example: + [constructor] + chat = LiveChat("video_id", processor = ( Processor1(), Processor2(), Processor3() ) + + [receive return values] + ret1, ret2, ret3 = chat.get() + + The return values are tuple of processed chat data, + the order of return depends on parameter order. + + Parameter + --------- + processors : Tuple[ChatProcessor] + multiple processors for processing chat data + ''' + + def __init__(self, processors: tuple): + self.processors = processors + + def process(self, chat_components: list): + ''' + Called from LiveChat.get() function by user, + or LiveChat._listen() automatically. + + Returns + ------- + Tuple of chat data processed by each chat processor. + ''' + return tuple([processor.process(chat_components) + for processor in self.processors]) + + diff --git a/pytchat/processors/dummy_processor.py b/pytchat/processors/dummy_processor.py new file mode 100644 index 0000000..e2e406d --- /dev/null +++ b/pytchat/processors/dummy_processor.py @@ -0,0 +1,8 @@ +from .chat_processor import ChatProcessor + +class DummyProcessor(ChatProcessor): + ''' + Dummy processor just returns received chat_components directly. + ''' + def process(self, chat_components: list): + return chat_components