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:
parent
cf7aa41893
commit
43679efff5
@ -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)
|
||||||
|
@ -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>
|
||||||
|
@ -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 %}
|
||||||
|
@ -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':
|
||||||
|
Loading…
x
Reference in New Issue
Block a user