From 39b0229835670b406667469c59d7be818089d197 Mon Sep 17 00:00:00 2001 From: syeopite Date: Sat, 19 Aug 2023 21:37:36 -0700 Subject: [PATCH] Add method to convert chapters to vtt --- src/invidious/routes/api/v1/videos.cr | 4 +++ src/invidious/videos/chapters.cr | 37 +++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/src/invidious/routes/api/v1/videos.cr b/src/invidious/routes/api/v1/videos.cr index 3665eda5..5b35d39f 100644 --- a/src/invidious/routes/api/v1/videos.cr +++ b/src/invidious/routes/api/v1/videos.cr @@ -463,6 +463,10 @@ module Invidious::Routes::API::V1::Videos end return response + else + env.response.content_type = "text/vtt; charset=UTF-8" + + return Invidious::Videos::Chapters.chapters_to_vtt(chapters) end end end diff --git a/src/invidious/videos/chapters.cr b/src/invidious/videos/chapters.cr index 8f5a3c24..f8c31648 100644 --- a/src/invidious/videos/chapters.cr +++ b/src/invidious/videos/chapters.cr @@ -46,4 +46,41 @@ module Invidious::Videos::Chapters return segments end + + # Converts an array of Chapter objects to a webvtt file + def self.chapters_to_vtt(chapters : Array(Chapter)) + vtt = String.build do |vtt| + vtt << <<-END_VTT + WEBVTT + + + END_VTT + + # Taken from Invidious::Videos::Caption.timedtext_to_vtt() + chapters.each do |chapter| + start_time = chapter.start_ms.milliseconds + end_time = chapter.end_ms.milliseconds + + # start_time + vtt << start_time.hours.to_s.rjust(2, '0') + vtt << ':' << start_time.minutes.to_s.rjust(2, '0') + vtt << ':' << start_time.seconds.to_s.rjust(2, '0') + vtt << '.' << start_time.milliseconds.to_s.rjust(3, '0') + + vtt << " --> " + + # end_time + vtt << end_time.hours.to_s.rjust(2, '0') + vtt << ':' << end_time.minutes.to_s.rjust(2, '0') + vtt << ':' << end_time.seconds.to_s.rjust(2, '0') + vtt << '.' << end_time.milliseconds.to_s.rjust(3, '0') + + vtt << "\n" + vtt << chapter.title + + vtt << "\n" + vtt << "\n" + end + end + end end