diff --git a/src/invidious/config.cr b/src/invidious/config.cr index f2415604..a8543a59 100644 --- a/src/invidious/config.cr +++ b/src/invidious/config.cr @@ -164,6 +164,9 @@ class Config # Playlist length limit property playlist_length_limit : Int32 = 500 + # The max resolution the Instance can offer + property max_dash_resolution : Int32? + # Materialious redirects property materialious_domain : String? diff --git a/src/invidious/routes/api/manifest.cr b/src/invidious/routes/api/manifest.cr index d89e752c..8ba735bb 100644 --- a/src/invidious/routes/api/manifest.cr +++ b/src/invidious/routes/api/manifest.cr @@ -55,6 +55,14 @@ module Invidious::Routes::API::Manifest audio_streams = video.audio_streams.sort_by { |stream| {stream["bitrate"].as_i} }.reverse! video_streams = video.video_streams.sort_by { |stream| {stream["width"].as_i, stream["fps"].as_i} }.reverse! + # Removes all the resolutions with a height higher than CONFIG.max_dash_resolution + if CONFIG.max_dash_resolution + video_streams.reject! do |z| + (z["height"].as_i > CONFIG.max_dash_resolution.not_nil!) if z["height"]? + end + end + + manifest = XML.build(indent: " ", encoding: "UTF-8") do |xml| xml.element("MPD", "xmlns": "urn:mpeg:dash:schema:mpd:2011", "profiles": "urn:mpeg:dash:profile:full:2011", minBufferTime: "PT1.5S", type: "static", diff --git a/src/invidious/routes/watch.cr b/src/invidious/routes/watch.cr index aabe8dfc..a5ff1497 100644 --- a/src/invidious/routes/watch.cr +++ b/src/invidious/routes/watch.cr @@ -120,6 +120,13 @@ module Invidious::Routes::Watch fmt_stream = video.fmt_stream adaptive_fmts = video.adaptive_fmts + # Removes all the resolutions with a height higher than CONFIG.max_dash_resolution + if CONFIG.max_dash_resolution + adaptive_fmts.reject! do |z| + (z["height"].as_i > CONFIG.max_dash_resolution.not_nil!) if z["height"]? + end + end + if params.local fmt_stream.each { |fmt| fmt["url"] = JSON::Any.new(URI.parse(fmt["url"].as_s).request_target) } adaptive_fmts.each { |fmt| fmt["url"] = JSON::Any.new(URI.parse(fmt["url"].as_s).request_target) } @@ -128,6 +135,13 @@ module Invidious::Routes::Watch video_streams = video.video_streams audio_streams = video.audio_streams + # Removes all the resolutions with a height higher than CONFIG.max_dash_resolution + if CONFIG.max_dash_resolution + video_streams.reject! do |z| + (z["height"].as_i > CONFIG.max_dash_resolution.not_nil!) if z["height"]? + end + end + # Older videos may not have audio sources available. # We redirect here so they're not unplayable if audio_streams.empty? && !video.live_now