From a53bb9176494ea9b533ccbd0d193a419f1038e47 Mon Sep 17 00:00:00 2001 From: girst Date: Sat, 22 Apr 2023 18:02:38 +0000 Subject: [PATCH] switch to yt-style protobuf for channel videos/livestreams/shorts shorts only works in this format; page>=2 still broken --- app/browse/protobuf.py | 54 ++++-------------------------------------- 1 file changed, 5 insertions(+), 49 deletions(-) diff --git a/app/browse/protobuf.py b/app/browse/protobuf.py index a73ea6c..666f6ff 100644 --- a/app/browse/protobuf.py +++ b/app/browse/protobuf.py @@ -71,48 +71,19 @@ class ChannelDataContainer: @message @dataclass -class NewChannelUserInfoInner: - field1: int = field(1, default=0) -@message -@dataclass -class NewChannelUserInfo: - offset: int = field(7) - field2: NewChannelUserInfoInner = field(2, default=NewChannelUserInfoInner()) # otherwise page>=2 fails - field10: int = field(10, default=0) # otherwise 'newest' fails - # youtube sets those, but works without (values from invidious, yt's are dynamic): - #field5: int = field(5, default=50) - #field6: int = field(6, default=1) - #field9: int = field(9, default=1) -@message -@dataclass -class NewChannelDataUserSimple: +class NewChannelDataUuid: uuid: str = field(1, default="00000000-0000-0000-0000-000000000000") @message @dataclass -class NewChannelDataUser: - data: str = field(1) # b64 - uuid: str = field(2, default="00000000-0000-0000-0000-000000000000") -@message -@dataclass -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()) +class NewChannelDataSort: # used for streams + uuid: NewChannelDataUuid = field(2, default=NewChannelDataUuid()) + sort: int64 = field(3, default=1) # defaults to newest @message @dataclass class NewChannelDataInner: 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: @@ -131,12 +102,7 @@ class Subparams: sort: Optional[int64] = field(3, default=None) unknown_const1: int64 = field(7, default=1) unknown_const2: int64 = field(23, default=0) - # usually returns gridResponses. to switch to listResponses (cargo-culting - # invidious, playlist continuations (not yet supported) require list): list_or_grid: Optional[int64] = field(6,default=2) # 2=list, None/1=grid - # invidious sets those, but no idea why: - #field12:int64 = field(12,default=1) - #field13:str = field(13,default="") # playlists in list mode don't work without this field61: Optional[str] = field(61, default=None) # base64 channelData @message @dataclass @@ -144,8 +110,6 @@ class Params: subject: str = field(2) # ucid/plid params: str = field(3) # b64e encoded query: Optional[str] = field(11, default=None) # channel search - # defined by invidious, but not sent by youtube with NewChannel* structs: - #param35: Optional[str] = field(35, default=None) # "browse-feed#{ucid}videos102" @message @dataclass class Continuation: @@ -158,14 +122,8 @@ 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 ("videos", "streams", "shorts"): # XXX: not implemented + elif typ in ("videos", "streams", "shorts"): 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( @@ -177,8 +135,6 @@ def make_channel_params(subject, typ="videos", page=1, sort=None, query=None, v3 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