Add a function to parse search filters from invidious URL params
This commit is contained in:
parent
c888524523
commit
fb2a331f79
|
@ -175,4 +175,83 @@ Spectator.describe Invidious::Search::Filters do
|
||||||
expect(subs).to be_false
|
expect(subs).to be_false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# -------------------
|
||||||
|
# Decode (URL)
|
||||||
|
# -------------------
|
||||||
|
|
||||||
|
describe "#from_iv_params" do
|
||||||
|
it "Decodes type= filter" do
|
||||||
|
Invidious::Search::Filters::Type.each do |value|
|
||||||
|
params = HTTP::Params.parse("type=#{value}")
|
||||||
|
|
||||||
|
expect(described_class.from_iv_params(params))
|
||||||
|
.to eq(described_class.new(type: value))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it "Decodes date= filter" do
|
||||||
|
Invidious::Search::Filters::Date.each do |value|
|
||||||
|
params = HTTP::Params.parse("date=#{value}")
|
||||||
|
|
||||||
|
expect(described_class.from_iv_params(params))
|
||||||
|
.to eq(described_class.new(date: value))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it "Decodes duration= filter" do
|
||||||
|
Invidious::Search::Filters::Duration.each do |value|
|
||||||
|
params = HTTP::Params.parse("duration=#{value}")
|
||||||
|
|
||||||
|
expect(described_class.from_iv_params(params))
|
||||||
|
.to eq(described_class.new(duration: value))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it "Decodes features= filter (single)" do
|
||||||
|
Invidious::Search::Filters::Features.each do |value|
|
||||||
|
string = described_class.format_features(value)
|
||||||
|
params = HTTP::Params.parse("features=#{string}")
|
||||||
|
|
||||||
|
expect(described_class.from_iv_params(params))
|
||||||
|
.to eq(described_class.new(features: value))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it "Decodes features= filter (multiple - comma separated)" do
|
||||||
|
features = Invidious::Search::Filters::Features.flags(HDR, VR180, CCommons)
|
||||||
|
params = HTTP::Params.parse("features=vr180%2Ccc%2Chdr") # %2C is a comma
|
||||||
|
|
||||||
|
expect(described_class.from_iv_params(params))
|
||||||
|
.to eq(described_class.new(features: features))
|
||||||
|
end
|
||||||
|
|
||||||
|
it "Decodes features= filter (multiple - URL parameters)" do
|
||||||
|
features = Invidious::Search::Filters::Features.flags(ThreeSixty, HD, FourK)
|
||||||
|
params = HTTP::Params.parse("features=4k&features=360&features=hd")
|
||||||
|
|
||||||
|
expect(described_class.from_iv_params(params))
|
||||||
|
.to eq(described_class.new(features: features))
|
||||||
|
end
|
||||||
|
|
||||||
|
it "Decodes sort= filter" do
|
||||||
|
Invidious::Search::Filters::Sort.each do |value|
|
||||||
|
params = HTTP::Params.parse("sort=#{value}")
|
||||||
|
|
||||||
|
expect(described_class.from_iv_params(params))
|
||||||
|
.to eq(described_class.new(sort: value))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it "Ignores junk data" do
|
||||||
|
params = HTTP::Params.parse("foo=bar&sort=views&answer=42&type=channel")
|
||||||
|
|
||||||
|
expect(described_class.from_iv_params(params)).to eq(
|
||||||
|
described_class.new(
|
||||||
|
sort: Invidious::Search::Filters::Sort::Views,
|
||||||
|
type: Invidious::Search::Filters::Type::Channel
|
||||||
|
)
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -192,6 +192,42 @@ module Invidious::Search
|
||||||
return {filters, channel, cleaned_query, subscriptions}
|
return {filters, channel, cleaned_query, subscriptions}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def self.from_iv_params(params : HTTP::Params) : Filters
|
||||||
|
# Temporary variables
|
||||||
|
filters = Filters.new
|
||||||
|
|
||||||
|
if type = params["type"]?
|
||||||
|
filters.type = Type.parse?(type) || Type::All
|
||||||
|
params.delete("type")
|
||||||
|
end
|
||||||
|
|
||||||
|
if date = params["date"]?
|
||||||
|
filters.date = Date.parse?(date) || Date::None
|
||||||
|
params.delete("date")
|
||||||
|
end
|
||||||
|
|
||||||
|
if duration = params["duration"]?
|
||||||
|
filters.duration = Duration.parse?(duration) || Duration::None
|
||||||
|
params.delete("duration")
|
||||||
|
end
|
||||||
|
|
||||||
|
features = params.fetch_all("features")
|
||||||
|
if !features.empty?
|
||||||
|
# Un-array input so it can be treated as a comma-separated list
|
||||||
|
features = features[0].split(',') if features.size == 1
|
||||||
|
|
||||||
|
filters.features = parse_features(features) || Features::None
|
||||||
|
params.delete_all("features")
|
||||||
|
end
|
||||||
|
|
||||||
|
if sort = params["sort"]?
|
||||||
|
filters.sort = Sort.parse?(sort) || Sort::Relevance
|
||||||
|
params.delete("sort")
|
||||||
|
end
|
||||||
|
|
||||||
|
return filters
|
||||||
|
end
|
||||||
|
|
||||||
# -------------------
|
# -------------------
|
||||||
# Youtube params
|
# Youtube params
|
||||||
# -------------------
|
# -------------------
|
||||||
|
|
Loading…
Reference in a new issue