mirror of
https://github.com/iv-org/invidious.git
synced 2024-12-23 22:39:31 -05:00
Add 'fps' to '/videos/:id' endpoint
This commit is contained in:
parent
db2c10e3a0
commit
8b07a7b157
@ -1921,30 +1921,34 @@ get "/api/v1/videos/:id" do |env|
|
|||||||
|
|
||||||
json.field "adaptiveFormats" do
|
json.field "adaptiveFormats" do
|
||||||
json.array do
|
json.array do
|
||||||
adaptive_fmts.each_with_index do |adaptive_fmt, i|
|
adaptive_fmts.each do |fmt|
|
||||||
json.object do
|
json.object do
|
||||||
json.field "index", adaptive_fmt["index"]
|
json.field "index", fmt["index"]
|
||||||
json.field "bitrate", adaptive_fmt["bitrate"]
|
json.field "bitrate", fmt["bitrate"]
|
||||||
json.field "init", adaptive_fmt["init"]
|
json.field "init", fmt["init"]
|
||||||
json.field "url", adaptive_fmt["url"]
|
json.field "url", fmt["url"]
|
||||||
json.field "itag", adaptive_fmt["itag"]
|
json.field "itag", fmt["itag"]
|
||||||
json.field "type", adaptive_fmt["type"]
|
json.field "type", fmt["type"]
|
||||||
json.field "clen", adaptive_fmt["clen"]
|
json.field "clen", fmt["clen"]
|
||||||
json.field "lmt", adaptive_fmt["lmt"]
|
json.field "lmt", fmt["lmt"]
|
||||||
json.field "projectionType", adaptive_fmt["projection_type"]
|
json.field "projectionType", fmt["projection_type"]
|
||||||
|
|
||||||
fmt_info = itag_to_metadata(adaptive_fmt["itag"])
|
fmt_info = itag_to_metadata?(fmt["itag"])
|
||||||
|
if fmt_info
|
||||||
|
fps = fmt_info["fps"]?.try &.to_i || fmt["fps"]?.try &.to_i || 30
|
||||||
|
json.field "fps", fps
|
||||||
json.field "container", fmt_info["ext"]
|
json.field "container", fmt_info["ext"]
|
||||||
json.field "encoding", fmt_info["vcodec"]? || fmt_info["acodec"]
|
json.field "encoding", fmt_info["vcodec"]? || fmt_info["acodec"]
|
||||||
|
|
||||||
if fmt_info["fps"]?
|
|
||||||
json.field "fps", fmt_info["fps"]
|
|
||||||
end
|
|
||||||
|
|
||||||
if fmt_info["height"]?
|
if fmt_info["height"]?
|
||||||
json.field "qualityLabel", "#{fmt_info["height"]}p"
|
|
||||||
json.field "resolution", "#{fmt_info["height"]}p"
|
json.field "resolution", "#{fmt_info["height"]}p"
|
||||||
|
|
||||||
|
quality_label = "#{fmt_info["height"]}p"
|
||||||
|
if fps > 30
|
||||||
|
quality_label += "60"
|
||||||
|
end
|
||||||
|
json.field "qualityLabel", quality_label
|
||||||
|
|
||||||
if fmt_info["width"]?
|
if fmt_info["width"]?
|
||||||
json.field "size", "#{fmt_info["width"]}x#{fmt_info["height"]}"
|
json.field "size", "#{fmt_info["width"]}x#{fmt_info["height"]}"
|
||||||
end
|
end
|
||||||
@ -1953,6 +1957,7 @@ get "/api/v1/videos/:id" do |env|
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
json.field "formatStreams" do
|
json.field "formatStreams" do
|
||||||
json.array do
|
json.array do
|
||||||
@ -1963,18 +1968,22 @@ get "/api/v1/videos/:id" do |env|
|
|||||||
json.field "type", fmt["type"]
|
json.field "type", fmt["type"]
|
||||||
json.field "quality", fmt["quality"]
|
json.field "quality", fmt["quality"]
|
||||||
|
|
||||||
fmt_info = itag_to_metadata(fmt["itag"])
|
fmt_info = itag_to_metadata?(fmt["itag"])
|
||||||
|
if fmt_info
|
||||||
|
fps = fmt_info["fps"]?.try &.to_i || fmt["fps"]?.try &.to_i || 30
|
||||||
|
json.field "fps", fps
|
||||||
json.field "container", fmt_info["ext"]
|
json.field "container", fmt_info["ext"]
|
||||||
json.field "encoding", fmt_info["vcodec"]? || fmt_info["acodec"]
|
json.field "encoding", fmt_info["vcodec"]? || fmt_info["acodec"]
|
||||||
|
|
||||||
if fmt_info["fps"]?
|
|
||||||
json.field "fps", fmt_info["fps"]
|
|
||||||
end
|
|
||||||
|
|
||||||
if fmt_info["height"]?
|
if fmt_info["height"]?
|
||||||
json.field "qualityLabel", "#{fmt_info["height"]}p"
|
|
||||||
json.field "resolution", "#{fmt_info["height"]}p"
|
json.field "resolution", "#{fmt_info["height"]}p"
|
||||||
|
|
||||||
|
quality_label = "#{fmt_info["height"]}p"
|
||||||
|
if fps > 30
|
||||||
|
quality_label += "60"
|
||||||
|
end
|
||||||
|
json.field "qualityLabel", quality_label
|
||||||
|
|
||||||
if fmt_info["width"]?
|
if fmt_info["width"]?
|
||||||
json.field "size", "#{fmt_info["width"]}x#{fmt_info["height"]}"
|
json.field "size", "#{fmt_info["width"]}x#{fmt_info["height"]}"
|
||||||
end
|
end
|
||||||
@ -1983,6 +1992,7 @@ get "/api/v1/videos/:id" do |env|
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
json.field "captions" do
|
json.field "captions" do
|
||||||
json.array do
|
json.array do
|
||||||
|
@ -328,7 +328,7 @@ def fetch_video(id)
|
|||||||
return video
|
return video
|
||||||
end
|
end
|
||||||
|
|
||||||
def itag_to_metadata(itag : String)
|
def itag_to_metadata?(itag : String)
|
||||||
# See https://github.com/rg3/youtube-dl/blob/master/youtube_dl/extractor/youtube.py#L380-#L476
|
# See https://github.com/rg3/youtube-dl/blob/master/youtube_dl/extractor/youtube.py#L380-#L476
|
||||||
formats = {"5" => {"ext" => "flv", "width" => 400, "height" => 240, "acodec" => "mp3", "abr" => 64, "vcodec" => "h263"},
|
formats = {"5" => {"ext" => "flv", "width" => 400, "height" => 240, "acodec" => "mp3", "abr" => 64, "vcodec" => "h263"},
|
||||||
"6" => {"ext" => "flv", "width" => 450, "height" => 270, "acodec" => "mp3", "abr" => 64, "vcodec" => "h263"},
|
"6" => {"ext" => "flv", "width" => 450, "height" => 270, "acodec" => "mp3", "abr" => 64, "vcodec" => "h263"},
|
||||||
@ -414,6 +414,14 @@ def itag_to_metadata(itag : String)
|
|||||||
"308" => {"ext" => "webm", "height" => 1440, "format" => "DASH video", "vcodec" => "vp9", "fps" => 60},
|
"308" => {"ext" => "webm", "height" => 1440, "format" => "DASH video", "vcodec" => "vp9", "fps" => 60},
|
||||||
"313" => {"ext" => "webm", "height" => 2160, "format" => "DASH video", "vcodec" => "vp9"},
|
"313" => {"ext" => "webm", "height" => 2160, "format" => "DASH video", "vcodec" => "vp9"},
|
||||||
"315" => {"ext" => "webm", "height" => 2160, "format" => "DASH video", "vcodec" => "vp9", "fps" => 60},
|
"315" => {"ext" => "webm", "height" => 2160, "format" => "DASH video", "vcodec" => "vp9", "fps" => 60},
|
||||||
|
"330" => {"ext" => "webm", "height" => 144, "format" => "DASH video", "vcodec" => "vp9", "fps" => 60},
|
||||||
|
"331" => {"ext" => "webm", "height" => 240, "format" => "DASH video", "vcodec" => "vp9", "fps" => 60},
|
||||||
|
"332" => {"ext" => "webm", "height" => 360, "format" => "DASH video", "vcodec" => "vp9", "fps" => 60},
|
||||||
|
"333" => {"ext" => "webm", "height" => 480, "format" => "DASH video", "vcodec" => "vp9", "fps" => 60},
|
||||||
|
"334" => {"ext" => "webm", "height" => 720, "format" => "DASH video", "vcodec" => "vp9", "fps" => 60},
|
||||||
|
"335" => {"ext" => "webm", "height" => 1080, "format" => "DASH video", "vcodec" => "vp9", "fps" => 60},
|
||||||
|
"336" => {"ext" => "webm", "height" => 1440, "format" => "DASH video", "vcodec" => "vp9", "fps" => 60},
|
||||||
|
"337" => {"ext" => "webm", "height" => 2160, "format" => "DASH video", "vcodec" => "vp9", "fps" => 60},
|
||||||
|
|
||||||
# Dash webm audio
|
# Dash webm audio
|
||||||
"171" => {"ext" => "webm", "acodec" => "vorbis", "format" => "DASH audio", "abr" => 128},
|
"171" => {"ext" => "webm", "acodec" => "vorbis", "format" => "DASH audio", "abr" => 128},
|
||||||
@ -425,7 +433,7 @@ def itag_to_metadata(itag : String)
|
|||||||
"251" => {"ext" => "webm", "format" => "DASH audio", "acodec" => "opus", "abr" => 160},
|
"251" => {"ext" => "webm", "format" => "DASH audio", "acodec" => "opus", "abr" => 160},
|
||||||
}
|
}
|
||||||
|
|
||||||
return formats[itag]
|
return formats[itag]?
|
||||||
end
|
end
|
||||||
|
|
||||||
def process_video_params(query, preferences)
|
def process_video_params(query, preferences)
|
||||||
|
Loading…
Reference in New Issue
Block a user