From 50ad959a8051fec95f26b573f9fe067bdf3fdf6a Mon Sep 17 00:00:00 2001 From: Astounds Date: Sat, 25 Apr 2026 01:02:17 -0500 Subject: refactor: replace string concatenations with f-strings --- youtube/yt_data_extract/common.py | 6 +++--- youtube/yt_data_extract/everything_else.py | 2 +- youtube/yt_data_extract/watch_extraction.py | 22 +++++++++++----------- 3 files changed, 15 insertions(+), 15 deletions(-) (limited to 'youtube/yt_data_extract') diff --git a/youtube/yt_data_extract/common.py b/youtube/yt_data_extract/common.py index dce1d30..f91a467 100644 --- a/youtube/yt_data_extract/common.py +++ b/youtube/yt_data_extract/common.py @@ -212,7 +212,7 @@ def extract_date(date_text): month, day, year = parts[-3:] month = MONTH_ABBREVIATIONS.get(month[0:3]) # slicing in case they start writing out the full month name if month and (re.fullmatch(r'\d\d?', day) is not None) and (re.fullmatch(r'\d{4}', year) is not None): - return year + '-' + month + '-' + day + return f'{year}-{month}-{day}' return None def check_missing_keys(object, *key_sequences): @@ -222,7 +222,7 @@ def check_missing_keys(object, *key_sequences): for key in key_sequence: _object = _object[key] except (KeyError, IndexError, TypeError): - return 'Could not find ' + key + return f'Could not find {key}' return None @@ -467,7 +467,7 @@ def extract_item_info(item, additional_info={}): ['shortBylineText', 'runs', 0, 'navigationEndpoint', 'browseEndpoint', 'browseId'], ['ownerText', 'runs', 0, 'navigationEndpoint', 'browseEndpoint', 'browseId'] )) - 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['description'] = extract_formatted_text(multi_deep_get( item, ['descriptionText'], ['descriptionSnippet'], diff --git a/youtube/yt_data_extract/everything_else.py b/youtube/yt_data_extract/everything_else.py index 5930111..b7379a5 100644 --- a/youtube/yt_data_extract/everything_else.py +++ b/youtube/yt_data_extract/everything_else.py @@ -305,7 +305,7 @@ def extract_playlist_metadata(polymer_json): metadata['description'] = desc if metadata['author_id']: - metadata['author_url'] = 'https://www.youtube.com/channel/' + metadata['author_id'] + metadata['author_url'] = f'https://www.youtube.com/channel/{metadata["author_id"]}' if metadata['first_video_id'] is None: metadata['thumbnail'] = None 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 -- cgit v1.2.3