Refactor extract_info in watch.py to improve client flexibility
Introduce primary_client, fallback_client, and last_resort_client variables for better configurability. Replace hardcoded 'android_vr' with primary_client in fetch_player_response call.
This commit is contained in:
parent
03451fb8ae
commit
6f88b1cec6
@ -367,32 +367,42 @@ def fetch_watch_page_info(video_id, playlist_id, index):
|
|||||||
watch_page = watch_page.decode('utf-8')
|
watch_page = watch_page.decode('utf-8')
|
||||||
return yt_data_extract.extract_watch_info_from_html(watch_page)
|
return yt_data_extract.extract_watch_info_from_html(watch_page)
|
||||||
|
|
||||||
|
|
||||||
def extract_info(video_id, use_invidious, playlist_id=None, index=None):
|
def extract_info(video_id, use_invidious, playlist_id=None, index=None):
|
||||||
|
primary_client = 'android_vr'
|
||||||
|
fallback_client = 'ios'
|
||||||
|
last_resort_client = 'tv_embedded'
|
||||||
|
|
||||||
tasks = (
|
tasks = (
|
||||||
# Get video metadata from here
|
# Get video metadata from here
|
||||||
gevent.spawn(fetch_watch_page_info, video_id, playlist_id, index),
|
gevent.spawn(fetch_watch_page_info, video_id, playlist_id, index),
|
||||||
gevent.spawn(fetch_player_response, 'android_vr', video_id)
|
gevent.spawn(fetch_player_response, primary_client, video_id)
|
||||||
)
|
)
|
||||||
gevent.joinall(tasks)
|
gevent.joinall(tasks)
|
||||||
util.check_gevent_exceptions(*tasks)
|
util.check_gevent_exceptions(*tasks)
|
||||||
info, player_response = tasks[0].value, tasks[1].value
|
|
||||||
|
info = tasks[0].value or {}
|
||||||
|
player_response = tasks[1].value or {}
|
||||||
|
|
||||||
yt_data_extract.update_with_new_urls(info, player_response)
|
yt_data_extract.update_with_new_urls(info, player_response)
|
||||||
|
|
||||||
# Age restricted video, retry
|
# Fallback to 'ios' if no valid URLs are found
|
||||||
if info['age_restricted'] or info['player_urls_missing']:
|
if not info.get('formats') or info.get('player_urls_missing'):
|
||||||
if info['age_restricted']:
|
print(f"No URLs found in '{primary_client}', attempting with '{fallback_client}'.")
|
||||||
print('Age restricted video, retrying')
|
player_response = fetch_player_response(fallback_client, video_id) or {}
|
||||||
else:
|
yt_data_extract.update_with_new_urls(info, player_response)
|
||||||
print('Player urls missing, retrying')
|
|
||||||
player_response = fetch_player_response('tv_embedded', video_id)
|
# Final attempt with 'tv_embedded' if there are still no URLs
|
||||||
|
if not info.get('formats') or info.get('player_urls_missing'):
|
||||||
|
print(f"No URLs found in '{fallback_client}', attempting with '{last_resort_client}'")
|
||||||
|
player_response = fetch_player_response(last_resort_client, video_id) or {}
|
||||||
yt_data_extract.update_with_new_urls(info, player_response)
|
yt_data_extract.update_with_new_urls(info, player_response)
|
||||||
|
|
||||||
# signature decryption
|
# signature decryption
|
||||||
decryption_error = decrypt_signatures(info, video_id)
|
if info.get('formats'):
|
||||||
if decryption_error:
|
decryption_error = decrypt_signatures(info, video_id)
|
||||||
decryption_error = 'Error decrypting url signatures: ' + decryption_error
|
if decryption_error:
|
||||||
info['playability_error'] = decryption_error
|
info['playability_error'] = 'Error decrypting url signatures: ' + decryption_error
|
||||||
|
|
||||||
# check if urls ready (non-live format) in former livestream
|
# check if urls ready (non-live format) in former livestream
|
||||||
# urls not ready if all of them have no filesize
|
# urls not ready if all of them have no filesize
|
||||||
@ -406,21 +416,21 @@ def extract_info(video_id, use_invidious, playlist_id=None, index=None):
|
|||||||
|
|
||||||
# livestream urls
|
# livestream urls
|
||||||
# sometimes only the livestream urls work soon after the livestream is over
|
# sometimes only the livestream urls work soon after the livestream is over
|
||||||
if (info['hls_manifest_url']
|
info['hls_formats'] = []
|
||||||
and (info['live'] or not info['formats'] or not info['urls_ready'])
|
if info.get('hls_manifest_url') and (info.get('live') or not info.get('formats') or not info['urls_ready']):
|
||||||
):
|
try:
|
||||||
manifest = util.fetch_url(info['hls_manifest_url'],
|
manifest = util.fetch_url(info['hls_manifest_url'],
|
||||||
debug_name='hls_manifest.m3u8',
|
debug_name='hls_manifest.m3u8',
|
||||||
report_text='Fetched hls manifest'
|
report_text='Fetched hls manifest'
|
||||||
).decode('utf-8')
|
).decode('utf-8')
|
||||||
|
info['hls_formats'], err = yt_data_extract.extract_hls_formats(manifest)
|
||||||
info['hls_formats'], err = yt_data_extract.extract_hls_formats(manifest)
|
if not err:
|
||||||
if not err:
|
info['playability_error'] = None
|
||||||
info['playability_error'] = None
|
for fmt in info['hls_formats']:
|
||||||
for fmt in info['hls_formats']:
|
fmt['video_quality'] = video_quality_string(fmt)
|
||||||
fmt['video_quality'] = video_quality_string(fmt)
|
except Exception as e:
|
||||||
else:
|
print(f"Error obteniendo HLS manifest: {e}")
|
||||||
info['hls_formats'] = []
|
info['hls_formats'] = []
|
||||||
|
|
||||||
# check for 403. Unnecessary for tor video routing b/c ip address is same
|
# check for 403. Unnecessary for tor video routing b/c ip address is same
|
||||||
info['invidious_used'] = False
|
info['invidious_used'] = False
|
||||||
|
Loading…
x
Reference in New Issue
Block a user