forked from midou/invidious
Add search filters
This commit is contained in:
parent
b57176d7ef
commit
2ba0063dc0
@ -429,7 +429,31 @@ get "/search" do |env|
|
|||||||
page = env.params.query["page"]?.try &.to_i?
|
page = env.params.query["page"]?.try &.to_i?
|
||||||
page ||= 1
|
page ||= 1
|
||||||
|
|
||||||
search_params = build_search_params(sort_by: "relevance", content_type: "video")
|
sort = "relevance"
|
||||||
|
date = ""
|
||||||
|
duration = ""
|
||||||
|
features = [] of String
|
||||||
|
|
||||||
|
operators = query.split(" ").select { |a| a.match(/\w+:[\w,]+/) }
|
||||||
|
operators.each do |operator|
|
||||||
|
key, value = operator.split(":")
|
||||||
|
|
||||||
|
case key
|
||||||
|
when "sort"
|
||||||
|
sort = value
|
||||||
|
when "date"
|
||||||
|
date = value
|
||||||
|
when "duration"
|
||||||
|
duration = value
|
||||||
|
when "features"
|
||||||
|
features = value.split(",")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
query = (query.split(" ") - operators).join(" ")
|
||||||
|
|
||||||
|
search_params = build_search_params(sort: sort, date: date, content_type: "video",
|
||||||
|
duration: duration, features: features)
|
||||||
count, videos = search(query, page, search_params).as(Tuple)
|
count, videos = search(query, page, search_params).as(Tuple)
|
||||||
|
|
||||||
templated "search"
|
templated "search"
|
||||||
|
@ -14,9 +14,13 @@ end
|
|||||||
|
|
||||||
def search(query, page = 1, search_params = build_search_params(content_type: "video"))
|
def search(query, page = 1, search_params = build_search_params(content_type: "video"))
|
||||||
client = make_client(YT_URL)
|
client = make_client(YT_URL)
|
||||||
|
if query.empty?
|
||||||
|
return {0, [] of SearchVideo}
|
||||||
|
end
|
||||||
|
|
||||||
html = client.get("/results?q=#{URI.escape(query)}&page=#{page}&sp=#{search_params}&disable_polymer=1").body
|
html = client.get("/results?q=#{URI.escape(query)}&page=#{page}&sp=#{search_params}&disable_polymer=1").body
|
||||||
if html.empty?
|
if html.empty?
|
||||||
return [] of SearchVideo
|
return {0, [] of SearchVideo}
|
||||||
end
|
end
|
||||||
|
|
||||||
html = XML.parse_html(html)
|
html = XML.parse_html(html)
|
||||||
@ -26,9 +30,10 @@ def search(query, page = 1, search_params = build_search_params(content_type: "v
|
|||||||
return {nodeset.size, videos}
|
return {nodeset.size, videos}
|
||||||
end
|
end
|
||||||
|
|
||||||
def build_search_params(sort_by = "relevance", date : String = "", content_type : String = "", duration : String = "", features : Array(String) = [] of String)
|
def build_search_params(sort : String = "relevance", date : String = "", content_type : String = "",
|
||||||
|
duration : String = "", features : Array(String) = [] of String)
|
||||||
head = "\x08"
|
head = "\x08"
|
||||||
head += case sort_by
|
head += case sort
|
||||||
when "relevance"
|
when "relevance"
|
||||||
"\x00"
|
"\x00"
|
||||||
when "rating"
|
when "rating"
|
||||||
@ -38,7 +43,7 @@ def build_search_params(sort_by = "relevance", date : String = "", content_type
|
|||||||
when "view_count"
|
when "view_count"
|
||||||
"\x03"
|
"\x03"
|
||||||
else
|
else
|
||||||
raise "No sort #{sort_by}"
|
raise "No sort #{sort}"
|
||||||
end
|
end
|
||||||
|
|
||||||
body = ""
|
body = ""
|
||||||
|
Loading…
Reference in New Issue
Block a user