Fix iOS DASH playback fallback

This commit is contained in:
Nickita Khylkouski 2026-05-11 01:25:03 -07:00
parent f914ce8040
commit 45f266f336
4 changed files with 38 additions and 0 deletions

View File

@ -53,4 +53,30 @@ Spectator.describe "Helper" do
expect(sign_token("SECRET_KEY", token)).to eq(token["signature"]) expect(sign_token("SECRET_KEY", token)).to eq(token["signature"])
end end
end end
describe "#user_agent_lacks_dash_support?" do
it "detects iPhone Safari" do
user_agent = "Mozilla/5.0 (iPhone; CPU iPhone OS 18_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.5 Mobile/15E148 Safari/604.1"
expect(user_agent_lacks_dash_support?(user_agent)).to be_true
end
it "detects iPod Safari" do
user_agent = "Mozilla/5.0 (iPod touch; CPU iPhone OS 15_8 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.8 Mobile/15E148 Safari/604.1"
expect(user_agent_lacks_dash_support?(user_agent)).to be_true
end
it "does not force the fallback on iPad or desktop Safari" do
ipad_user_agent = "Mozilla/5.0 (iPad; CPU OS 17_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.6 Mobile/15E148 Safari/604.1"
mac_user_agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 14_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.6 Safari/605.1.15"
expect(user_agent_lacks_dash_support?(ipad_user_agent)).to be_false
expect(user_agent_lacks_dash_support?(mac_user_agent)).to be_false
end
it "does not force the fallback without a user agent" do
expect(user_agent_lacks_dash_support?(nil)).to be_false
end
end
end end

View File

@ -202,6 +202,12 @@ def number_to_short_text(number)
text text
end end
def user_agent_lacks_dash_support?(user_agent : String?) : Bool
return false if user_agent.nil?
user_agent.includes?("iPhone") || user_agent.includes?("iPod")
end
def arg_array(array, start = 1) def arg_array(array, start = 1)
if array.size == 0 if array.size == 0
args = "NULL" args = "NULL"

View File

@ -123,6 +123,9 @@ module Invidious::Routes::Embed
end end
params = process_video_params(env.params.query, preferences) params = process_video_params(env.params.query, preferences)
if params.quality == "dash" && user_agent_lacks_dash_support?(env.request.headers["User-Agent"]?)
params.quality = "hd720"
end
user = env.get?("user").try &.as(User) user = env.get?("user").try &.as(User)
if user if user

View File

@ -48,6 +48,9 @@ module Invidious::Routes::Watch
subscriptions ||= [] of String subscriptions ||= [] of String
params = process_video_params(env.params.query, preferences) params = process_video_params(env.params.query, preferences)
if params.quality == "dash" && user_agent_lacks_dash_support?(env.request.headers["User-Agent"]?)
params.quality = "hd720"
end
env.params.query.delete_all("listen") env.params.query.delete_all("listen")
begin begin