File size: 3,830 Bytes
44bafb2 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
# All credits to https://github.com/LuanRT/googlevideo
from pytubefix.sabr.proto import BinaryWriter, BinaryReader
def create_base_format_id():
return {
"itag": 0,
"lastModified": 0,
"xtags": None
}
class FormatId:
@staticmethod
def encode(message: dict, writer=None):
if writer is None:
writer = BinaryWriter()
if message.get("itag", 0) != 0:
writer.uint32(8).int32(message["itag"])
if message.get("lastModified", 0) != 0:
writer.uint32(16).uint64(message["lastModified"])
if message.get("xtags", None) is not None:
writer.uint32(26).string(message["xtags"])
return writer
@staticmethod
def decode(input_data, length=None):
reader = input_data if isinstance(input_data, BinaryReader) else BinaryReader(input_data)
end = reader.len if length is None else reader.pos + length
message = create_base_format_id()
while reader.pos < end:
tag = reader.uint32()
field_no = tag >> 3
if field_no == 1 and tag == 8:
message["itag"] = reader.int32()
continue
elif field_no == 2 and tag == 16:
message["lastModified"] = reader.uint64()
continue
elif field_no == 3 and tag == 26:
message["xtags"] = reader.string()
continue
if (tag & 7) == 4 or tag == 0:
break
reader.skip(tag & 7)
return message
class InitRange:
def __init__(self, start=0, end=0):
self.start = start
self.end = end
@staticmethod
def encode(message, writer=None):
if writer is None:
writer = BinaryWriter()
if message.start != 0:
writer.uint32(8)
writer.int32(message.start)
if message.end != 0:
writer.uint32(16)
writer.int32(message.end)
return writer
@staticmethod
def decode(input_data, length=None):
reader = input_data if isinstance(input_data, BinaryReader) else BinaryReader(input_data)
end = reader.len if length is None else reader.pos + length
message = InitRange()
while reader.pos < end:
tag = reader.uint32()
field_no = tag >> 3
if field_no == 1 and tag == 8:
message.start = reader.int32()
continue
elif field_no == 2 and tag == 16:
message.end = reader.int32()
continue
if (tag & 7) == 4 or tag == 0:
break
reader.skip(tag & 7)
return message
class IndexRange:
@staticmethod
def encode(message: dict, writer=None):
if writer is None:
writer = BinaryWriter()
if message.get("start", 0) != 0:
writer.uint32(8).int32(message["start"])
if message.get("end", 0) != 0:
writer.uint32(16).int32(message["end"])
return writer
@staticmethod
def decode(input_data, length=None):
reader = input_data if isinstance(input_data, BinaryReader) else BinaryReader(input_data)
end = reader.len if length is None else reader.pos + length
message = {
"start": 0,
"end": 0
}
while reader.pos < end:
tag = reader.uint32()
field_no = tag >> 3
if field_no == 1 and tag == 8:
message["start"] = reader.int32()
continue
elif field_no == 2 and tag == 16:
message["end"] = reader.int32()
continue
if (tag & 7) == 4 or tag == 0:
break
reader.skip(tag & 7)
return message
|