diff --git a/pytchat/paramgen/arcparam.py b/pytchat/paramgen/arcparam.py index c5f7e07..4802e63 100644 --- a/pytchat/paramgen/arcparam.py +++ b/pytchat/paramgen/arcparam.py @@ -1,52 +1,40 @@ -from .pb.header_pb2 import Header -from .pb.replay_pb2 import Continuation +from . import enc +from base64 import urlsafe_b64encode as b64enc from urllib.parse import quote -import base64 - -''' -Generate continuation parameter of youtube replay chat. - -Author: taizan-hokuto - -ver 0.0.1 2019.10.05 : Initial release. -ver 0.0.2 2020.05.30 : Use Protocol Buffers. -''' -def _gen_vid(video_id) -> str: - header = Header() - header.info.video.id = video_id - header.terminator = 1 - return base64.urlsafe_b64encode(header.SerializeToString()).decode() +def _header(video_id) -> str: + channel_id = '_' * 24 + S1_3 = enc.rs(1, video_id) + S1_5 = enc.rs(1, channel_id) + enc.rs(2, video_id) + S1 = enc.rs(3, S1_3) + enc.rs(5, S1_5) + S3 = enc.rs(48687757, enc.rs(1, video_id)) + header_replay = enc.rs(1, S1) + enc.rs(3, S3) + enc.nm(4, 1) + return b64enc(header_replay) def _build(video_id, seektime, topchat_only) -> str: - chattype = 1 - timestamp = 0 - if topchat_only: - chattype = 4 - + chattype = 4 if topchat_only else 1 fetch_before_start = 3 + timestamp = 1000 if seektime < 0: fetch_before_start = 4 elif seektime == 0: - timestamp = 1 + timestamp = 1000 else: timestamp = int(seektime * 1000000) - continuation = Continuation() - entity = continuation.entity - entity.header = _gen_vid(video_id) - entity.timestamp = timestamp - entity.s6 = 0 - entity.s7 = 0 - entity.s8 = 0 - entity.s9 = fetch_before_start - entity.s10 = '' - entity.s12 = chattype - entity.chattype.value = chattype - entity.s15 = 0 - return quote( - base64.urlsafe_b64encode(continuation.SerializeToString()).decode()) + header = enc.rs(3, _header(video_id)) + timestamp = enc.nm(5, timestamp) + s6 = enc.nm(6, 0) + s7 = enc.nm(7, 0) + s8 = enc.nm(8, 0) + s9 = enc.nm(9, fetch_before_start) + s10 = enc.rs(10, enc.nm(4, 0)) + chattype = enc.rs(14, enc.nm(1, chattype)) + s15 = enc.nm(15, 0) + entity = b''.join((header, timestamp, s6, s7, s8, s9, s10, chattype, s15)) + continuation = enc.rs(156074452, entity) + return quote(b64enc(continuation).decode()) def getparam(video_id, seektime=-1, topchat_only=False) -> str: diff --git a/pytchat/paramgen/enc.py b/pytchat/paramgen/enc.py new file mode 100644 index 0000000..bb3ef08 --- /dev/null +++ b/pytchat/paramgen/enc.py @@ -0,0 +1,24 @@ +def vn(val): + if val < 0: + raise ValueError + buf = b'' + while val >> 7: + m = val & 0xFF | 0x80 + buf += m.to_bytes(1, 'big') + val >>= 7 + buf += val.to_bytes(1, 'big') + return buf + + +def tp(a, b, ary): + return vn((b << 3) | a) + ary + + +def rs(a, ary): + if isinstance(ary, str): + ary = ary.encode() + return tp(2, a, vn(len(ary)) + ary) + + +def nm(a, ary): + return tp(0, a, vn(ary)) diff --git a/pytchat/paramgen/liveparam.py b/pytchat/paramgen/liveparam.py index 1a13e4f..6302832 100644 --- a/pytchat/paramgen/liveparam.py +++ b/pytchat/paramgen/liveparam.py @@ -1,69 +1,46 @@ -from .pb.header_pb2 import Header -from .pb.live_pb2 import Continuation -from urllib.parse import quote -import base64 import random import time - -''' -Generate continuation parameter of youtube live chat. - -Author: taizan-hokuto - -ver 0.0.1 2019.10.05 : Initial release. -ver 0.0.2 2020.05.30 : Use Protocol Buffers. -''' +from . import enc +from base64 import urlsafe_b64encode as b64enc +from urllib.parse import quote -def _gen_vid(video_id) -> str: - """generate video_id parameter. - Parameter - --------- - video_id : str - - Return - --------- - str : base64 encoded video_id parameter. - """ - header = Header() - header.info.video.id = video_id - header.terminator = 1 - return base64.urlsafe_b64encode(header.SerializeToString()).decode() +def _header(video_id) -> str: + return b64enc(enc.rs(1, enc.rs(1, enc.rs(1, video_id))) + enc.nm(4, 1)) def _build(video_id, ts1, ts2, ts3, ts4, ts5, topchat_only) -> str: - chattype = 1 - if topchat_only: - chattype = 4 - continuation = Continuation() - entity = continuation.entity + chattype = 4 if topchat_only else 1 - entity.header = _gen_vid(video_id) - entity.timestamp1 = ts1 - entity.s6 = 0 - entity.s7 = 0 - entity.s8 = 1 - entity.body.b1 = 0 - entity.body.b2 = 0 - entity.body.b3 = 0 - entity.body.b4 = 0 - entity.body.b7 = '' - entity.body.b8 = 0 - entity.body.b9 = '' - entity.body.timestamp2 = ts2 - entity.body.b11 = 3 - entity.body.b15 = 0 - entity.timestamp3 = ts3 - entity.timestamp4 = ts4 - entity.s13 = chattype - entity.chattype.value = chattype - entity.s17 = 0 - entity.str19.value = 0 - entity.timestamp5 = ts5 + b1 = enc.nm(1, 0) + b2 = enc.nm(2, 0) + b3 = enc.nm(3, 0) + b4 = enc.nm(4, 0) + b7 = enc.rs(7, '') + b8 = enc.nm(8, 0) + b9 = enc.rs(9, '') + timestamp2 = enc.nm(10, ts2) + b11 = enc.nm(11, 3) + b15 = enc.nm(15, 0) - return quote( - base64.urlsafe_b64encode(continuation.SerializeToString()).decode() - ) + header = enc.rs(3, _header(video_id)) + timestamp1 = enc.nm(5, ts1) + s6 = enc.nm(6, 0) + s7 = enc.nm(7, 0) + s8 = enc.nm(8, 1) + body = enc.rs(9, b''.join( + (b1, b2, b3, b4, b7, b8, b9, timestamp2, b11, b15))) + timestamp3 = enc.nm(10, ts3) + timestamp4 = enc.nm(11, ts4) + s13 = enc.nm(13, chattype) + chattype = enc.rs(16, enc.nm(1, chattype)) + s17 = enc.nm(17, 0) + str19 = enc.rs(19, enc.nm(1, 0)) + timestamp5 = enc.nm(20, ts5) + entity = b''.join((header, timestamp1, s6, s7, s8, body, timestamp3, + timestamp4, s13, chattype, s17, str19, timestamp5)) + continuation = enc.rs(119693434, entity) + return quote(b64enc(continuation).decode()) def _times(past_sec): @@ -85,4 +62,4 @@ def getparam(video_id, past_sec=0, topchat_only=False) -> str: topchat_only : bool if True, fetch only 'top chat' ''' - return _build(video_id, *_times(past_sec), topchat_only) + return _build(video_id, *_times(past_sec), topchat_only) \ No newline at end of file diff --git a/pytchat/paramgen/pb/__init__.py b/pytchat/paramgen/pb/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/pytchat/paramgen/pb/header_pb2.py b/pytchat/paramgen/pb/header_pb2.py deleted file mode 100644 index a45550a..0000000 --- a/pytchat/paramgen/pb/header_pb2.py +++ /dev/null @@ -1,159 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: header.proto - -from google.protobuf import descriptor as _descriptor -from google.protobuf import message as _message -from google.protobuf import reflection as _reflection -from google.protobuf import symbol_database as _symbol_database -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - - - -DESCRIPTOR = _descriptor.FileDescriptor( - name='header.proto', - package='', - syntax='proto3', - serialized_options=None, - create_key=_descriptor._internal_create_key, - serialized_pb=b'\n\x0cheader.proto\"\x13\n\x05Video\x12\n\n\x02id\x18\x01 \x01(\t\"#\n\nHeaderInfo\x12\x15\n\x05video\x18\x01 \x01(\x0b\x32\x06.Video\"7\n\x06Header\x12\x19\n\x04info\x18\x01 \x01(\x0b\x32\x0b.HeaderInfo\x12\x12\n\nterminator\x18\x04 \x01(\x05\x62\x06proto3' -) - - - - -_VIDEO = _descriptor.Descriptor( - name='Video', - full_name='Video', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='id', full_name='Video.id', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=16, - serialized_end=35, -) - - -_HEADERINFO = _descriptor.Descriptor( - name='HeaderInfo', - full_name='HeaderInfo', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='video', full_name='HeaderInfo.video', index=0, - number=1, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=37, - serialized_end=72, -) - - -_HEADER = _descriptor.Descriptor( - name='Header', - full_name='Header', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='info', full_name='Header.info', index=0, - number=1, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='terminator', full_name='Header.terminator', index=1, - number=4, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=74, - serialized_end=129, -) - -_HEADERINFO.fields_by_name['video'].message_type = _VIDEO -_HEADER.fields_by_name['info'].message_type = _HEADERINFO -DESCRIPTOR.message_types_by_name['Video'] = _VIDEO -DESCRIPTOR.message_types_by_name['HeaderInfo'] = _HEADERINFO -DESCRIPTOR.message_types_by_name['Header'] = _HEADER -_sym_db.RegisterFileDescriptor(DESCRIPTOR) - -Video = _reflection.GeneratedProtocolMessageType('Video', (_message.Message,), { - 'DESCRIPTOR' : _VIDEO, - '__module__' : 'header_pb2' - # @@protoc_insertion_point(class_scope:Video) - }) -_sym_db.RegisterMessage(Video) - -HeaderInfo = _reflection.GeneratedProtocolMessageType('HeaderInfo', (_message.Message,), { - 'DESCRIPTOR' : _HEADERINFO, - '__module__' : 'header_pb2' - # @@protoc_insertion_point(class_scope:HeaderInfo) - }) -_sym_db.RegisterMessage(HeaderInfo) - -Header = _reflection.GeneratedProtocolMessageType('Header', (_message.Message,), { - 'DESCRIPTOR' : _HEADER, - '__module__' : 'header_pb2' - # @@protoc_insertion_point(class_scope:Header) - }) -_sym_db.RegisterMessage(Header) - - -# @@protoc_insertion_point(module_scope) diff --git a/pytchat/paramgen/pb/live_pb2.py b/pytchat/paramgen/pb/live_pb2.py deleted file mode 100644 index d580cdf..0000000 --- a/pytchat/paramgen/pb/live_pb2.py +++ /dev/null @@ -1,381 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: live.proto - -from google.protobuf import descriptor as _descriptor -from google.protobuf import message as _message -from google.protobuf import reflection as _reflection -from google.protobuf import symbol_database as _symbol_database -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - - - -DESCRIPTOR = _descriptor.FileDescriptor( - name='live.proto', - package='live', - syntax='proto3', - serialized_options=None, - create_key=_descriptor._internal_create_key, - serialized_pb=b'\n\nlive.proto\x12\x04live\"\x88\x01\n\x04\x42ody\x12\n\n\x02\x62\x31\x18\x01 \x01(\x05\x12\n\n\x02\x62\x32\x18\x02 \x01(\x05\x12\n\n\x02\x62\x33\x18\x03 \x01(\x05\x12\n\n\x02\x62\x34\x18\x04 \x01(\x05\x12\n\n\x02\x62\x37\x18\x07 \x01(\t\x12\n\n\x02\x62\x38\x18\x08 \x01(\x05\x12\n\n\x02\x62\x39\x18\t \x01(\t\x12\x12\n\ntimestamp2\x18\n \x01(\x03\x12\x0b\n\x03\x62\x31\x31\x18\x0b \x01(\x05\x12\x0b\n\x03\x62\x31\x35\x18\x0f \x01(\x05\"\x19\n\x08\x43hatType\x12\r\n\x05value\x18\x01 \x01(\x05\"\x16\n\x05STR19\x12\r\n\x05value\x18\x01 \x01(\x05\"\x8a\x02\n\x12\x43ontinuationEntity\x12\x0e\n\x06header\x18\x03 \x01(\t\x12\x12\n\ntimestamp1\x18\x05 \x01(\x03\x12\n\n\x02s6\x18\x06 \x01(\x05\x12\n\n\x02s7\x18\x07 \x01(\x05\x12\n\n\x02s8\x18\x08 \x01(\x05\x12\x18\n\x04\x62ody\x18\t \x01(\x0b\x32\n.live.Body\x12\x12\n\ntimestamp3\x18\n \x01(\x03\x12\x12\n\ntimestamp4\x18\x0b \x01(\x03\x12\x0b\n\x03s13\x18\r \x01(\x05\x12 \n\x08\x63hattype\x18\x10 \x01(\x0b\x32\x0e.live.ChatType\x12\x0b\n\x03s17\x18\x11 \x01(\x05\x12\x1a\n\x05str19\x18\x13 \x01(\x0b\x32\x0b.live.STR19\x12\x12\n\ntimestamp5\x18\x14 \x01(\x03\";\n\x0c\x43ontinuation\x12+\n\x06\x65ntity\x18\xfa\xc0\x89\x39 \x01(\x0b\x32\x18.live.ContinuationEntityb\x06proto3' -) - - - - -_BODY = _descriptor.Descriptor( - name='Body', - full_name='live.Body', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='b1', full_name='live.Body.b1', index=0, - number=1, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='b2', full_name='live.Body.b2', index=1, - number=2, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='b3', full_name='live.Body.b3', index=2, - number=3, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='b4', full_name='live.Body.b4', index=3, - number=4, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='b7', full_name='live.Body.b7', index=4, - number=7, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='b8', full_name='live.Body.b8', index=5, - number=8, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='b9', full_name='live.Body.b9', index=6, - number=9, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='timestamp2', full_name='live.Body.timestamp2', index=7, - number=10, type=3, cpp_type=2, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='b11', full_name='live.Body.b11', index=8, - number=11, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='b15', full_name='live.Body.b15', index=9, - number=15, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=21, - serialized_end=157, -) - - -_CHATTYPE = _descriptor.Descriptor( - name='ChatType', - full_name='live.ChatType', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='value', full_name='live.ChatType.value', index=0, - number=1, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=159, - serialized_end=184, -) - - -_STR19 = _descriptor.Descriptor( - name='STR19', - full_name='live.STR19', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='value', full_name='live.STR19.value', index=0, - number=1, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=186, - serialized_end=208, -) - - -_CONTINUATIONENTITY = _descriptor.Descriptor( - name='ContinuationEntity', - full_name='live.ContinuationEntity', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='header', full_name='live.ContinuationEntity.header', index=0, - number=3, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='timestamp1', full_name='live.ContinuationEntity.timestamp1', index=1, - number=5, type=3, cpp_type=2, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='s6', full_name='live.ContinuationEntity.s6', index=2, - number=6, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='s7', full_name='live.ContinuationEntity.s7', index=3, - number=7, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='s8', full_name='live.ContinuationEntity.s8', index=4, - number=8, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='body', full_name='live.ContinuationEntity.body', index=5, - number=9, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='timestamp3', full_name='live.ContinuationEntity.timestamp3', index=6, - number=10, type=3, cpp_type=2, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='timestamp4', full_name='live.ContinuationEntity.timestamp4', index=7, - number=11, type=3, cpp_type=2, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='s13', full_name='live.ContinuationEntity.s13', index=8, - number=13, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='chattype', full_name='live.ContinuationEntity.chattype', index=9, - number=16, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='s17', full_name='live.ContinuationEntity.s17', index=10, - number=17, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='str19', full_name='live.ContinuationEntity.str19', index=11, - number=19, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='timestamp5', full_name='live.ContinuationEntity.timestamp5', index=12, - number=20, type=3, cpp_type=2, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=211, - serialized_end=477, -) - - -_CONTINUATION = _descriptor.Descriptor( - name='Continuation', - full_name='live.Continuation', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='entity', full_name='live.Continuation.entity', index=0, - number=119693434, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=479, - serialized_end=538, -) - -_CONTINUATIONENTITY.fields_by_name['body'].message_type = _BODY -_CONTINUATIONENTITY.fields_by_name['chattype'].message_type = _CHATTYPE -_CONTINUATIONENTITY.fields_by_name['str19'].message_type = _STR19 -_CONTINUATION.fields_by_name['entity'].message_type = _CONTINUATIONENTITY -DESCRIPTOR.message_types_by_name['Body'] = _BODY -DESCRIPTOR.message_types_by_name['ChatType'] = _CHATTYPE -DESCRIPTOR.message_types_by_name['STR19'] = _STR19 -DESCRIPTOR.message_types_by_name['ContinuationEntity'] = _CONTINUATIONENTITY -DESCRIPTOR.message_types_by_name['Continuation'] = _CONTINUATION -_sym_db.RegisterFileDescriptor(DESCRIPTOR) - -Body = _reflection.GeneratedProtocolMessageType('Body', (_message.Message,), { - 'DESCRIPTOR' : _BODY, - '__module__' : 'live_pb2' - # @@protoc_insertion_point(class_scope:live.Body) - }) -_sym_db.RegisterMessage(Body) - -ChatType = _reflection.GeneratedProtocolMessageType('ChatType', (_message.Message,), { - 'DESCRIPTOR' : _CHATTYPE, - '__module__' : 'live_pb2' - # @@protoc_insertion_point(class_scope:live.ChatType) - }) -_sym_db.RegisterMessage(ChatType) - -STR19 = _reflection.GeneratedProtocolMessageType('STR19', (_message.Message,), { - 'DESCRIPTOR' : _STR19, - '__module__' : 'live_pb2' - # @@protoc_insertion_point(class_scope:live.STR19) - }) -_sym_db.RegisterMessage(STR19) - -ContinuationEntity = _reflection.GeneratedProtocolMessageType('ContinuationEntity', (_message.Message,), { - 'DESCRIPTOR' : _CONTINUATIONENTITY, - '__module__' : 'live_pb2' - # @@protoc_insertion_point(class_scope:live.ContinuationEntity) - }) -_sym_db.RegisterMessage(ContinuationEntity) - -Continuation = _reflection.GeneratedProtocolMessageType('Continuation', (_message.Message,), { - 'DESCRIPTOR' : _CONTINUATION, - '__module__' : 'live_pb2' - # @@protoc_insertion_point(class_scope:live.Continuation) - }) -_sym_db.RegisterMessage(Continuation) - - -# @@protoc_insertion_point(module_scope) diff --git a/pytchat/paramgen/pb/replay_pb2.py b/pytchat/paramgen/pb/replay_pb2.py deleted file mode 100644 index 4a85aa3..0000000 --- a/pytchat/paramgen/pb/replay_pb2.py +++ /dev/null @@ -1,215 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: replay.proto - -from google.protobuf import descriptor as _descriptor -from google.protobuf import message as _message -from google.protobuf import reflection as _reflection -from google.protobuf import symbol_database as _symbol_database -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - - - -DESCRIPTOR = _descriptor.FileDescriptor( - name='replay.proto', - package='replay', - syntax='proto3', - serialized_options=None, - create_key=_descriptor._internal_create_key, - serialized_pb=b'\n\x0creplay.proto\x12\x06replay\"\x19\n\x08\x43hatType\x12\r\n\x05value\x18\x01 \x01(\x05\"\xb2\x01\n\x12\x43ontinuationEntity\x12\x0e\n\x06header\x18\x03 \x01(\t\x12\x11\n\ttimestamp\x18\x05 \x01(\x03\x12\n\n\x02s6\x18\x06 \x01(\x05\x12\n\n\x02s7\x18\x07 \x01(\x05\x12\n\n\x02s8\x18\x08 \x01(\x05\x12\n\n\x02s9\x18\t \x01(\x05\x12\x0b\n\x03s10\x18\n \x01(\t\x12\x0b\n\x03s12\x18\x0c \x01(\x05\x12\"\n\x08\x63hattype\x18\x0e \x01(\x0b\x32\x10.replay.ChatType\x12\x0b\n\x03s15\x18\x0f \x01(\x05\"=\n\x0c\x43ontinuation\x12-\n\x06\x65ntity\x18\xd4\x83\xb6J \x01(\x0b\x32\x1a.replay.ContinuationEntityb\x06proto3' -) - - - - -_CHATTYPE = _descriptor.Descriptor( - name='ChatType', - full_name='replay.ChatType', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='value', full_name='replay.ChatType.value', index=0, - number=1, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=24, - serialized_end=49, -) - - -_CONTINUATIONENTITY = _descriptor.Descriptor( - name='ContinuationEntity', - full_name='replay.ContinuationEntity', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='header', full_name='replay.ContinuationEntity.header', index=0, - number=3, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='timestamp', full_name='replay.ContinuationEntity.timestamp', index=1, - number=5, type=3, cpp_type=2, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='s6', full_name='replay.ContinuationEntity.s6', index=2, - number=6, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='s7', full_name='replay.ContinuationEntity.s7', index=3, - number=7, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='s8', full_name='replay.ContinuationEntity.s8', index=4, - number=8, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='s9', full_name='replay.ContinuationEntity.s9', index=5, - number=9, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='s10', full_name='replay.ContinuationEntity.s10', index=6, - number=10, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='s12', full_name='replay.ContinuationEntity.s12', index=7, - number=12, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='chattype', full_name='replay.ContinuationEntity.chattype', index=8, - number=14, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='s15', full_name='replay.ContinuationEntity.s15', index=9, - number=15, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=52, - serialized_end=230, -) - - -_CONTINUATION = _descriptor.Descriptor( - name='Continuation', - full_name='replay.Continuation', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='entity', full_name='replay.Continuation.entity', index=0, - number=156074452, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=232, - serialized_end=293, -) - -_CONTINUATIONENTITY.fields_by_name['chattype'].message_type = _CHATTYPE -_CONTINUATION.fields_by_name['entity'].message_type = _CONTINUATIONENTITY -DESCRIPTOR.message_types_by_name['ChatType'] = _CHATTYPE -DESCRIPTOR.message_types_by_name['ContinuationEntity'] = _CONTINUATIONENTITY -DESCRIPTOR.message_types_by_name['Continuation'] = _CONTINUATION -_sym_db.RegisterFileDescriptor(DESCRIPTOR) - -ChatType = _reflection.GeneratedProtocolMessageType('ChatType', (_message.Message,), { - 'DESCRIPTOR' : _CHATTYPE, - '__module__' : 'replay_pb2' - # @@protoc_insertion_point(class_scope:replay.ChatType) - }) -_sym_db.RegisterMessage(ChatType) - -ContinuationEntity = _reflection.GeneratedProtocolMessageType('ContinuationEntity', (_message.Message,), { - 'DESCRIPTOR' : _CONTINUATIONENTITY, - '__module__' : 'replay_pb2' - # @@protoc_insertion_point(class_scope:replay.ContinuationEntity) - }) -_sym_db.RegisterMessage(ContinuationEntity) - -Continuation = _reflection.GeneratedProtocolMessageType('Continuation', (_message.Message,), { - 'DESCRIPTOR' : _CONTINUATION, - '__module__' : 'replay_pb2' - # @@protoc_insertion_point(class_scope:replay.Continuation) - }) -_sym_db.RegisterMessage(Continuation) - - -# @@protoc_insertion_point(module_scope) diff --git a/pytchat/paramgen/proto/header.proto b/pytchat/paramgen/proto/header.proto deleted file mode 100644 index 54c6176..0000000 --- a/pytchat/paramgen/proto/header.proto +++ /dev/null @@ -1,14 +0,0 @@ -syntax = "proto3"; - -message Video { - string id = 1; -} - -message HeaderInfo { - Video video = 1; -} - -message Header { - HeaderInfo info = 1; - int32 terminator = 4; -} diff --git a/pytchat/paramgen/proto/live.proto b/pytchat/paramgen/proto/live.proto deleted file mode 100644 index 783753c..0000000 --- a/pytchat/paramgen/proto/live.proto +++ /dev/null @@ -1,45 +0,0 @@ -syntax = "proto3"; - -package live; - -message Body { - int32 b1 = 1; - int32 b2 = 2; - int32 b3 = 3; - int32 b4 = 4; - string b7 = 7; - int32 b8 = 8; - string b9 = 9; - int64 timestamp2 = 10; - int32 b11 = 11; - int32 b15 = 15; -} - -message ChatType { - int32 value = 1; -} - -message STR19 { - int32 value = 1; -} - -message ContinuationEntity { - string header = 3; - int64 timestamp1 = 5; - int32 s6 = 6; - int32 s7 = 7; - int32 s8 = 8; - Body body = 9; - int64 timestamp3 = 10; - int64 timestamp4 = 11; - int32 s13 = 13; - ChatType chattype = 16; - int32 s17 = 17; - STR19 str19 = 19; - int64 timestamp5 = 20; -} - -message Continuation { - ContinuationEntity entity = 119693434; -} - diff --git a/pytchat/paramgen/proto/replay.proto b/pytchat/paramgen/proto/replay.proto deleted file mode 100644 index b86a21c..0000000 --- a/pytchat/paramgen/proto/replay.proto +++ /dev/null @@ -1,24 +0,0 @@ -syntax = "proto3"; - -package replay; - -message ChatType { - int32 value = 1; -} - -message ContinuationEntity { - string header = 3; - int64 timestamp = 5; - int32 s6 = 6; - int32 s7 = 7; - int32 s8 = 8; - int32 s9 = 9; - string s10 = 10; - int32 s12 = 12; - ChatType chattype = 14; - int32 s15 = 15; -} - -message Continuation { - ContinuationEntity entity = 156074452; -} diff --git a/pytchat/util/extract_video_id.py b/pytchat/util/extract_video_id.py deleted file mode 100644 index 2f02ab0..0000000 --- a/pytchat/util/extract_video_id.py +++ /dev/null @@ -1,28 +0,0 @@ -import re -from .. exceptions import InvalidVideoIdException - - -PATTERN = re.compile(r"((?<=(v|V)/)|(?<=be/)|(?<=(\?|\&)v=)|(?<=embed/))([\w-]+)") -YT_VIDEO_ID_LENGTH = 11 - - -def extract_video_id(url_or_id: str) -> str: - ret = '' - if '[' in url_or_id: - url_or_id = url_or_id.replace('[', '').replace(']', '') - - if type(url_or_id) != str: - raise TypeError(f"{url_or_id}: URL or VideoID must be str, but {type(url_or_id)} is passed.") - if len(url_or_id) == YT_VIDEO_ID_LENGTH: - return url_or_id - match = re.search(PATTERN, url_or_id) - if match is None: - raise InvalidVideoIdException(f"Invalid video id: {url_or_id}") - try: - ret = match.group(4) - except IndexError: - raise InvalidVideoIdException(f"Invalid video id: {url_or_id}") - - if ret is None or len(ret) != YT_VIDEO_ID_LENGTH: - raise InvalidVideoIdException(f"Invalid video id: {url_or_id}") - return ret