From 777ed756dcfd01845451937fb38559ee57ec44e9 Mon Sep 17 00:00:00 2001 From: James Taylor Date: Mon, 23 Dec 2019 14:39:59 -0800 Subject: Channel: Change search results to use next and previous page buttons Because youtube doesn't give the number of search results, so previous behavior would give an error if a page number out of range was selected. --- youtube/channel.py | 11 ++-- youtube/static/shared.css | 11 ++++ youtube/templates/channel.html | 81 +++++++++++++++++++----------- youtube/templates/common_elements.html | 15 ++++++ youtube/yt_data_extract/everything_else.py | 4 +- 5 files changed, 83 insertions(+), 39 deletions(-) diff --git a/youtube/channel.py b/youtube/channel.py index 891aca7..4df82e5 100644 --- a/youtube/channel.py +++ b/youtube/channel.py @@ -192,16 +192,10 @@ def get_channel_page_general_url(base_url, tab, request, channel_id=None): elif tab == 'playlists': polymer_json = util.fetch_url(base_url+ '/playlists?pbj=1&view=1&sort=' + playlist_sort_codes[sort], util.desktop_ua + headers_1, debug_name='gen_channel_playlists') elif tab == 'search' and channel_id: - tasks = ( - gevent.spawn(get_number_of_videos_channel, channel_id ), - gevent.spawn(get_channel_search_json, channel_id, query, page_number) - ) - gevent.joinall(tasks) - number_of_videos, polymer_json = tasks[0].value, tasks[1].value + polymer_json = get_channel_search_json(channel_id, query, page_number) elif tab == 'search': url = base_url + '/search?pbj=1&query=' + urllib.parse.quote(query, safe='') polymer_json = util.fetch_url(url, util.desktop_ua + headers_1, debug_name='gen_channel_search') - number_of_videos = 1000 else: flask.abort(404, 'Unknown channel tab: ' + tab) @@ -211,7 +205,7 @@ def get_channel_page_general_url(base_url, tab, request, channel_id=None): return flask.render_template('error.html', error_message = info['error']) post_process_channel_info(info) - if tab in ('videos', 'search'): + if tab == 'videos': info['number_of_videos'] = number_of_videos info['number_of_pages'] = math.ceil(number_of_videos/30) if tab in ('videos', 'playlists'): @@ -219,6 +213,7 @@ def get_channel_page_general_url(base_url, tab, request, channel_id=None): elif tab == 'search': info['search_box_value'] = query info['header_playlist_names'] = local_playlist.get_playlist_names() + info['page_number'] = page_number info['subscribed'] = subscriptions.is_subscribed(info['channel_id']) return flask.render_template('channel.html', diff --git a/youtube/static/shared.css b/youtube/static/shared.css index 2393bef..973f1db 100644 --- a/youtube/static/shared.css +++ b/youtube/static/shared.css @@ -298,6 +298,13 @@ body{ grid-auto-columns: 40px; grid-auto-flow: column; height: 40px; +} +.next-previous-button-row{ + margin: 10px 0px; + display: flex; + justify-self:center; + justify-content: center; + height: 40px; } .page-button{ background-color: var(--interface-color); @@ -305,6 +312,10 @@ body{ border-width: 2px; font-weight: bold; text-align: center; + padding: 5px; + } + .next-page:nth-child(2){ /* only if there's also a previous page button */ + margin-left: 10px; } .sort-button{ background-color: var(--interface-color); diff --git a/youtube/templates/channel.html b/youtube/templates/channel.html index d99af9e..5b64737 100644 --- a/youtube/templates/channel.html +++ b/youtube/templates/channel.html @@ -1,4 +1,9 @@ -{% set page_title = channel_name + ' - Channel' %} +{% if current_tab == 'search' %} + {% set page_title = search_box_value + ' - Page ' + page_number|string %} +{% else %} + {% set page_title = channel_name + ' - Channel' %} +{% endif %} + {% extends "base.html" %} {% import "common_elements.html" as common_elements %} {% block style %} @@ -52,18 +57,29 @@ #number-of-results{ font-weight:bold; } - .item-grid{ - padding-left: 20px; - grid-row:4; + .content{ + grid-row: 4; grid-column: 1 / span 2; } - .item-list{ - width:1000px; - grid-column: 1 / span 2; - } - .page-button-row{ - grid-column: 1 / span 2; + .search-content{ + width: 800px; + margin-left: 10px; } + .item-grid{ + padding-left: 20px; + } + .item-list{ + width:800px; + margin: auto; + } + .page-button-row{ + margin-left: auto; + margin-right: auto; + } + .next-previous-button-row{ + margin-left: auto; + margin-right: auto; + } .tab{ padding: 5px 75px; } @@ -137,38 +153,43 @@ {% else %} - {% endif %} {% endblock main %} diff --git a/youtube/templates/common_elements.html b/youtube/templates/common_elements.html index 7914c08..8ee0a3c 100644 --- a/youtube/templates/common_elements.html +++ b/youtube/templates/common_elements.html @@ -90,3 +90,18 @@ {% endfor %} {% endmacro %} + +{% macro next_previous_buttons(is_last_page, url, parameters_dictionary) %} + {% set current_page = parameters_dictionary.get('page', 1)|int %} + {% set parameters_dictionary = parameters_dictionary.to_dict() %} + + {% if current_page != 1 %} + {% set _ = parameters_dictionary.__setitem__('page', current_page - 1) %} + Previous page + {% endif %} + + {% if not is_last_page %} + {% set _ = parameters_dictionary.__setitem__('page', current_page + 1) %} + Next page + {% endif %} +{% endmacro %} diff --git a/youtube/yt_data_extract/everything_else.py b/youtube/yt_data_extract/everything_else.py index 4e3271f..5194693 100644 --- a/youtube/yt_data_extract/everything_else.py +++ b/youtube/yt_data_extract/everything_else.py @@ -59,9 +59,11 @@ def extract_channel_info(polymer_json, tab): # get items info['items'] = [] if tab in ('videos', 'playlists', 'search'): - items, _ = extract_items(response) + items, ctoken = extract_items(response) additional_info = {'author': info['channel_name'], 'author_url': info['channel_url']} info['items'] = [extract_item_info(renderer, additional_info) for renderer in items] + if tab == 'search': + info['is_last_page'] = (ctoken is None) elif tab == 'about': items, _ = extract_items(response, item_types={'channelAboutFullMetadataRenderer'}) if not items: -- cgit v1.2.3