diff options
Diffstat (limited to 'youtube/yt_data_extract/watch_extraction.py')
| -rw-r--r-- | youtube/yt_data_extract/watch_extraction.py | 22 |
1 files changed, 11 insertions, 11 deletions
diff --git a/youtube/yt_data_extract/watch_extraction.py b/youtube/yt_data_extract/watch_extraction.py index de87a6a..2a60741 100644 --- a/youtube/yt_data_extract/watch_extraction.py +++ b/youtube/yt_data_extract/watch_extraction.py @@ -650,9 +650,9 @@ def _extract_playability_error(info, player_response, error_prefix=''): ) if playability_status not in (None, 'OK'): - info['playability_error'] = error_prefix + playability_reason + info['playability_error'] = f'{error_prefix}{playability_reason}' elif not info['playability_error']: # do not override - info['playability_error'] = error_prefix + 'Unknown playability error' + info['playability_error'] = f'{error_prefix}Unknown playability error' SUBTITLE_FORMATS = ('srv1', 'srv2', 'srv3', 'ttml', 'vtt') def extract_watch_info(polymer_json): @@ -726,7 +726,7 @@ def extract_watch_info(polymer_json): # Store the full URL from the player response (includes valid tokens) if base_url: normalized = normalize_url(base_url) if base_url.startswith('/') or not base_url.startswith('http') else base_url - info['_caption_track_urls'][lang_code + ('_asr' if caption_track.get('kind') == 'asr' else '')] = normalized + info['_caption_track_urls'][f'{lang_code}_{"asr" if caption_track.get("kind") == "asr" else ""}'] = normalized lang_name = deep_get(urllib.parse.parse_qs(urllib.parse.urlparse(base_url).query), 'name', 0) if lang_name: info['_manual_caption_language_names'][lang_code] = lang_name @@ -806,7 +806,7 @@ def extract_watch_info(polymer_json): info['allowed_countries'] = mf.get('availableCountries', []) # other stuff - info['author_url'] = 'https://www.youtube.com/channel/' + info['author_id'] if info['author_id'] else None + info['author_url'] = f'https://www.youtube.com/channel/{info["author_id"]}' if info['author_id'] else None info['storyboard_spec_url'] = deep_get(player_response, 'storyboards', 'playerStoryboardSpecRenderer', 'spec') return info @@ -912,12 +912,12 @@ def get_caption_url(info, language, format, automatic=False, translation_languag url = info['_captions_base_url'] if not url: return None - url += '&lang=' + language - url += '&fmt=' + format + url += f'&lang={language}' + url += f'&fmt={format}' if automatic: url += '&kind=asr' elif language in info['_manual_caption_language_names']: - url += '&name=' + urllib.parse.quote(info['_manual_caption_language_names'][language], safe='') + url += f'&name={urllib.parse.quote(info["_manual_caption_language_names"][language], safe="")}' if translation_language: url += '&tlang=' + translation_language @@ -964,7 +964,7 @@ def extract_decryption_function(info, base_js): return 'Could not find var_name' var_name = var_with_operation_match.group(1) - var_body_match = re.search(r'var ' + re.escape(var_name) + r'=\{(.*?)\};', base_js, flags=re.DOTALL) + var_body_match = re.search(rf'var {re.escape(var_name)}=\{{(.*?)\}};', base_js, flags=re.DOTALL) if var_body_match is None: return 'Could not find var_body' @@ -988,7 +988,7 @@ def extract_decryption_function(info, base_js): elif op_body.startswith('var c=a[0]'): operation_definitions[op_name] = 2 else: - return 'Unknown op_body: ' + op_body + return f'Unknown op_body: {op_body}' decryption_function = [] for op_with_arg in function_body: @@ -997,7 +997,7 @@ def extract_decryption_function(info, base_js): return 'Could not parse operation with arg' op_name = match.group(2).strip('[].') if op_name not in operation_definitions: - return 'Unknown op_name: ' + str(op_name) + return f'Unknown op_name: {op_name}' op_argument = match.group(3) decryption_function.append([operation_definitions[op_name], int(op_argument)]) @@ -1028,5 +1028,5 @@ def decrypt_signatures(info): _operation_2(a, argument) signature = ''.join(a) - format['url'] += '&' + format['sp'] + '=' + signature + format['url'] += f'&{format["sp"]}={signature}' return False |
