From 30f5a0f9bc371753b087ef8abb0bd437cd85d571 Mon Sep 17 00:00:00 2001 From: girst Date: Sat, 22 Apr 2023 17:21:50 +0000 Subject: [PATCH] WIP: port channel videos+livestreams --- app/browse/protobuf.py | 51 ++++++++++++++++++++++++++++-------------- 1 file changed, 34 insertions(+), 17 deletions(-) diff --git a/app/browse/protobuf.py b/app/browse/protobuf.py index fb57fef..a73ea6c 100644 --- a/app/browse/protobuf.py +++ b/app/browse/protobuf.py @@ -85,20 +85,34 @@ class NewChannelUserInfo: #field9: int = field(9, default=1) @message @dataclass +class NewChannelDataUserSimple: + uuid: str = field(1, default="00000000-0000-0000-0000-000000000000") +@message +@dataclass class NewChannelDataUser: data: str = field(1) # b64 - uuid: str = field(2) + uuid: str = field(2, default="00000000-0000-0000-0000-000000000000") @message @dataclass -class NewChannelDataSort: +class NewChannelDataSort: # used for videos user: NewChannelDataUser = field(1) sort: int64 = field(3, default=1) # newest @message @dataclass +class NewChannelDataSortSimple: # used for streams + sort: int64 = field(3, default=1) # newest + user: NewChannelDataUserSimple = field(2, default=NewChannelDataUserSimple()) +@message +@dataclass class NewChannelDataInner: - videos: NewChannelDataSort = field(15) # videos - # TODO: streams sends a field(14) with nearly? the same NewChannelDataSort struct, but then page>=2 doesn't work (sorting works) - # TODO: shorts sends a field(10) but with a different sub-struct (nothing works) + videos: Optional[NewChannelDataSort] = field(15, default=None) # videos + streams: Optional[NewChannelDataSort] = field(14, default=None) # livestreams + shorts: Optional[NewChannelDataSort] = field(10, default=None) # shorts + # TODO: above format is constructed by invidious, but youtube uses the one below. + # *Simple returns a different result json, that must be handled in innertube.py + #videos: Optional[NewChannelDataSortSimple] = field(15, default=None) # videos + #streams: Optional[NewChannelDataSortSimple] = field(14, default=None) # livestreams + #shorts: Optional[NewChannelDataSortSimple] = field(10, default=None) # shorts @message @dataclass class NewChannelDataContainer: @@ -144,24 +158,27 @@ def make_channel_params(subject, typ="videos", page=1, sort=None, query=None, v3 sortorder = dict(newest=3, modified=4) elif typ == "search": sortorder = dict() - elif typ in ("streams", "shorts"): # XXX: not implemented - return None - elif typ == "videos": # XXX: should be better integrated + elif typ in ("videos", "streams", "shorts"): # XXX: not implemented + inner = NewChannelDataSort( + user=NewChannelDataUser( + data=b64e(NewChannelUserInfo( + offset= page*30, + ).dumps(), padding=False), + uuid="00000000-0000-0000-0000-000000000000" + ), + sort=sortorder.get(sort, 1) + ) return b64e(Continuation( params=Params( subject=subject, params=b64e(NewChannelDataContainerOuter( data=NewChannelDataContainer( data=NewChannelDataInner( - videos=NewChannelDataSort( - user=NewChannelDataUser( - data=b64e(NewChannelUserInfo( - offset= page*30, - ).dumps(), padding=False), - uuid="00000000-0000-0000-0000-000000000000" - ), - sort=sortorder.get(sort, 1) - ) + videos=inner if typ=="videos" else None, + streams=inner if typ=="streams" else None, + shorts=inner if typ=="shorts" else None, + + #videos|streams|shorts=NewChannelDataSortSimple(sort=sortorder.get(sort, 1)) ) ) ).dumps()) -- 2.39.3