diff options
-rw-r--r-- | youtube/channel.py | 11 | ||||
-rw-r--r-- | youtube/static/shared.css | 11 | ||||
-rw-r--r-- | youtube/templates/channel.html | 81 | ||||
-rw-r--r-- | youtube/templates/common_elements.html | 15 | ||||
-rw-r--r-- | 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 @@ -299,12 +299,23 @@ body{ 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); border-style: outset; 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 @@ </ul> </div> {% else %} - <div id="links-metadata"> - {% if current_tab == 'videos' %} - {% set sorts = [('1', 'views'), ('2', 'oldest'), ('3', 'newest')] %} - <div id="number-of-results">{{ number_of_videos }} videos</div> - {% elif current_tab == 'playlists' %} - {% set sorts = [('2', 'oldest'), ('3', 'newest'), ('4', 'last video added')] %} - {% else %} - {% set sorts = [] %} - {% endif %} - - {% for sort_number, sort_name in sorts %} - {% if sort_number == current_sort.__str__() %} - <a class="sort-button">{{ 'Sorted by ' + sort_name }}</a> + <div class="content {{ current_tab + '-content'}}"> + <div id="links-metadata"> + {% if current_tab == 'videos' %} + {% set sorts = [('1', 'views'), ('2', 'oldest'), ('3', 'newest')] %} + <div id="number-of-results">{{ number_of_videos }} videos</div> + {% elif current_tab == 'playlists' %} + {% set sorts = [('2', 'oldest'), ('3', 'newest'), ('4', 'last video added')] %} + {% elif current_tab == 'search' %} + <h2 class="page-number">Page {{ page_number }}</h2> {% else %} - <a class="sort-button" href="{{ channel_url + '/' + current_tab + '?sort=' + sort_number }}">{{ 'Sort by ' + sort_name }}</a> + {% set sorts = [] %} {% endif %} - {% endfor %} - </div> - {% if current_tab != 'about' %} + {% for sort_number, sort_name in sorts %} + {% if sort_number == current_sort.__str__() %} + <a class="sort-button">{{ 'Sorted by ' + sort_name }}</a> + {% else %} + <a class="sort-button" href="{{ channel_url + '/' + current_tab + '?sort=' + sort_number }}">{{ 'Sort by ' + sort_name }}</a> + {% endif %} + {% endfor %} + </div> + <nav class="{{ 'item-list' if current_tab == 'search' else 'item-grid' }}"> {% for item_info in items %} {{ common_elements.item(item_info, include_author=false) }} {% endfor %} </nav> - {% if current_tab != 'playlists' %} + {% if current_tab == 'videos' %} <nav class="page-button-row"> {{ common_elements.page_buttons(number_of_pages, channel_url + '/' + current_tab, parameters_dictionary) }} </nav> + {% elif current_tab == 'search' %} + <nav class="next-previous-button-row"> + {{ common_elements.next_previous_buttons(is_last_page, channel_url + '/' + current_tab, parameters_dictionary) }} + </nav> {% endif %} - {% endif %} - + </div> {% 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) %} + <a class="page-button previous-page" href="{{ url + '?' + parameters_dictionary|urlencode }}">Previous page</a> + {% endif %} + + {% if not is_last_page %} + {% set _ = parameters_dictionary.__setitem__('page', current_page + 1) %} + <a class="page-button next-page" href="{{ url + '?' + parameters_dictionary|urlencode }}">Next page</a> + {% 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: |