Storyboards: Fix broken first storyboard

This commit is contained in:
Samantaz Fox 2023-10-08 20:36:32 +02:00
parent 5c14ee4333
commit bc709bf624
No known key found for this signature in database
GPG Key ID: F42821059186176E
2 changed files with 11 additions and 4 deletions

View File

@ -147,7 +147,7 @@ struct Video
def storyboards
container = info.dig?("storyboards") || JSON::Any.new("{}")
return IV::Videos::Storyboard.from_yt_json(container)
return IV::Videos::Storyboard.from_yt_json(container, self.length_seconds)
end
def paid

View File

@ -30,7 +30,7 @@ module Invidious::Videos
end
# Parse the JSON structure from Youtube
def self.from_yt_json(container : JSON::Any) : Array(Storyboard)
def self.from_yt_json(container : JSON::Any, length_seconds : Int32) : Array(Storyboard)
# Livestream storyboards are a bit different
# TODO: document exactly how
if storyboard = container.dig?("playerLiveStoryboardSpecRenderer", "spec").try &.as_s
@ -70,8 +70,9 @@ module Invidious::Videos
# columns/rows: maximum amount of thumbnails that can be stuffed in a
# single image, horizontally and vertically.
# interval: interval between two thumbnails, in milliseconds
# name: storyboard filename. Usually "M$M" or "default"
# sigh: URL cryptographic signature
width, height, count, columns, rows, interval, _, sigh = sb.split("#")
width, height, count, columns, rows, interval, name, sigh = sb.split("#")
width = width.to_i
height = height.to_i
@ -85,7 +86,7 @@ module Invidious::Videos
url.query = params.to_s
# Replace the template parts with what we have
url.path = url.path.sub("$L", i).sub("$N", "M$M")
url.path = url.path.sub("$L", i).sub("$N", name)
# This value represents the maximum amount of thumbnails that can fit
# in a single image. The last image (or the only one for short videos)
@ -96,6 +97,12 @@ module Invidious::Videos
# hold all of the thumbnails. It can't be less than 1.
images_count = (count / thumbnails_per_image).ceil.to_i
# Compute the interval when needed (in general, that's only required
# for the first "default" storyboard).
if interval == 0
interval = ((length_seconds / count) * 1_000).to_i
end
Storyboard.new(
url: url,
width: width,