summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorsyeopite <syeopite@syeopite.dev>2023-08-24 15:10:50 -0700
committersyeopite <syeopite@syeopite.dev>2023-09-23 09:40:04 -0400
commit0cb7d0b44137c2cee9b6352969a28dac4e3576c5 (patch)
tree8aa5280cab5e6d3a2aa15c2d4ae85139e9fa9d68 /src
parent54fa59cbb0ae90a54136522c944410e2d18c234b (diff)
downloadinvidious-0cb7d0b44137c2cee9b6352969a28dac4e3576c5.tar.gz
invidious-0cb7d0b44137c2cee9b6352969a28dac4e3576c5.tar.bz2
invidious-0cb7d0b44137c2cee9b6352969a28dac4e3576c5.zip
Refactor Invidious's VTT logic to use WebVtt.build
Diffstat (limited to 'src')
-rw-r--r--src/invidious/routes/api/v1/videos.cr39
-rw-r--r--src/invidious/videos/caption.cr41
-rw-r--r--src/invidious/videos/transcript.cr40
3 files changed, 29 insertions, 91 deletions
diff --git a/src/invidious/routes/api/v1/videos.cr b/src/invidious/routes/api/v1/videos.cr
index 25e766d2..5c50a804 100644
--- a/src/invidious/routes/api/v1/videos.cr
+++ b/src/invidious/routes/api/v1/videos.cr
@@ -101,20 +101,17 @@ module Invidious::Routes::API::V1::Videos
if caption.name.includes? "auto-generated"
caption_xml = YT_POOL.client &.get(url).body
+ settings_field = {
+ "Kind" => "captions",
+ "Language" => "#{tlang || caption.language_code}",
+ }
+
if caption_xml.starts_with?("<?xml")
webvtt = caption.timedtext_to_vtt(caption_xml, tlang)
else
caption_xml = XML.parse(caption_xml)
- webvtt = String.build do |str|
- str << <<-END_VTT
- WEBVTT
- Kind: captions
- Language: #{tlang || caption.language_code}
-
-
- END_VTT
-
+ webvtt = WebVTT.build(settings_field) do |webvtt|
caption_nodes = caption_xml.xpath_nodes("//transcript/text")
caption_nodes.each_with_index do |node, i|
start_time = node["start"].to_f.seconds
@@ -127,9 +124,6 @@ module Invidious::Routes::API::V1::Videos
end_time = start_time + duration
end
- start_time = "#{start_time.hours.to_s.rjust(2, '0')}:#{start_time.minutes.to_s.rjust(2, '0')}:#{start_time.seconds.to_s.rjust(2, '0')}.#{start_time.milliseconds.to_s.rjust(3, '0')}"
- end_time = "#{end_time.hours.to_s.rjust(2, '0')}:#{end_time.minutes.to_s.rjust(2, '0')}:#{end_time.seconds.to_s.rjust(2, '0')}.#{end_time.milliseconds.to_s.rjust(3, '0')}"
-
text = HTML.unescape(node.content)
text = text.gsub(/<font color="#[a-fA-F0-9]{6}">/, "")
text = text.gsub(/<\/font>/, "")
@@ -137,12 +131,7 @@ module Invidious::Routes::API::V1::Videos
text = "<v #{md["name"]}>#{md["text"]}</v>"
end
- str << <<-END_CUE
- #{start_time} --> #{end_time}
- #{text}
-
-
- END_CUE
+ webvtt.line(start_time, end_time, text)
end
end
end
@@ -215,11 +204,7 @@ module Invidious::Routes::API::V1::Videos
storyboard = storyboard[0]
end
- String.build do |str|
- str << <<-END_VTT
- WEBVTT
- END_VTT
-
+ WebVTT.build do |vtt|
start_time = 0.milliseconds
end_time = storyboard[:interval].milliseconds
@@ -231,12 +216,8 @@ module Invidious::Routes::API::V1::Videos
storyboard[:storyboard_height].times do |j|
storyboard[:storyboard_width].times do |k|
- str << <<-END_CUE
- #{start_time}.000 --> #{end_time}.000
- #{url}#xywh=#{storyboard[:width] * k},#{storyboard[:height] * j},#{storyboard[:width] - 2},#{storyboard[:height]}
-
-
- END_CUE
+ current_cue_url = "#{url}#xywh=#{storyboard[:width] * k},#{storyboard[:height] * j},#{storyboard[:width] - 2},#{storyboard[:height]}"
+ vtt.line(start_time, end_time, current_cue_url)
start_time += storyboard[:interval].milliseconds
end_time += storyboard[:interval].milliseconds
diff --git a/src/invidious/videos/caption.cr b/src/invidious/videos/caption.cr
index 256dfcc0..dc58f9a0 100644
--- a/src/invidious/videos/caption.cr
+++ b/src/invidious/videos/caption.cr
@@ -52,17 +52,13 @@ module Invidious::Videos
break
end
end
- result = String.build do |result|
- result << <<-END_VTT
- WEBVTT
- Kind: captions
- Language: #{tlang || @language_code}
+ settings_field = {
+ "Kind" => "captions",
+ "Language" => "#{tlang || @language_code}",
+ }
- END_VTT
-
- result << "\n\n"
-
+ result = WebVTT.build(settings_field) do |vtt|
cues.each_with_index do |node, i|
start_time = node["t"].to_f.milliseconds
@@ -76,29 +72,16 @@ module Invidious::Videos
end_time = start_time + duration
end
- # start_time
- result << start_time.hours.to_s.rjust(2, '0')
- result << ':' << start_time.minutes.to_s.rjust(2, '0')
- result << ':' << start_time.seconds.to_s.rjust(2, '0')
- result << '.' << start_time.milliseconds.to_s.rjust(3, '0')
-
- result << " --> "
-
- # end_time
- result << end_time.hours.to_s.rjust(2, '0')
- result << ':' << end_time.minutes.to_s.rjust(2, '0')
- result << ':' << end_time.seconds.to_s.rjust(2, '0')
- result << '.' << end_time.milliseconds.to_s.rjust(3, '0')
-
- result << "\n"
-
- node.children.each do |s|
- result << s.content
+ text = String.build do |io|
+ node.children.each do |s|
+ io << s.content
+ end
end
- result << "\n"
- result << "\n"
+
+ vtt.line(start_time, end_time, text)
end
end
+
return result
end
end
diff --git a/src/invidious/videos/transcript.cr b/src/invidious/videos/transcript.cr
index f3360a52..cd97cfde 100644
--- a/src/invidious/videos/transcript.cr
+++ b/src/invidious/videos/transcript.cr
@@ -34,41 +34,15 @@ module Invidious::Videos
# Convert into array of TranscriptLine
lines = self.parse(initial_data)
- # Taken from Invidious::Videos::Captions::Metadata.timedtext_to_vtt()
- vtt = String.build do |vtt|
- vtt << <<-END_VTT
- WEBVTT
- Kind: captions
- Language: #{target_language}
-
-
- END_VTT
-
- vtt << "\n\n"
+ settings_field = {
+ "Kind" => "captions",
+ "Language" => target_language
+ }
+ # Taken from Invidious::Videos::Captions::Metadata.timedtext_to_vtt()
+ vtt = WebVTT.build(settings_field) do |vtt|
lines.each do |line|
- start_time = line.start_ms
- end_time = line.end_ms
-
- # 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 << line.line
-
- vtt << "\n"
- vtt << "\n"
+ vtt.line(line.start_ms, line.end_ms, line.line)
end
end