diff options
Diffstat (limited to 'youtube/search.py')
-rw-r--r-- | youtube/search.py | 61 |
1 files changed, 42 insertions, 19 deletions
diff --git a/youtube/search.py b/youtube/search.py index 81a69f2..d586c62 100644 --- a/youtube/search.py +++ b/youtube/search.py @@ -8,6 +8,7 @@ import base64 import mimetypes from flask import request import flask +import os # Sort: 1 # Upload date: 2 @@ -57,15 +58,15 @@ def get_search_json(query, page, autocorrect, sort, filters): return info +@yt_app.route('/results') @yt_app.route('/search') def get_search_page(): - if len(request.args) == 0: - return flask.render_template('base.html', title="Search") + query = request.args.get('search_query') or request.args.get('query') + if query is None: + return flask.render_template('home.html', title='Search') + elif query.startswith('https://www.youtube.com') or query.startswith('https://www.youtu.be'): + return flask.redirect(f'/{query}') - if 'query' not in request.args: - abort(400) - - query = request.args.get("query") page = request.args.get("page", "1") autocorrect = int(request.args.get("autocorrect", "1")) sort = int(request.args.get("sort", "0")) @@ -76,22 +77,44 @@ def get_search_page(): polymer_json = get_search_json(query, page, autocorrect, sort, filters) search_info = yt_data_extract.extract_search_info(polymer_json) - for item_info in search_info['items']: - yt_data_extract.prefix_urls(item_info) - yt_data_extract.add_extra_html_info(item_info) + if search_info['error']: + return flask.render_template('error.html', error_message=search_info['error']) + + for extract_item_info in search_info['items']: + util.prefix_urls(extract_item_info) + util.add_extra_html_info(extract_item_info) - return flask.render_template('search.html', - header_playlist_names = local_playlist.get_playlist_names(), - query = query, - estimated_results = search_info['estimated_results'], - estimated_pages = search_info['estimated_pages'], - corrections = search_info['corrections'], - results = search_info['items'], - parameters_dictionary = request.args, + corrections = search_info['corrections'] + if corrections['type'] == 'did_you_mean': + corrected_query_string = request.args.to_dict(flat=False) + corrected_query_string['search_query'] = [corrections['corrected_query']] + corrections['corrected_query_url'] = util.URL_ORIGIN + '/results?' + urllib.parse.urlencode(corrected_query_string, doseq=True) + elif corrections['type'] == 'showing_results_for': + no_autocorrect_query_string = request.args.to_dict(flat=False) + no_autocorrect_query_string['autocorrect'] = ['0'] + no_autocorrect_query_url = util.URL_ORIGIN + '/results?' + urllib.parse.urlencode(no_autocorrect_query_string, doseq=True) + corrections['original_query_url'] = no_autocorrect_query_url + + return flask.render_template( + 'search.html', + header_playlist_names=local_playlist.get_playlist_names(), + query=query, + estimated_results=search_info['estimated_results'], + estimated_pages=search_info['estimated_pages'], + corrections=search_info['corrections'], + results=search_info['items'], + parameters_dictionary=request.args, ) + @yt_app.route('/opensearch.xml') def get_search_engine_xml(): - with open("youtube/opensearch.xml", 'rb') as f: - content = f.read().replace(b'$port_number', str(settings.port_number).encode()) + with open(os.path.join(settings.program_directory, 'youtube/opensearch.xml'), 'rb') as f: + if settings.app_public: + main_url = '%s' % settings.app_url + else: + main_url = '%s:%s' % (settings.app_url, settings.port_number) + content = f.read().replace( + b'$main_url', str(main_url).encode() + ) return flask.Response(content, mimetype='application/xml') |