]> git.gir.st - subscriptionfeed.git/blob - app/browse/lib.py
clean up new agegate bypass
[subscriptionfeed.git] / app / browse / lib.py
1 import re
2 import requests
3 from datetime import datetime, timezone
4
5 from ..common.innertube import G
6
7 def fetch_ajax(endpoint, **kwargs):
8 """
9 fetch data using a continuation protobuf
10 """
11 # TODO: handle auto_generated!
12 today = datetime.now(timezone.utc).strftime("%Y%m%d")
13
14 # TODO: this is not cached any more! -> https://github.com/reclosedev/requests-cache/issues/154
15 # Note: this 'innertube' API key exists since at least 2015: https://stackoverflow.com/q/33511165
16 r = requests.post(f"https://www.youtube.com/youtubei/v1/{endpoint}?key=AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8", json={
17 **kwargs,
18 'context': {'client': {
19 'gl': 'US',
20 'hl': 'en',
21 'clientName': 'WEB',
22 'clientVersion': f'2.{today}.01.01',
23 }},
24 })
25
26 if not r.ok:
27 return None
28
29 return r.json()
30
31 def canonicalize_channel(name, typ="c"):
32 if re.fullmatch(r"(UC[A-Za-z0-9_-]{22})", name):
33 return name
34
35 # get UCID of /c/ (vanity URLs):
36 today = datetime.now(timezone.utc).strftime("%Y%m%d")
37 r = requests.get(f'https://www.youtube.com/{typ}/{name}/about?pbj=1&hl=en_US', headers={
38 'x-youtube-client-name': '1',
39 'x-youtube-client-version': f'2.{today}.01.01', # see fetch_searchresults()
40 })
41 try:
42 return r.json()[1]['response']['metadata']['channelMetadataRenderer']['rssUrl'].split("=")[1]
43 except:
44 pass
45
46 # unable to extract:
47 return None
48
49 def find_and_parse_error(result):
50 error_obj = (
51 result|G('responseContext')|G('errors')|G('error')|G(0)
52 or result|G('alerts')|G(0)|G('alertRenderer')
53 or result|G('error')
54 )
55 if error_obj is None:
56 return None
57
58 error_type = error_obj|G('code', 'type', 'status') or 'Error'
59 error = (
60 error_obj|G('debugInfo', 'externalErrorMessage')
61 or error_obj|G('text')|G.text
62 or error_obj|G('message')
63 or "unknown error"
64 )
65 return f"{error_type}: {error.rstrip('.')}"
Imprint / Impressum