From 56f8935f75f2e86e878408950276ddaca6d1327f Mon Sep 17 00:00:00 2001 From: criticalconnections <98701702+criticalconnections@users.noreply.github.com> Date: Mon, 11 May 2026 07:48:41 -0400 Subject: [PATCH] Fix empty query separator in playlist RSS links --- spec/invidious/routes/feeds_spec.cr | 26 ++++++++++++++++++++++++++ src/invidious/helpers/utils.cr | 9 +++++++++ src/invidious/routes/feeds.cr | 3 +-- 3 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 spec/invidious/routes/feeds_spec.cr diff --git a/spec/invidious/routes/feeds_spec.cr b/spec/invidious/routes/feeds_spec.cr new file mode 100644 index 000000000..d70c3ab16 --- /dev/null +++ b/spec/invidious/routes/feeds_spec.cr @@ -0,0 +1,26 @@ +require "../../spec_helper" + +Spectator.describe "Feeds" do + describe "#add_video_query_params" do + it "does not append an empty query separator" do + request_target = "/watch?v=7uQOBLCcp3I" + params = HTTP::Params.parse("") + + expect(add_video_query_params(request_target, params)).to eq(request_target) + end + + it "appends non-empty params to watch links" do + request_target = "/watch?v=7uQOBLCcp3I" + params = HTTP::Params.parse("listen=1") + + expect(add_video_query_params(request_target, params)).to eq("#{request_target}&listen=1") + end + + it "leaves non-watch links unchanged" do + request_target = "/vi/7uQOBLCcp3I/hqdefault.jpg" + params = HTTP::Params.parse("listen=1") + + expect(add_video_query_params(request_target, params)).to eq(request_target) + end + end +end diff --git a/src/invidious/helpers/utils.cr b/src/invidious/helpers/utils.cr index 7a262f849..4b38c3e63 100644 --- a/src/invidious/helpers/utils.cr +++ b/src/invidious/helpers/utils.cr @@ -273,6 +273,15 @@ def get_referer(env, fallback = "/", unroll = true) return referer end +def add_video_query_params(request_target : String, params : HTTP::Params) : String + params = params.to_s + + return request_target unless request_target.starts_with?("/watch?v=") + return request_target if params.empty? + + "#{request_target}&#{params}" +end + def sha256(text) digest = OpenSSL::Digest.new("SHA256") digest << text diff --git a/src/invidious/routes/feeds.cr b/src/invidious/routes/feeds.cr index a8247d786..60516ec1e 100644 --- a/src/invidious/routes/feeds.cr +++ b/src/invidious/routes/feeds.cr @@ -320,8 +320,7 @@ module Invidious::Routes::Feeds case attribute.name when "url", "href" request_target = URI.parse(node[attribute.name]).request_target - query_string_opt = request_target.starts_with?("/watch?v=") ? "&#{params}" : "" - node[attribute.name] = "#{HOST_URL}#{request_target}#{query_string_opt}" + node[attribute.name] = "#{HOST_URL}#{add_video_query_params(request_target, params)}" else nil # Skip end end