Propose subtitles in the native video player

This commit is contained in:
southerntofu 2021-07-28 19:43:34 -04:00 committed by metalune
parent 8e473b7948
commit ee6b30b0c0
3 changed files with 27 additions and 1 deletions

15
main.py
View file

@ -12,6 +12,7 @@ h2t.ignore_links = True
class VideoWrapper: class VideoWrapper:
def __init__(self, a, quality): def __init__(self, a, quality):
self.name = a["name"] self.name = a["name"]
self.uuid = a["uuid"]
self.channel = a["channel"] self.channel = a["channel"]
self.description = a["description"] self.description = a["description"]
self.thumbnailPath = a["thumbnailPath"] self.thumbnailPath = a["thumbnailPath"]
@ -19,6 +20,7 @@ class VideoWrapper:
self.category = a["category"] self.category = a["category"]
self.licence = a["licence"] self.licence = a["licence"]
self.language = a["language"] self.language = a["language"]
self.captions = a["captions"]
self.privacy = a["privacy"] self.privacy = a["privacy"]
self.tags = a["tags"] self.tags = a["tags"]
@ -258,6 +260,7 @@ async def search(domain, term, page):
@app.route("/<string:domain>/videos/watch/<string:id>/") @app.route("/<string:domain>/videos/watch/<string:id>/")
async def video(domain, id): async def video(domain, id):
data = peertube.video(domain, id) data = peertube.video(domain, id)
data["captions"] = peertube.video_captions(domain, id)
quality = request.args.get("quality") quality = request.args.get("quality")
embed = request.args.get("embed") embed = request.args.get("embed")
vid = VideoWrapper(data, quality) vid = VideoWrapper(data, quality)
@ -403,6 +406,18 @@ async def video_channels__about(domain, name):
about = peertube.video_channel(domain, name) about = peertube.video_channel(domain, name)
) )
# --- Subtitles/captions proxying ---
@app.route("/<string:domain>/videos/watch/<string:id>/<string:lang>.vtt")
async def subtitles(domain, id, lang):
try:
return peertube.video_captions_download(domain, id, lang)
except Exception as e:
return await render_template(
"error.html",
error_number = "500",
error_reason = e
), 500
if __name__ == "__main__": if __name__ == "__main__":
if len(sys.argv) == 3: if len(sys.argv) == 3:
interface = sys.argv[1] interface = sys.argv[1]

View file

@ -22,6 +22,16 @@ def video(domain, id):
url = "https://" + domain + "/api/v1/videos/" + id url = "https://" + domain + "/api/v1/videos/" + id
return json.loads(requests.get(url).text) return json.loads(requests.get(url).text)
def video_captions(domain, id):
url = "https://" + domain + "/api/v1/videos/" + id + "/captions"
return json.loads(requests.get(url).text)
def video_captions_download(domain, id, lang):
# URL is hardcoded to prevent further proxying. URL may change with updates, see captions API
# eg. https://kolektiva.media/api/v1/videos/9c9de5e8-0a1e-484a-b099-e80766180a6d/captions
url = "https://" + domain + "/lazy-static/video-captions/" + id + '-' + lang + ".vtt"
return requests.get(url).text
def search(domain, term, start=0, count=10): def search(domain, term, start=0, count=10):
url = "https://" + domain + "/api/v1/search/videos?start=" + str(start) + "&count=" + str(count) + "&search=" + term + "&sort=-match&searchTarget=local" url = "https://" + domain + "/api/v1/search/videos?start=" + str(start) + "&count=" + str(count) + "&search=" + term + "&sort=-match&searchTarget=local"
return json.loads(requests.get(url).text) return json.loads(requests.get(url).text)

View file

@ -22,7 +22,8 @@ By:
<b>Resolutions:</b> <b>Resolutions:</b>
{% else %} {% else %}
<video height="300" style="max-width: 100%" controls> <video height="300" style="max-width: 100%" controls>
<source src="{{ video.video }}"> <source src="{{ video.video }}">{% for track in video.captions.data %}
<track kind="subtitles" srclang="{{ track.language.id }}" label="{{ track.language.label }}" src="/{{ domain }}/videos/watch/{{ video.uuid }}/{{ track.language.id }}.vtt">{% endfor %}
</video> </video>
<br> <br>
<b>Resolutions:</b> <b>Resolutions:</b>