From 0353e4c2a0d84f6e6aa9a4762ea81d795b3fceff Mon Sep 17 00:00:00 2001 From: girst Date: Fri, 7 Aug 2020 12:57:04 +0200 Subject: [PATCH] retry browse_ajax twice on error --- app/dangerous/lib.py | 40 ++++++++++++++++++++++++++------------- app/dangerous/protobuf.py | 5 +++-- 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/app/dangerous/lib.py b/app/dangerous/lib.py index f55b1f3..c798b0d 100644 --- a/app/dangerous/lib.py +++ b/app/dangerous/lib.py @@ -1,8 +1,6 @@ import requests from datetime import datetime, timezone -from ..common.innertube import parse_result_items - def fetch_searchresults(q=None, page=1, sp=None): today = datetime.now(timezone.utc).strftime("%Y%m%d") r = requests.get(f"https://www.youtube.com/results", { @@ -27,15 +25,31 @@ def fetch_ajax(params): # TODO: handle auto_generated! today = datetime.now(timezone.utc).strftime("%Y%m%d") - r = requests.get(f"https://www.youtube.com/browse_ajax", { - 'continuation': params, - 'gl': 'US', - 'hl': 'en', - }, headers={ - 'x-youtube-client-name': '1', - 'x-youtube-client-version': f'2.{today}.0.0', # see fetch_searchresults() - }) - if not r.ok: - return None + for _ in range(3): # sometimes, this endpoint returns an error and retrying once helps: + r = requests.get(f"https://www.youtube.com/browse_ajax", { + 'continuation': params, + 'gl': 'US', + 'hl': 'en', + }, headers={ + 'x-youtube-client-name': '1', + 'x-youtube-client-version': f'2.{today}.0.0', # see fetch_searchresults() + }) - return r.json() + try: # TODO: cleanup + alert = r.json()[1]['response']['alerts'][0]['alertRenderer'] + if alert['type'] == "ERROR": + # log alert['text']['simpleText'] + from flask import current_app + current_app.logger.error(f"got error '{alert['text']['simpleText']}', retrying ({_})") + # cache bust: + from requests_cache import get_cache + cache = get_cache() + main_key = cache.create_key(r.request) + cache.delete(main_key) + continue + except: pass + + if not r.ok: + return None + + return r.json() diff --git a/app/dangerous/protobuf.py b/app/dangerous/protobuf.py index d30e2a0..8a1ee4e 100644 --- a/app/dangerous/protobuf.py +++ b/app/dangerous/protobuf.py @@ -70,9 +70,10 @@ 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 - # usually returns gridResponses. to switch to listResponses: - #list_or_grid:int64 = field(6,default=2) # 2==list, undef=grid (playlist continuations require list) + # 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 @message -- 2.39.3