41 lines
1.6 KiB
Python
41 lines
1.6 KiB
Python
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
|