Move parser to common directory
This commit is contained in:
@@ -10,7 +10,7 @@ import urllib.parse
|
||||
from aiohttp.client_exceptions import ClientConnectorError
|
||||
from concurrent.futures import CancelledError
|
||||
from .buffer import Buffer
|
||||
from .parser import Parser
|
||||
from ..parser import Parser
|
||||
from .. import config
|
||||
from .. import mylogger
|
||||
from ..exceptions import ChatParseException,IllegalFunctionCall
|
||||
@@ -81,7 +81,7 @@ class LiveChatAsync:
|
||||
self._exception_handler = exception_handler
|
||||
self._direct_mode = direct_mode
|
||||
self._is_alive = True
|
||||
|
||||
self._parser = Parser()
|
||||
self._setup()
|
||||
|
||||
if not LiveChatAsync._setup_finished:
|
||||
@@ -164,7 +164,7 @@ class LiveChatAsync:
|
||||
livechat_json = (await
|
||||
self._get_livechat_json(continuation, session, headers)
|
||||
)
|
||||
metadata, chatdata = Parser.parse( livechat_json )
|
||||
metadata, chatdata = self._parser.parse( livechat_json )
|
||||
timeout = metadata['timeoutMs']/1000
|
||||
chat_component = {
|
||||
"video_id" : self.video_id,
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
import json
|
||||
from .. import config
|
||||
from .. import mylogger
|
||||
from .. exceptions import (
|
||||
ResponseContextError,
|
||||
NoContentsException,
|
||||
NoContinuationsException )
|
||||
|
||||
|
||||
logger = mylogger.get_logger(__name__,mode=config.LOGGER_MODE)
|
||||
|
||||
|
||||
class Parser:
|
||||
@classmethod
|
||||
def parse(cls, jsn):
|
||||
if jsn is None:
|
||||
return {'timeoutMs':0,'continuation':None},[]
|
||||
if jsn['response']['responseContext'].get('errors'):
|
||||
raise ResponseContextError('動画に接続できません。'
|
||||
'動画IDが間違っているか、動画が削除/非公開の可能性があります。')
|
||||
contents=jsn['response'].get('continuationContents')
|
||||
#配信が終了した場合、もしくはチャットデータが取得できない場合
|
||||
if contents is None:
|
||||
raise NoContentsException('チャットデータを取得できませんでした。')
|
||||
|
||||
cont = contents['liveChatContinuation']['continuations'][0]
|
||||
if cont is None:
|
||||
raise NoContinuationsException('Continuationがありません。')
|
||||
metadata = (cont.get('invalidationContinuationData') or
|
||||
cont.get('timedContinuationData') or
|
||||
cont.get('reloadContinuationData')
|
||||
)
|
||||
if metadata is None:
|
||||
unknown = list(cont.keys())[0]
|
||||
if unknown:
|
||||
logger.error(f"Received unknown continuation type:{unknown}")
|
||||
metadata = cont.get(unknown)
|
||||
metadata.setdefault('timeoutMs', 10000)
|
||||
chatdata = contents['liveChatContinuation'].get('actions')
|
||||
return metadata, chatdata
|
||||
@@ -8,7 +8,7 @@ import traceback
|
||||
import urllib.parse
|
||||
from concurrent.futures import CancelledError, ThreadPoolExecutor
|
||||
from .buffer import Buffer
|
||||
from .parser import Parser
|
||||
from ..parser import Parser
|
||||
from .. import config
|
||||
from .. import mylogger
|
||||
from ..exceptions import ChatParseException,IllegalFunctionCall
|
||||
|
||||
@@ -182,14 +182,10 @@ class ReplayChat:
|
||||
)
|
||||
else:
|
||||
self._buffer.put(chat_component)
|
||||
#次のchatを取得するまでsleepする
|
||||
diff_time = timeout - (time.time()-time_mark)
|
||||
if diff_time < 0 : diff_time=0
|
||||
time.sleep(diff_time)
|
||||
#次のチャットデータのcontinuationパラメータを取り出す。
|
||||
continuation = metadata.get('continuation')
|
||||
|
||||
#whileループ先頭に戻る
|
||||
except ChatParseException as e:
|
||||
logger.error(f"{str(e)}(動画ID:\"{self.video_id}\")")
|
||||
return
|
||||
@@ -253,13 +249,10 @@ class ReplayChat:
|
||||
"既にcallbackを登録済みのため、get()は実行できません。")
|
||||
|
||||
def pause(self):
|
||||
'''チャット取得を一時停止する。'''
|
||||
if not self._pauser.empty():
|
||||
self._pauser.get()
|
||||
|
||||
|
||||
def resume(self):
|
||||
'''チャット取得を再開する。'''
|
||||
if self._pauser.empty():
|
||||
self._pauser.put_nowait(None)
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import json
|
||||
from .. import config
|
||||
from .. import mylogger
|
||||
from .. exceptions import (
|
||||
from . import config
|
||||
from . import mylogger
|
||||
from . exceptions import (
|
||||
ResponseContextError,
|
||||
NoContentsException,
|
||||
NoContinuationsException )
|
||||
Reference in New Issue
Block a user