From 01ca9533e270973588fa61115cc790844dbae012 Mon Sep 17 00:00:00 2001 From: girst Date: Tue, 15 Aug 2023 20:10:30 +0000 Subject: [PATCH] browse: replace make_channel_params with pyproto version same semantics, cleanup follows. --- app/browse/protobuf.py | 185 ++++++++++++++++++----------------------- 1 file changed, 83 insertions(+), 102 deletions(-) diff --git a/app/browse/protobuf.py b/app/browse/protobuf.py index 6af50d9..a92595e 100644 --- a/app/browse/protobuf.py +++ b/app/browse/protobuf.py @@ -1,4 +1,6 @@ import base64 +from . import pyproto + from dataclasses import dataclass from typing import Optional @@ -9,6 +11,10 @@ def b64e(b, padding=True): return base64.urlsafe_b64encode(b).decode('ascii') \ .replace("=", "%3D" if padding else "") +def proto(d, padding=True): + return base64.urlsafe_b64encode(pyproto.ProtoBuf(d).toBuf()) \ + .decode('ascii').replace("=", "%3D" if padding else "") + # SEARCH {{{ @message @dataclass @@ -56,111 +62,86 @@ def make_sp(sort=None, date=None, type=None, len=None, features=[], extras=[]): # }}} SEARCH # CHANNEL {{{ -@message -@dataclass -class SearchOffset: - offset: int64 = field(3, default=0) -@message -@dataclass -class ChannelDataInner: - offset: int64 = field(1) -@message -@dataclass -class ChannelDataContainer: - data: str = field(1) # base64 of ChannelDataInner - -@message -@dataclass -class NewChannelDataUuid: - uuid: str = field(1, default="00000000-0000-0000-0000-000000000000") -@message -@dataclass -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 -@message -@dataclass -class NewChannelDataContainer: - data: NewChannelDataInner = field(3) -@message -@dataclass -class NewChannelDataContainerOuter: - data: NewChannelDataContainer = field(110) - -@message -@dataclass -class Subparams: - type_s: str = field(2) - type_i: Optional[int64] = field(4) - page: Optional[str] = field(15, default=None) - sort: Optional[int64] = field(3, default=None) - unknown_const1: int64 = field(7, default=1) - unknown_const2: int64 = field(23, default=0) - list_or_grid: Optional[int64] = field(6,default=2) # 2=list, None/1=grid - field61: Optional[str] = field(61, default=None) # base64 channelData -@message -@dataclass -class Params: - subject: str = field(2) # ucid/plid - params: str = field(3) # b64e encoded - query: Optional[str] = field(11, default=None) # channel search -@message -@dataclass -class Continuation: - params: Params = field(80226972) def make_channel_params(subject, typ="videos", sort=None, query=None): - typestr = dict(videos="videos", playlists="playlists", search="search") - typeint = dict(videos=0, playlists=1, search=None) # not supporting autogen'd - sortorder = dict(newest=1, popular=2) - if typ == "playlists": + if typ in ("playlists",): sortorder = dict(newest=3, modified=4) - elif typ == "search": - sortorder = dict() + return proto({ + # Continuation + 80226972: {#params + # Params + 2: subject,#subject + 3: proto({#params + # Subparams + 2: "playlists",#type_s + 4: 1,#type_i + #15: None,#page + 3: sortorder.get(sort),#sort optional + 7: 1, #unknown_const1 + 23: 0, #unknown_const2 + 6: 2, #list_or_grid (2=list, None/1=grid) + 61: proto({#field61 optional + # ChannelDataContainer + 1: proto({#data + #ChannelDataInner + 1: 0#offset + }, padding=False) + }, padding=False) + }), + #11: query or None,#query + } + }) + elif typ in ("search",): + return proto({ + # Continuation + 80226972: {#params + # Params + 2: subject,#subject + 3: proto({#params + # Subparams + 2: "search",#type_s + #4: None,#type_i + 15: proto({#page optional + # SearchOffset + 3: 0,#offset + }, padding=False) if 0 else None, + #3: None,#sort optional + 7: 1, #unknown_const1 + 23: 0, #unknown_const2 + 6: 2, #list_or_grid (2=list, None/1=grid) + #61: None#field61 optional + }), + 11: query,#query + } + }) elif typ in ("videos", "streams", "shorts"): - inner = NewChannelDataSort( - sort=sortorder.get(sort, 1) - ) - return b64e(Continuation( - params=Params( - subject=subject, - params=b64e(NewChannelDataContainerOuter( - data=NewChannelDataContainer( - data=NewChannelDataInner( - videos=inner if typ=="videos" else None, - streams=inner if typ=="streams" else None, - shorts=inner if typ=="shorts" else None, - ) - ) - ).dumps()) - ) - ).dumps()) - - return b64e(Continuation( - params=Params( - subject=subject, - params=b64e(Subparams( - type_s=typestr.get(typ), - type_i=typeint.get(typ), - sort=sortorder.get(sort), - field61=b64e( - ChannelDataContainer( - data=b64e( - ChannelDataInner( - offset=0 - ).dumps(), padding=False - ) - ).dumps(), padding=False - ) if (typ != "search") else None - ).dumps()), - query=query, - ), - ).dumps()) + sortorder = dict(newest=1, popular=2) + typekey = dict(videos=15, streams=14, shorts=10) + return proto({ + # Continuation + 80226972: {#params + # Params + 2: subject,#subject + 3: proto({#params + # NewChannelDataContainerOuter + 110: {#data + # NewChannelDataContainer + 3: {#data + # NewChannelDataInner + typekey[typ]: { + # NewChannelDataSort + 2: {#uuid + # NewChannelDataUuid + 1: "00000000-0000-0000-0000-000000000000",#uuid + }, + 3: sortorder.get(sort,1)#sort + }, + } + } + }) + } + }) + else: + raise NotImplementedError # }}} CHANNEL # PLAYLIST {{{ -- 2.39.3