]>
git.gir.st - subscriptionfeed.git/blob - app/dangerous/protobuf.py
2 from dataclasses
import dataclass
3 from typing
import Optional
5 from pure_protobuf
.dataclasses_
import field
, message
6 from pure_protobuf
.types
import int64
11 dont_fix_spelling
: Optional
[bool] = field(1, default
=None)
14 class Filters
: # adapted from invidious
15 date
: Optional
[int64
] = field(1, default
=None)
16 type: Optional
[int64
] = field(2, default
=None)
17 length
: Optional
[int64
] = field(3, default
=None)
18 is_hd
: Optional
[bool] = field(4, default
=None)
19 subtitles
: Optional
[bool] = field(5, default
=None)
20 ccommons
: Optional
[bool] = field(6, default
=None)
21 is_3d
: Optional
[bool] = field(7, default
=None)
22 live
: Optional
[bool] = field(8, default
=None)
23 purchased
: Optional
[bool] = field(9, default
=None)
24 is_4k
: Optional
[bool] = field(14, default
=None)
25 is_360
: Optional
[bool] = field(15, default
=None)
26 location
: Optional
[bool] = field(23, default
=None)
27 is_hdr
: Optional
[bool] = field(25, default
=None)
31 sorted: Optional
[int64
] = field(1, default
=None)
32 filter: Optional
[Filters
] = field(2, default
=None)
33 extras
: Optional
[Extras
] = field(8, default
=None)
35 def b64e(b
, padding
=True):
36 return base64
.urlsafe_b64encode(b
).decode('ascii') \
37 .replace("=", "%3D" if padding
else "")
39 def make_sp(sort
=None, date
=None, type=None, len=None, features
=[], extras
=[]):
40 sortorder
= dict(relevance
=0, rating
=1, date
=2, views
=3)
41 datefilter
= dict(hour
=1, day
=2, week
=3, month
=4, year
=5)
42 typefilter
= dict(video
=1, channel
=2, playlist
=3, movie
=4, show
=5)
43 lenfilter
= dict(short
=1, long=2)
45 return b64e(SearchRequest(
46 sorted=sortorder
.get(sort
),
48 date
=datefilter
.get(date
),
49 type=typefilter
.get(type),
50 length
=lenfilter
.get(len),
51 **{f
:True for f
in features
},
52 ) if date
or type or len or features
else None,
53 extras
=Extras(**{f
:True for f
in extras
}),
59 offset
: int64
= field(1)
62 class PlaylistSubparams
:
67 type_s
: str = field(2)
68 type_i
: Optional
[int64
] = field(4)
69 page
: Optional
[str] = field(15)
70 sort
: Optional
[int64
] = field(3, default
=None)
71 unknown_const1
: int64
= field(7, default
=1)
72 unknown_const2
: int64
= field(23, default
=0)
73 # usually returns gridResponses. to switch to listResponses (cargo-culting
74 # invidious, playlist continuations (not yet supported) require list):
75 list_or_grid
: Optional
[int64
] = field(6,default
=2) # 2=list, None/1=grid
76 # invidious sets those, but no idea why:
77 #field12:int64 = field(12,default=1)
78 #field13:str = field(13,default="") # playlists in list mode don't work without this
82 subject
: str = field(2) # ucid/plid
83 params
: str = field(3) # b64e encoded
84 query
: Optional
[str] = field(11, default
=None) # channel search
88 params
: Params
= field(80226972)
89 def make_channel_params(subject
, typ
="videos", page
=1, sort
=None, query
=None):
90 typestr
= dict(videos
="videos", playlists
="playlists", search
="search")
91 typeint
= dict(videos
=0, playlists
=1, search
=None) # not supporting autogen'd
92 sortorder
= dict(newest
=None, popular
=1, oldest
=2)
93 if typ
== "playlists":
94 sortorder
= dict(oldest
=2, newest
=3, modified
=4)
98 return b64e(Continuation(
101 params
=b64e(Subparams(
102 type_s
=typestr
.get(typ
),
103 type_i
=typeint
.get(typ
),
104 sort
=sortorder
.get(sort
),
105 page
=str(page
) if page
else None # Note: ucid/playlists doesn't support pagination
111 def make_playlist_params(playlist_id
, offset
):
112 if playlist_id
.startswith("UC"):
113 playlist_id
= f
"UU{playlist_id[2:]}"
115 return b64e(Continuation(
117 subject
="VL" + playlist_id
,
118 params
=b64e(PlaylistSubparams(
119 data
="PT:" + b64e(PlaylistData(
121 ).dumps(), padding
=False)