mirror of
https://github.com/iv-org/invidious.git
synced 2024-12-23 00:29:53 +05:30
Add thumbnails to dash
This commit is contained in:
parent
507bed6313
commit
c5b610d479
@ -5,6 +5,7 @@ module Invidious::Routes::API::Manifest
|
|||||||
env.response.content_type = "application/dash+xml"
|
env.response.content_type = "application/dash+xml"
|
||||||
|
|
||||||
local = env.params.query["local"]?.try &.== "true"
|
local = env.params.query["local"]?.try &.== "true"
|
||||||
|
thumbnails = env.params.query["thumbnails"]?.try &.== "true"
|
||||||
id = env.params.url["id"]
|
id = env.params.url["id"]
|
||||||
region = env.params.query["region"]?
|
region = env.params.query["region"]?
|
||||||
|
|
||||||
@ -126,6 +127,62 @@ module Invidious::Routes::API::Manifest
|
|||||||
|
|
||||||
i += 1
|
i += 1
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if thumbnails
|
||||||
|
# https://dashif.org/docs/DASH-IF-IOP-v4.3.pdf
|
||||||
|
{"image/jpeg"}.each do |mime_type|
|
||||||
|
storyboards = video.storyboards
|
||||||
|
next if storyboards.empty?
|
||||||
|
|
||||||
|
storyboards.each do |storyboard|
|
||||||
|
interval = storyboard[:interval].to_i
|
||||||
|
# interval can be 0 https://github.com/iv-org/invidious/issues/3441
|
||||||
|
next if interval == 0
|
||||||
|
|
||||||
|
storyboard_height = storyboard[:storyboard_height]
|
||||||
|
|
||||||
|
# BUG: storyboardHeight can be wrong https://github.com/iv-org/invidious/issues/3440
|
||||||
|
# this fix/assumption is only if we have storyboard[:storyboard_count] = 1
|
||||||
|
if storyboard[:storyboard_count] == 1
|
||||||
|
storyboard_height = storyboard[:count] // storyboard[:storyboard_width]
|
||||||
|
if storyboard[:count] % storyboard[:storyboard_width] > 0
|
||||||
|
storyboard_height += 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
tiles_per_page = storyboard[:storyboard_width] * storyboard_height
|
||||||
|
interval_seconds = interval // 1000
|
||||||
|
|
||||||
|
template_url = storyboard[:url]
|
||||||
|
|
||||||
|
# If the template changed from known format, abort.
|
||||||
|
next if !template_url.includes? "$M"
|
||||||
|
|
||||||
|
# Youtube template uses the var $M for tile pages
|
||||||
|
# DASH-IF uses $Number$ in the SegmentTemplate
|
||||||
|
url = template_url.gsub("$M", "$Number$")
|
||||||
|
|
||||||
|
storyboard_width = storyboard[:storyboard_width]
|
||||||
|
|
||||||
|
tile_count = tiles_per_page
|
||||||
|
duration = tile_count * interval_seconds
|
||||||
|
|
||||||
|
width = storyboard[:width] * storyboard[:storyboard_width]
|
||||||
|
height = storyboard[:height] * storyboard_height
|
||||||
|
|
||||||
|
# Bandwidth is kind of a guess...
|
||||||
|
bandwidth = ((width * height * 0.5) / duration).to_i
|
||||||
|
|
||||||
|
xml.element("AdaptationSet", id: i, mimeType: mime_type, contentType: "image") do
|
||||||
|
xml.element("SegmentTemplate", media: url, duration: duration, startNumber: "0")
|
||||||
|
xml.element("Representation", id: "thumbnails_#{id}", bandwidth: bandwidth, width: width, height: height) do
|
||||||
|
xml.element("EssentialProperty", schemeIdUri: "http://dashif.org/guidelines/thumbnail_tile", value: "#{storyboard_width}x#{storyboard_height}")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
i += 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
Loading…
Reference in New Issue
Block a user