diff options
author | James Taylor <user234683@users.noreply.github.com> | 2020-09-18 17:32:28 -0700 |
---|---|---|
committer | James Taylor <user234683@users.noreply.github.com> | 2020-09-18 17:32:28 -0700 |
commit | 753f6c5389be82f4a17dafb1698e2f65388d35b6 (patch) | |
tree | 08593c8b283a9d10adf2c1c31e0954f5ac6232f1 | |
parent | e9989af03a0d6044106030f164f807cee42c1420 (diff) | |
download | yt-local-753f6c5389be82f4a17dafb1698e2f65388d35b6.tar.lz yt-local-753f6c5389be82f4a17dafb1698e2f65388d35b6.tar.xz yt-local-753f6c5389be82f4a17dafb1698e2f65388d35b6.zip |
Jump video to timestamp in description or comments
-rw-r--r-- | youtube/__init__.py | 17 | ||||
-rw-r--r-- | youtube/templates/comments.html | 10 | ||||
-rw-r--r-- | youtube/templates/watch.html | 2 |
3 files changed, 25 insertions, 4 deletions
diff --git a/youtube/__init__.py b/youtube/__init__.py index 8675c4b..6c2ec48 100644 --- a/youtube/__init__.py +++ b/youtube/__init__.py @@ -2,6 +2,7 @@ from youtube import util import flask import settings import traceback +import re from sys import exc_info yt_app = flask.Flask(__name__) yt_app.url_map.strict_slashes = False @@ -34,6 +35,22 @@ def commatize(num): num = int(num) return '{:,}'.format(num) +def timestamp_replacement(match): + time_seconds = 0 + for part in match.group(0).split(':'): + time_seconds = 60*time_seconds + int(part) + return ( + '<a href="#" onclick="document.querySelector(\'video\').currentTime=' + + str(time_seconds) + + '">' + match.group(0) + + '</a>' + ) + +TIMESTAMP_RE = re.compile(r'\b(\d?\d:)?\d?\d:\d\d\b') +@yt_app.template_filter('timestamps') +def timestamps(text): + return TIMESTAMP_RE.sub(timestamp_replacement, text) + @yt_app.errorhandler(500) def error_page(e): if (exc_info()[0] == util.FetchError diff --git a/youtube/templates/comments.html b/youtube/templates/comments.html index 396852a..f2cdf65 100644 --- a/youtube/templates/comments.html +++ b/youtube/templates/comments.html @@ -1,6 +1,6 @@ {% import "common_elements.html" as common_elements %} -{% macro render_comment(comment, include_avatar) %} +{% macro render_comment(comment, include_avatar, timestamp_links=False) %} <div class="comment-container"> <div class="comment"> <a class="author-avatar" href="{{ comment['author_url'] }}" title="{{ comment['author'] }}"> @@ -14,7 +14,11 @@ <a class="permalink" href="{{ comment['permalink'] }}" title="permalink"> <time datetime="">{{ comment['time_published'] }}</time> </a> - <span class="text">{{ common_elements.text_runs(comment['text']) }}</span> + {% if timestamp_links %} + <span class="text">{{ common_elements.text_runs(comment['text'])|timestamps|safe }}</span> + {% else %} + <span class="text">{{ common_elements.text_runs(comment['text']) }}</span> + {% endif %} <span class="likes">{{ comment['likes_text'] if comment['like_count'] else ''}}</span> <div class="bottom-row"> @@ -36,7 +40,7 @@ </div> <div class="comments"> {% for comment in comments_info['comments'] %} - {{ render_comment(comment, comments_info['include_avatars']) }} + {{ render_comment(comment, comments_info['include_avatars'], True) }} {% endfor %} </div> {% if 'more_comments_url' is in comments_info %} diff --git a/youtube/templates/watch.html b/youtube/templates/watch.html index 74b9887..5ecf7ae 100644 --- a/youtube/templates/watch.html +++ b/youtube/templates/watch.html @@ -401,7 +401,7 @@ Reload without invidious (for usage of new identity button).</a> <input class="checkbox" name="video_info_list" value="{{ video_info }}" form="playlist-edit" type="checkbox"> - <span class="description">{{ common_elements.text_runs(description)|urlize }}</span> + <span class="description">{{ common_elements.text_runs(description)|escape|urlize|timestamps|safe }}</span> <div class="music-list"> {% if music_list.__len__() != 0 %} <hr> |