channel: replace page #s w/ next page button using provided ctoken

Since yt doesn't accept page #'s when sorting by oldest

Signed-off-by: Jesús <heckyel@hyperbola.info>
This commit is contained in:
James Taylor 2020-12-17 13:46:29 -08:00 committed by Jesús
parent cf7aa41893
commit 43679efff5
No known key found for this signature in database
GPG Key ID: F6EE7BC59A315766
4 changed files with 32 additions and 18 deletions

View File

@ -113,26 +113,18 @@ def channel_ctoken_v1(channel_id, page, sort, tab, view=1):
return base64.urlsafe_b64encode(pointless_nest).decode('ascii') return base64.urlsafe_b64encode(pointless_nest).decode('ascii')
def get_channel_tab(channel_id, page="1", sort=3, tab='videos', view=1, print_status=True): def get_channel_tab(channel_id, page="1", sort=3, tab='videos', view=1,
ctoken=None, print_status=True):
message = 'Got channel tab' if print_status else None message = 'Got channel tab' if print_status else None
if int(sort) == 2 and int(page) > 1: if not ctoken:
ctoken = channel_ctoken_v1(channel_id, page, sort, tab, view)
ctoken = ctoken.replace('=', '%3D')
url = ('https://www.youtube.com/channel/' + channel_id + '/' + tab
+ '?action_continuation=1&continuation=' + ctoken
+ '&pbj=1')
content = util.fetch_url(
url, headers_desktop + real_cookie,
debug_name='channel_tab', report_text=message)
else:
ctoken = channel_ctoken_v3(channel_id, page, sort, tab, view) ctoken = channel_ctoken_v3(channel_id, page, sort, tab, view)
ctoken = ctoken.replace('=', '%3D') ctoken = ctoken.replace('=', '%3D')
url = 'https://www.youtube.com/browse_ajax?ctoken=' + ctoken url = 'https://www.youtube.com/browse_ajax?ctoken=' + ctoken
content = util.fetch_url( content = util.fetch_url(
url, url,
headers_desktop + generic_cookie, headers_desktop + generic_cookie,
debug_name='channel_tab', report_text=message) debug_name='channel_tab', report_text=message)
return content return content
@ -220,11 +212,13 @@ def get_channel_page_general_url(base_url, tab, request, channel_id=None):
sort = request.args.get('sort', '3') sort = request.args.get('sort', '3')
view = request.args.get('view', '1') view = request.args.get('view', '1')
query = request.args.get('query', '') query = request.args.get('query', '')
ctoken = request.args.get('ctoken', '')
if tab == 'videos' and channel_id: if tab == 'videos' and channel_id:
tasks = ( tasks = (
gevent.spawn(get_number_of_videos_channel, channel_id), gevent.spawn(get_number_of_videos_channel, channel_id),
gevent.spawn(get_channel_tab, channel_id, page_number, sort, 'videos', view) gevent.spawn(get_channel_tab, channel_id, page_number, sort,
'videos', view, ctoken)
) )
gevent.joinall(tasks) gevent.joinall(tasks)
util.check_gevent_exceptions(*tasks) util.check_gevent_exceptions(*tasks)

View File

@ -105,7 +105,11 @@
<hr/> <hr/>
<footer class="pagination-container"> <footer class="pagination-container">
{% if current_tab == 'videos' %} {% if current_tab == 'videos' and current_sort.__str__() == '2' %}
<nav class="next-previous-button-row">
{{ common_elements.next_previous_ctoken_buttons(None, ctoken, channel_url + '/' + current_tab, parameters_dictionary) }}
</nav>
{% elif current_tab == 'videos' %}
<nav class="pagination-list"> <nav class="pagination-list">
{{ common_elements.page_buttons(number_of_pages, channel_url + '/' + current_tab, parameters_dictionary, include_ends=(current_sort.__str__() == '3')) }} {{ common_elements.page_buttons(number_of_pages, channel_url + '/' + current_tab, parameters_dictionary, include_ends=(current_sort.__str__() == '3')) }}
</nav> </nav>

View File

@ -112,4 +112,18 @@
{% set _ = parameters_dictionary.__setitem__('page', current_page + 1) %} {% set _ = parameters_dictionary.__setitem__('page', current_page + 1) %}
<a class="page-link next-page" href="{{ url + '?' + parameters_dictionary|urlencode }}">Next page</a> <a class="page-link next-page" href="{{ url + '?' + parameters_dictionary|urlencode }}">Next page</a>
{% endif %} {% endif %}
{% macro next_previous_ctoken_buttons(prev_ctoken, next_ctoken, url, parameters_dictionary) %}
{% set parameters_dictionary = parameters_dictionary.to_dict() %}
{% if prev_ctoken %}
{% set _ = parameters_dictionary.__setitem__('ctoken', prev_ctoken) %}
<a class="page-link previous-page" href="{{ url + '?' + parameters_dictionary|urlencode }}">Previous page</a>
{% endif %}
{% if next_ctoken %}
{% set _ = parameters_dictionary.__setitem__('ctoken', next_ctoken) %}
<a class="page-link next-page" href="{{ url + '?' + parameters_dictionary|urlencode }}">Next page</a>
{% endif %}
{% endmacro %}
{% endmacro %} {% endmacro %}

View File

@ -66,6 +66,7 @@ def extract_channel_info(polymer_json, tab):
# get items # get items
info['items'] = [] info['items'] = []
info['ctoken'] = None
# empty channel # empty channel
if 'contents' not in response and 'continuationContents' not in response: if 'contents' not in response and 'continuationContents' not in response:
@ -75,6 +76,7 @@ def extract_channel_info(polymer_json, tab):
items, ctoken = extract_items(response) items, ctoken = extract_items(response)
additional_info = {'author': info['channel_name'], 'author_url': info['channel_url']} additional_info = {'author': info['channel_name'], 'author_url': info['channel_url']}
info['items'] = [extract_item_info(renderer, additional_info) for renderer in items] info['items'] = [extract_item_info(renderer, additional_info) for renderer in items]
info['ctoken'] = ctoken
if tab == 'search': if tab == 'search':
info['is_last_page'] = (ctoken is None) info['is_last_page'] = (ctoken is None)
elif tab == 'about': elif tab == 'about':