Storyboards: Fix broken first storyboard

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

View file

@ -178,7 +178,7 @@ struct Video
def storyboards def storyboards
container = info.dig?("storyboards") || JSON::Any.new("{}") 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 end
def paid def paid

View file

@ -30,7 +30,7 @@ module Invidious::Videos
end end
# Parse the JSON structure from Youtube # 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 # Livestream storyboards are a bit different
# TODO: document exactly how # TODO: document exactly how
if storyboard = container.dig?("playerLiveStoryboardSpecRenderer", "spec").try &.as_s 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 # columns/rows: maximum amount of thumbnails that can be stuffed in a
# single image, horizontally and vertically. # single image, horizontally and vertically.
# interval: interval between two thumbnails, in milliseconds # interval: interval between two thumbnails, in milliseconds
# name: storyboard filename. Usually "M$M" or "default"
# sigh: URL cryptographic signature # 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 width = width.to_i
height = height.to_i height = height.to_i
@ -85,7 +86,7 @@ module Invidious::Videos
url.query = params.to_s url.query = params.to_s
# Replace the template parts with what we have # 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 # 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) # 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. # hold all of the thumbnails. It can't be less than 1.
images_count = (count / thumbnails_per_image).ceil.to_i 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( Storyboard.new(
url: url, url: url,
width: width, width: width,