diff --git a/settings.py b/settings.py index 56a6a01..dfab369 100644 --- a/settings.py +++ b/settings.py @@ -134,6 +134,13 @@ For security reasons, enabling this is not recommended.''', 'default': True, 'comment': '', }), + + ('use_comments_js', { + 'label': 'Enable comments.js', + 'type': bool, + 'default': True, + 'comment': '', + }), ('theme', { 'type': int, diff --git a/youtube/__init__.py b/youtube/__init__.py index 6c2ec48..3c271f1 100644 --- a/youtube/__init__.py +++ b/youtube/__init__.py @@ -5,6 +5,7 @@ import traceback import re from sys import exc_info yt_app = flask.Flask(__name__) +yt_app.config['TEMPLATES_AUTO_RELOAD'] = True yt_app.url_map.strict_slashes = False @@ -25,6 +26,7 @@ theme_names = { def inject_theme_preference(): return { 'theme_path': '/youtube.com/static/' + theme_names[settings.theme] + '.css', + 'settings': settings, } @yt_app.template_filter('commatize') diff --git a/youtube/channel.py b/youtube/channel.py index ad6db5b..e9cc87b 100644 --- a/youtube/channel.py +++ b/youtube/channel.py @@ -150,7 +150,8 @@ def get_number_of_videos_channel(channel_id): response = response.decode('utf-8') - match = re.search(r'"numVideosText":\s*{\s*"runs":\s*\[{"text":\s*"([\d,]*) videos"', response) + # match = re.search(r'"numVideosText":\s*{\s*"runs":\s*\[{"text":\s*"([\d,]*) videos"', response) + match = re.search(r'"numVideosText".*?([,\d]+)', response) if match: return int(match.group(1).replace(',','')) else: @@ -209,7 +210,7 @@ def get_channel_page_general_url(base_url, tab, request, channel_id=None): if tab == 'videos' and channel_id: 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.joinall(tasks) @@ -217,7 +218,7 @@ def get_channel_page_general_url(base_url, tab, request, channel_id=None): number_of_videos, polymer_json = tasks[0].value, tasks[1].value elif tab == 'videos': tasks = ( - gevent.spawn(get_number_of_videos_general, base_url), + 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.joinall(tasks) diff --git a/youtube/comments.py b/youtube/comments.py index 1d0e92a..a7a93cc 100644 --- a/youtube/comments.py +++ b/youtube/comments.py @@ -27,7 +27,7 @@ from flask import request def make_comment_ctoken(video_id, sort=0, offset=0, lc='', secret_key=''): video_id = proto.as_bytes(video_id) secret_key = proto.as_bytes(secret_key) - + page_info = proto.string(4,video_id) + proto.uint(6, sort) offset_information = proto.nested(4, page_info) + proto.uint(5, offset) @@ -41,11 +41,11 @@ def make_comment_ctoken(video_id, sort=0, offset=0, lc='', secret_key=''): result = proto.nested(2, page_params) + proto.uint(3,6) + proto.nested(6, offset_information) return base64.urlsafe_b64encode(result).decode('ascii') -def comment_replies_ctoken(video_id, comment_id, max_results=500): +def comment_replies_ctoken(video_id, comment_id, max_results=500): params = proto.string(2, comment_id) + proto.uint(9, max_results) params = proto.nested(3, params) - + result = proto.nested(2, proto.string(2, video_id)) + proto.uint(3,6) + proto.nested(6, params) return base64.urlsafe_b64encode(result).decode('ascii') @@ -187,8 +187,10 @@ def get_comments_page(): 'replying': replies, } + return flask.render_template('comments_page.html', comments_info = comments_info, comment_posting_box_info = comment_posting_box_info, + slim = request.args.get('slim', False) ) diff --git a/youtube/playlist.py b/youtube/playlist.py index a5ec0db..e596eae 100644 --- a/youtube/playlist.py +++ b/youtube/playlist.py @@ -1,4 +1,4 @@ -from youtube import util, yt_data_extract, proto +from youtube import util, yt_data_extract, proto, local_playlist from youtube import yt_app import settings @@ -115,6 +115,7 @@ def get_playlist_page(): video_count = 40 return flask.render_template('playlist.html', + header_playlist_names = local_playlist.get_playlist_names(), video_list = info.get('items', []), num_pages = math.ceil(video_count/20), parameters_dictionary = request.args, diff --git a/youtube/static/js/comments.js b/youtube/static/js/comments.js new file mode 100644 index 0000000..845ed3e --- /dev/null +++ b/youtube/static/js/comments.js @@ -0,0 +1,20 @@ +function onClickReplies(e) { + var details = e.target.parentElement; + // e.preventDefault(); + console.log("loading replies .."); + doXhr(details.getAttribute("src") + "&slim=1", (html) => { + var div = details.querySelector(".comment_page"); + div.innerHTML = html; + }); + details.removeEventListener('click', onClickReplies); +} + +window.addEventListener('DOMContentLoaded', function() { + QA("details.replies").forEach(details => { + details.addEventListener('click', onClickReplies); + details.addEventListener('auxclick', (e) => { + if (e.target.parentElement !== details) return; + if (e.button == 1) window.open(details.getAttribute("src")); + }); + }); +}); \ No newline at end of file diff --git a/youtube/static/js/common.js b/youtube/static/js/common.js index 687c6fa..2997f61 100644 --- a/youtube/static/js/common.js +++ b/youtube/static/js/common.js @@ -1,4 +1,5 @@ Q = document.querySelector.bind(document); +QA = document.querySelectorAll.bind(document); function text(msg) { return document.createTextNode(msg); } function clearNode(node) { while (node.firstChild) node.removeChild(node.firstChild); } function toTimestamp(seconds) { @@ -36,6 +37,19 @@ function getDefaultTranscriptTrackIdx() { return textTracks.length - 1; } +function doXhr(url, callback=null) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url); + xhr.onload = (e) => { + let ok = xhr.status >= 200 && xhr.status < 300; + if (ok) callback(e.currentTarget.response); + else alert(`${xhr.responseURL} status code: ${xhr.status}`); + } + xhr.send(); + return xhr; +} + + window.addEventListener('DOMContentLoaded', function() { cur_track_idx = getDefaultTranscriptTrackIdx(); -}); +}); \ No newline at end of file diff --git a/youtube/templates/base.html b/youtube/templates/base.html index c647c68..f325f86 100644 --- a/youtube/templates/base.html +++ b/youtube/templates/base.html @@ -20,7 +20,8 @@
Home