aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJames Taylor <user234683@users.noreply.github.com>2019-09-08 17:48:02 -0700
committerJames Taylor <user234683@users.noreply.github.com>2019-09-08 17:48:02 -0700
commit216231f9a6ca9ed48389e797a0c30d7d3b01e379 (patch)
tree1fed2d2b6b4cce1db21f7a27809282b4ac95e4a1
parentbd343ed71f628e0f1dd1eb3f45fb4e04887f223f (diff)
downloadyt-local-216231f9a6ca9ed48389e797a0c30d7d3b01e379.tar.lz
yt-local-216231f9a6ca9ed48389e797a0c30d7d3b01e379.tar.xz
yt-local-216231f9a6ca9ed48389e797a0c30d7d3b01e379.zip
Extraction: Proper error handling for terminated or non-existant channels
-rw-r--r--youtube/channel.py5
-rw-r--r--youtube/subscriptions.py7
-rw-r--r--youtube/yt_data_extract.py13
3 files changed, 18 insertions, 7 deletions
diff --git a/youtube/channel.py b/youtube/channel.py
index 16d0a3f..3a2a0b3 100644
--- a/youtube/channel.py
+++ b/youtube/channel.py
@@ -186,6 +186,8 @@ def get_channel_page(channel_id, tab='videos'):
info = yt_data_extract.extract_channel_info(json.loads(polymer_json), tab)
+ if info['errors']:
+ return flask.render_template('error.html', error_message = '\n'.join(info['errors']))
post_process_channel_info(info)
if tab in ('videos', 'search'):
info['number_of_videos'] = number_of_videos
@@ -226,6 +228,9 @@ def get_channel_page_general_url(base_url, tab, request):
info = yt_data_extract.extract_channel_info(json.loads(polymer_json), tab)
+ if info['errors']:
+ return flask.render_template('error.html', error_message = '\n'.join(info['errors']))
+
post_process_channel_info(info)
if tab in ('videos', 'search'):
info['number_of_videos'] = 1000
diff --git a/youtube/subscriptions.py b/youtube/subscriptions.py
index 175622f..87e1659 100644
--- a/youtube/subscriptions.py
+++ b/youtube/subscriptions.py
@@ -455,7 +455,12 @@ def _get_upstream_videos(channel_id):
print('Failed to read atoma feed for ' + channel_status_name)
traceback.print_exc()
- videos = yt_data_extract.extract_channel_info(json.loads(channel_tab), 'videos')['items']
+ channel_info = yt_data_extract.extract_channel_info(json.loads(channel_tab), 'videos')
+ if channel_info['errors']:
+ print('Error checking channel ' + channel_status_name + ': ' + ', '.join(channel_info['errors']))
+ return
+
+ videos = channel_info['items']
for i, video_item in enumerate(videos):
if 'description' not in video_item:
video_item['description'] = ''
diff --git a/youtube/yt_data_extract.py b/youtube/yt_data_extract.py
index c666ede..f0c89cb 100644
--- a/youtube/yt_data_extract.py
+++ b/youtube/yt_data_extract.py
@@ -281,6 +281,7 @@ def parse_info_prepare_for_html(renderer, additional_info={}):
def extract_channel_info(polymer_json, tab):
+ info = {'errors': []}
response = polymer_json[1]['response']
try:
microformat = response['microformat']['microformatDataRenderer']
@@ -289,18 +290,18 @@ def extract_channel_info(polymer_json, tab):
# example terminated channel: https://www.youtube.com/channel/UCnKJeK_r90jDdIuzHXC0Org
except KeyError:
if 'alerts' in response and len(response['alerts']) > 0:
- result = ''
for alert in response['alerts']:
- result += alert['alertRenderer']['text']['simpleText'] + '\n'
- flask.abort(200, result)
+ info['errors'].append(alert['alertRenderer']['text']['simpleText'])
+ return info
elif 'errors' in response['responseContext']:
for error in response['responseContext']['errors']['error']:
if error['code'] == 'INVALID_VALUE' and error['location'] == 'browse_id':
- flask.abort(404, 'This channel does not exist')
- raise
+ info['errors'].append('This channel does not exist')
+ return info
+ info['errors'].append('Failure getting microformat')
+ return info
- info = {}
info['current_tab'] = tab