aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJames Taylor <user234683@users.noreply.github.com>2018-12-16 18:49:09 -0800
committerJames Taylor <user234683@users.noreply.github.com>2018-12-16 18:49:09 -0800
commit7c97a1705301219783d901332951a2f1e86ed26f (patch)
tree8948f6f698e7ddf9a2f144f87c3eb91bce4433fe
parent804b7e8d84dc6ecdcd516582802215415f40a55d (diff)
downloadyt-local-7c97a1705301219783d901332951a2f1e86ed26f.tar.lz
yt-local-7c97a1705301219783d901332951a2f1e86ed26f.tar.xz
yt-local-7c97a1705301219783d901332951a2f1e86ed26f.zip
Support for custom channel urls
-rw-r--r--youtube/channel.py27
-rw-r--r--youtube/youtube.py8
2 files changed, 22 insertions, 13 deletions
diff --git a/youtube/channel.py b/youtube/channel.py
index ce0ecba..a2acb23 100644
--- a/youtube/channel.py
+++ b/youtube/channel.py
@@ -358,24 +358,33 @@ def get_channel_page(url, query_string=''):
return channel_search_page(polymer_json, query, page_number, number_of_videos, query_string)
else:
raise ValueError('Unknown channel tab: ' + tab)
-
-def get_user_page(url, query_string=''):
+
+# youtube.com/user/[username]/[page]
+# youtube.com/c/[custom]/[page]
+# youtube.com/[custom]/[page]
+def get_channel_page_general_url(url, query_string=''):
path_components = url.rstrip('/').lstrip('/').split('/')
- username = path_components[0]
- try:
- page = path_components[1]
- except IndexError:
+ is_toplevel = not path_components[0] in ('user', 'c')
+
+ if len(path_components) + int(is_toplevel) == 3: # has /[page] after it
+ page = path_components[2]
+ base_url = 'https://www.youtube.com/' + '/'.join(path_components[0:-1])
+ elif len(path_components) + int(is_toplevel) == 2: # does not have /[page] after it, use /videos by default
page = 'videos'
+ base_url = 'https://www.youtube.com/' + '/'.join(path_components)
+ else:
+ raise ValueError()
+
if page == 'videos':
- polymer_json = common.fetch_url('https://www.youtube.com/user/' + username + '/videos?pbj=1&view=0', common.desktop_ua + headers_1)
+ polymer_json = common.fetch_url(base_url + '/videos?pbj=1&view=0', common.desktop_ua + headers_1)
polymer_json = json.loads(polymer_json)
return channel_videos_html(polymer_json)
elif page == 'about':
- polymer_json = common.fetch_url('https://www.youtube.com/user/' + username + '/about?pbj=1', common.desktop_ua + headers_1)
+ polymer_json = common.fetch_url(base_url + '/about?pbj=1', common.desktop_ua + headers_1)
polymer_json = json.loads(polymer_json)
return channel_about_page(polymer_json)
elif page == 'playlists':
- polymer_json = common.fetch_url('https://www.youtube.com/user/' + username + '/playlists?pbj=1&view=1', common.desktop_ua + headers_1)
+ polymer_json = common.fetch_url(base_url+ '/playlists?pbj=1&view=1', common.desktop_ua + headers_1)
polymer_json = json.loads(polymer_json)
return channel_playlists_html(polymer_json)
elif page == 'search':
diff --git a/youtube/youtube.py b/youtube/youtube.py
index 74d03e9..cb35eac 100644
--- a/youtube/youtube.py
+++ b/youtube/youtube.py
@@ -41,9 +41,9 @@ def youtube(env, start_response):
start_response('200 OK', (('Content-type','text/html'),) )
return channel.get_channel_page(path[9:], query_string=query_string).encode()
- elif path.startswith("/user/"):
+ elif path.startswith("/user/") or path.startswith("/c/"):
start_response('200 OK', (('Content-type','text/html'),) )
- return channel.get_user_page(path[6:], query_string=query_string).encode()
+ return channel.get_channel_page_general_url(path, query_string=query_string).encode()
elif path.startswith("/playlists"):
start_response('200 OK', (('Content-type','text/html'),) )
@@ -71,8 +71,8 @@ def youtube(env, start_response):
return f.read().replace(b'$port_number', str(settings.port_number).encode())
else:
- start_response('404 Not Found', () )
- return b'404 Not Found'
+ start_response('200 OK', (('Content-type','text/html'),) )
+ return channel.get_channel_page_general_url(path, query_string=query_string).encode()
elif method == "POST":
fields = urllib.parse.parse_qs(env['wsgi.input'].read().decode())