chipling's picture
Upload 106 files
44bafb2 verified
# All credits to https://github.com/LuanRT/googlevideo
from typing import Optional
from pytubefix.sabr.proto import BinaryReader, BinaryWriter
class TimeRange:
def __init__(self):
self.start: int = 0
self.duration: int = 0
self.timescale: int = 0
@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 = TimeRange
while reader.pos < end:
tag = reader.uint32()
field = tag >> 3
if field == 1 and tag == 8:
message.start = long_to_number(reader.int64())
continue
elif field == 2 and tag == 16:
message.duration = long_to_number(reader.int64())
continue
elif field == 3 and tag == 24:
message.timescale = reader.int32()
continue
elif (tag & 7) == 4 or tag == 0:
break
else:
reader.skip(tag & 7)
return message
def encode(self, writer: Optional[BinaryWriter] = None) -> BinaryWriter:
writer = writer or BinaryWriter()
if self.start != 0:
writer.uint32(8).int64(self.start)
if self.duration != 0:
writer.uint32(16).int64(self.duration)
if self.timescale != 0:
writer.uint32(24).int32(self.timescale)
return writer
def long_to_number(int64_value):
value = int(str(int64_value))
if value > (2 ** 53 - 1):
raise OverflowError("Value is larger than 9007199254740991")
if value < -(2 ** 53 - 1):
raise OverflowError("Value is smaller than -9007199254740991")
return value