Storyboards: Fix broken first storyboard
This commit is contained in:
parent
da3d58f03c
commit
7b50388eaf
2 changed files with 11 additions and 4 deletions
|
@ -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
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Reference in a new issue