aboutsummaryrefslogtreecommitdiffstats
path: root/youtube/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'youtube/__init__.py')
-rw-r--r--youtube/__init__.py91
1 files changed, 53 insertions, 38 deletions
diff --git a/youtube/__init__.py b/youtube/__init__.py
index a8a725d..4859589 100644
--- a/youtube/__init__.py
+++ b/youtube/__init__.py
@@ -5,6 +5,7 @@ from flask import request
import jinja2
import settings
import traceback
+import logging
import re
from sys import exc_info
from flask_babel import Babel
@@ -12,6 +13,15 @@ from flask_babel import Babel
yt_app = flask.Flask(__name__)
yt_app.config['TEMPLATES_AUTO_RELOAD'] = True
yt_app.url_map.strict_slashes = False
+
+# Don't log full tracebacks for handled FetchErrors
+class FetchErrorFilter(logging.Filter):
+ def filter(self, record):
+ if record.exc_info and record.exc_info[0] == util.FetchError:
+ return False
+ return True
+
+yt_app.logger.addFilter(FetchErrorFilter())
# yt_app.jinja_env.trim_blocks = True
# yt_app.jinja_env.lstrip_blocks = True
@@ -124,49 +134,54 @@ def timestamps(text):
@yt_app.errorhandler(500)
def error_page(e):
slim = request.args.get('slim', False) # whether it was an ajax request
- if (exc_info()[0] == util.FetchError
- and exc_info()[1].code == '429'
- and settings.route_tor
- ):
- error_message = ('Error: YouTube blocked the request because the Tor'
- ' exit node is overutilized. Try getting a new exit node by'
- ' using the New Identity button in the Tor Browser.')
- if exc_info()[1].error_message:
- error_message += '\n\n' + exc_info()[1].error_message
- if exc_info()[1].ip:
- error_message += '\n\nExit node IP address: ' + exc_info()[1].ip
- return flask.render_template('error.html', error_message=error_message, slim=slim), 502
- elif exc_info()[0] == util.FetchError and exc_info()[1].error_message:
- # Handle specific error codes with user-friendly messages
- error_code = exc_info()[1].code
- error_msg = exc_info()[1].error_message
-
- if error_code == '400':
- error_message = (f'Error: Bad Request (400)\n\n{error_msg}\n\n'
- 'This usually means the URL or parameters are invalid. '
- 'Try going back and trying a different option.')
+ if exc_info()[0] == util.FetchError:
+ fetch_err = exc_info()[1]
+ error_code = fetch_err.code
+
+ if error_code == '429' and settings.route_tor:
+ error_message = ('Error: YouTube blocked the request because the Tor'
+ ' exit node is overutilized. Try getting a new exit node by'
+ ' using the New Identity button in the Tor Browser.')
+ if fetch_err.error_message:
+ error_message += '\n\n' + fetch_err.error_message
+ if fetch_err.ip:
+ error_message += '\n\nExit node IP address: ' + fetch_err.ip
+ return flask.render_template('error.html', error_message=error_message, slim=slim), 502
+
+ elif error_code == '429':
+ error_message = ('YouTube is temporarily blocking requests from your IP address (429 Too Many Requests).\n\n'
+ 'Try:\n'
+ '• Wait a few minutes and refresh\n'
+ '• Enable Tor routing in Settings for automatic IP rotation\n'
+ '• Use a VPN to change your IP address')
+ if fetch_err.ip:
+ error_message += '\n\nYour IP: ' + fetch_err.ip
+ return flask.render_template('error.html', error_message=error_message, slim=slim), 429
+
+ elif error_code == '502' and ('Failed to resolve' in str(fetch_err) or 'Failed to establish' in str(fetch_err)):
+ error_message = ('Could not connect to YouTube.\n\n'
+ 'Check your internet connection and try again.')
+ return flask.render_template('error.html', error_message=error_message, slim=slim), 502
+
+ elif error_code == '403':
+ error_message = ('YouTube blocked this request (403 Forbidden).\n\n'
+ 'Try enabling Tor routing in Settings.')
+ return flask.render_template('error.html', error_message=error_message, slim=slim), 403
+
elif error_code == '404':
error_message = 'Error: The page you are looking for isn\'t here.'
+ return flask.render_template('error.html', error_code=error_code,
+ error_message=error_message, slim=slim), 404
+
else:
- error_message = f'Error: {error_code} - {error_msg}'
-
- return (flask.render_template(
- 'error.html',
- error_message=error_message,
- slim=slim
- ), 502)
- elif (exc_info()[0] == util.FetchError
- and exc_info()[1].code == '404'
- ):
- error_message = ('Error: The page you are looking for isn\'t here.')
- return flask.render_template('error.html',
- error_code=exc_info()[1].code,
- error_message=error_message,
- slim=slim), 404
+ # Catch-all for any other FetchError (400, etc.)
+ error_message = f'Error communicating with YouTube ({error_code}).'
+ if fetch_err.error_message:
+ error_message += '\n\n' + fetch_err.error_message
+ return flask.render_template('error.html', error_message=error_message, slim=slim), 502
+
return flask.render_template('error.html', traceback=traceback.format_exc(),
- error_code=exc_info()[1].code,
slim=slim), 500
- # return flask.render_template('error.html', traceback=traceback.format_exc(), slim=slim), 500
font_choices = {