From 26620cbac85f1fa5057e54fa8d91c35d907c0e0f Mon Sep 17 00:00:00 2001 From: James Taylor Date: Sun, 8 Jul 2018 02:56:54 -0700 Subject: front-end support for adding to playlists --- youtube/channel.py | 3 +++ youtube/comments.py | 7 ++--- youtube/common.py | 30 +++++++++++++++++++-- youtube/local_playlist.py | 12 ++++++--- youtube/playlist.py | 1 + youtube/search.py | 1 + youtube/shared.css | 69 ++++++++++++++++++++++++++++++++++++----------- youtube/watch.py | 1 + 8 files changed, 100 insertions(+), 24 deletions(-) (limited to 'youtube') diff --git a/youtube/channel.py b/youtube/channel.py index 4d7b563..6fd0dbd 100644 --- a/youtube/channel.py +++ b/youtube/channel.py @@ -156,6 +156,7 @@ def channel_videos_html(polymer_json, current_page=1, number_of_videos = 1000, c items_html = grid_items_html(items, {'author': microformat['title']}) return yt_channel_items_template.substitute( + header = common.get_header(), channel_title = microformat['title'], channel_tabs = channel_tabs_html(channel_id, 'Videos'), avatar = '/' + microformat['thumbnail']['thumbnails'][0]['url'], @@ -190,6 +191,7 @@ def channel_playlists_html(polymer_json): items_html = grid_items_html(items, {'author': microformat['title']}) return yt_channel_items_template.substitute( + header = common.get_header(), channel_title = microformat['title'], channel_tabs = channel_tabs_html(channel_id, 'Playlists'), avatar = '/' + microformat['thumbnail']['thumbnails'][0]['url'], @@ -227,6 +229,7 @@ def channel_about_page(polymer_json): except KeyError: description = '' return yt_channel_about_template.substitute( + header = common.get_header(), page_title = common.get_plain_text(channel_metadata['title']) + ' - About', channel_title = common.get_plain_text(channel_metadata['title']), avatar = html.escape(avatar), diff --git a/youtube/comments.py b/youtube/comments.py index 523a410..4a00292 100644 --- a/youtube/comments.py +++ b/youtube/comments.py @@ -1,5 +1,5 @@ import json -import youtube.proto as proto +from youtube import proto, common import base64 from youtube.common import uppercase_escape, default_multi_get, format_text_runs, URL_ORIGIN, fetch_url from string import Template @@ -98,8 +98,8 @@ def request_comments(ctoken, replies=False): print("got , retrying") continue break - '''with open('debug/comments_debug', 'wb') as f: - f.write(content)''' + with open('debug/comments_debug', 'wb') as f: + f.write(content) return content def parse_comments(content, replies=False): @@ -181,6 +181,7 @@ def get_comments_page(query_string): more_comments_button = more_comments_template.substitute(url = URL_ORIGIN + '/comments?ctoken=' + ctoken) return yt_comments_template.substitute( + header = common.get_header(), comments = comments_html, page_title = 'Comments', more_comments_button=more_comments_button, diff --git a/youtube/common.py b/youtube/common.py index 3ee952d..f0d6694 100644 --- a/youtube/common.py +++ b/youtube/common.py @@ -1,4 +1,5 @@ from youtube.template import Template +from youtube import local_playlist import html import json import re @@ -280,8 +281,33 @@ def medium_video_item_html(medium_video_info): ) - - +header_template = Template(''' +
+
+ +
+
+
+ + + +$playlists + + + +
+
+
+''') +playlist_option_template = Template('''''') +def get_header(): + playlists = '' + for name in local_playlist.get_playlist_names(): + playlists += playlist_option_template.substitute(name = name) + return header_template.substitute(playlists=playlists) diff --git a/youtube/local_playlist.py b/youtube/local_playlist.py index 057555a..5a4182b 100644 --- a/youtube/local_playlist.py +++ b/youtube/local_playlist.py @@ -1,13 +1,19 @@ -import os.path +import os import json playlists_directory = os.path.normpath("data/playlists") def add_to_playlist(name, video_info_list): - with open(os.path.join(playlists_directory, name), "a", encoding='utf-8') as file: + with open(os.path.join(playlists_directory, name + ".txt"), "a", encoding='utf-8') as file: for info in video_info_list: file.write(info + "\n") def get_playlist_page(name): - pass \ No newline at end of file + pass + +def get_playlist_names(): + for item in os.listdir(playlists_directory): + name, ext = os.path.splitext(item) + if ext == '.txt': + yield name \ No newline at end of file diff --git a/youtube/playlist.py b/youtube/playlist.py index 3951b24..d146b92 100644 --- a/youtube/playlist.py +++ b/youtube/playlist.py @@ -115,6 +115,7 @@ def get_playlist_page(query_string): stats += playlist_stat_template.substitute(stat=html_ready['size'] + ' videos') stats += playlist_stat_template.substitute(stat=html_ready['views']) return yt_playlist_template.substitute( + header = common.get_header(), videos = videos_html, page_buttons = page_buttons, stats = stats, diff --git a/youtube/search.py b/youtube/search.py index 9596727..09a161e 100644 --- a/youtube/search.py +++ b/youtube/search.py @@ -129,6 +129,7 @@ def get_search_page(query_string, parameters=()): result = Template(yt_search_results_template).substitute( + header = common.get_header(), results = result_list_html, page_title = query + " - Search", search_box_value = html.escape(query), diff --git a/youtube/shared.css b/youtube/shared.css index 240fd5c..340e164 100644 --- a/youtube/shared.css +++ b/youtube/shared.css @@ -23,6 +23,9 @@ body{ background-color:#333333; grid-row: 1; + + display:grid; + grid-template-columns: 3fr 2fr; } main{ @@ -35,28 +38,62 @@ button{ address{ font-style:normal; } -#site-search{ - display: grid; - grid-template-columns: 1fr 0fr; +#header-left{ + grid-column:1; + + display:grid; + grid-template-columns: 1fr 640px; } - - #site-search .search-box{ - align-self:center; - height:25px; - border:0; - - grid-column: 1; - } - #site-search .search-button{ + #site-search{ grid-column: 2; - align-self:center; - height:25px; + display: grid; + grid-template-columns: 1fr 0fr; - border-style:solid; - border-width:1px; } + + #site-search .search-box{ + align-self:center; + height:25px; + border:0; + + grid-column: 1; + } + #site-search .search-button{ + grid-column: 2; + align-self:center; + height:25px; + + border-style:solid; + border-width:1px; + } + +#header-right{ + grid-column:2; + display:grid; + grid-template-columns:40px 400px 100px 1fr; + grid-template-rows: 1fr 1fr; +} + #playlist-add{ + display:contents; + } + #playlist-name-selection{ + grid-column:2; + grid-row:1; + justify-self:start; + } + #playlist-add-button{ + grid-column:2; + grid-row:2; + justify-self:start; + } + #item-selection-reset{ + grid-column:3; + grid-row:2; + justify-self:center; + } + .item-list{ display: grid; grid-auto-rows: 138px; diff --git a/youtube/watch.py b/youtube/watch.py index 6e1efbc..895f9bf 100644 --- a/youtube/watch.py +++ b/youtube/watch.py @@ -278,6 +278,7 @@ def get_watch_page(query_string): page = yt_watch_template.substitute( video_title=html.escape(info["title"]), page_title=html.escape(info["title"]), + header=common.get_header(), uploader=html.escape(info["uploader"]), uploader_channel_url='/' + info["uploader_url"], #upload_date=datetime.datetime.fromtimestamp(info["timestamp"]).strftime("%d %b %Y %H:%M:%S"), -- cgit v1.2.3