Skip to content

Commit

Permalink
Channel: use general pbj=1 endpoint to get first page of videos
Browse files Browse the repository at this point in the history
YouTube disabled the browse_ajax endpoint. Quick fix for first
channel page. In general, this will be more robust against api
endpoint changes. As YouTube continues to change api endpoints,
at least the subscriptions and first page will no longer break.
  • Loading branch information
user234683 committed Mar 3, 2021
1 parent 6458fa1 commit 2f6047d
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 5 deletions.
16 changes: 12 additions & 4 deletions youtube/channel.py
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,11 @@ def post_process_channel_info(info):
util.add_extra_html_info(item)



def get_channel_first_page(base_url=None, channel_id=None):
if channel_id:
base_url = 'https://www.youtube.com/channel/' + channel_id
return util.fetch_url(base_url + '/videos?pbj=1&view=0', headers_desktop,
debug_name='gen_channel_videos')


playlist_sort_codes = {'2': "da", '3': "dd", '4': "lad"}
Expand All @@ -203,7 +207,7 @@ def get_channel_page_general_url(base_url, tab, request, channel_id=None):
query = request.args.get('query', '')
ctoken = request.args.get('ctoken', '')

if tab == 'videos' and channel_id:
if tab == 'videos' and channel_id and page_number > 1:
tasks = (
gevent.spawn(get_number_of_videos_channel, channel_id),
gevent.spawn(get_channel_tab, channel_id, page_number, sort,
Expand All @@ -213,9 +217,13 @@ def get_channel_page_general_url(base_url, tab, request, channel_id=None):
util.check_gevent_exceptions(*tasks)
number_of_videos, polymer_json = tasks[0].value, tasks[1].value
elif tab == 'videos':
if channel_id:
num_videos_call = (get_number_of_videos_channel, channel_id)
else:
num_videos_call = (get_number_of_videos_general, base_url)
tasks = (
gevent.spawn(get_number_of_videos_general, base_url),
gevent.spawn(util.fetch_url, base_url + '/videos?pbj=1&view=0', headers_desktop, debug_name='gen_channel_videos')
gevent.spawn(*num_videos_call),
gevent.spawn(get_channel_first_page, base_url=base_url),
)
gevent.joinall(tasks)
util.check_gevent_exceptions(*tasks)
Expand Down
2 changes: 1 addition & 1 deletion youtube/subscriptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -457,7 +457,7 @@ def _get_upstream_videos(channel_id):

tasks = (
# channel page, need for video duration
gevent.spawn(_get_channel_tab, channel_id, channel_status_name),
gevent.spawn(channel.get_channel_first_page, channel_id=channel_id),
# need atoma feed for exact published time
gevent.spawn(_get_atoma_feed, channel_id)
)
Expand Down

0 comments on commit 2f6047d

Please sign in to comment.