import base64 from dataclasses import dataclass from typing import Optional from pure_protobuf.dataclasses_ import field, message from pure_protobuf.types import int64 @message @dataclass class Filters: # adapted from invidious date: Optional[int64] = field(1, default=None) type: Optional[int64] = field(2, default=None) length: Optional[int64] = field(3, default=None) is_hd: Optional[bool] = field(4, default=None) subtitles: Optional[bool] = field(5, default=None) ccommons: Optional[bool] = field(6, default=None) is_3d: Optional[bool] = field(7, default=None) live: Optional[bool] = field(8, default=None) purchased: Optional[bool] = field(9, default=None) is_4k: Optional[bool] = field(14, default=None) is_360: Optional[bool] = field(15, default=None) location: Optional[bool] = field(23, default=None) is_hdr: Optional[bool] = field(25, default=None) @message @dataclass class SearchRequest: sorted: Optional[int64] = field(1, default=None) filter: Optional[Filters] = field(2, default=None) def make_sp(sort=None, date=None, type=None, len=None, features=[]): sortorder = dict(relevance=0, rating=1, date=2, views=3) datefilter = dict(hour=1, day=2, week=3, month=4, year=5) typefilter = dict(video=1, channel=2, playlist=3, movie=4, show=5) lenfilter = dict(short=1, long=2) return base64.b64encode(SearchRequest( sorted=sortorder.get(sort), filter=Filters( date=datefilter.get(date), type=typefilter.get(type), length=lenfilter.get(len), **{f:True for f in features}, ) if date or type or len or features else None ).dumps()).decode('ascii')