aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJames Taylor <user234683@users.noreply.github.com>2020-09-18 17:32:28 -0700
committerJames Taylor <user234683@users.noreply.github.com>2020-09-18 17:32:28 -0700
commit753f6c5389be82f4a17dafb1698e2f65388d35b6 (patch)
tree08593c8b283a9d10adf2c1c31e0954f5ac6232f1
parente9989af03a0d6044106030f164f807cee42c1420 (diff)
downloadyt-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__.py17
-rw-r--r--youtube/templates/comments.html10
-rw-r--r--youtube/templates/watch.html2
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>