summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsyeopite <syeopite@syeopite.dev>2021-03-26 21:22:46 -0700
committersyeopite <syeopite@syeopite.dev>2021-06-19 04:16:18 -0700
commit311e7684b280e72d1155a320ef48c75105ab1e5d (patch)
tree2575dbf11fbc787e0c519ded830e9c6df4ed73a2
parent37ff2ac2b9531e53bed05d8b4828614558418062 (diff)
downloadinvidious-311e7684b280e72d1155a320ef48c75105ab1e5d.tar.gz
invidious-311e7684b280e72d1155a320ef48c75105ab1e5d.tar.bz2
invidious-311e7684b280e72d1155a320ef48c75105ab1e5d.zip
Add instance redirect on empty/broken search
-rw-r--r--locales/en-US.json1
-rw-r--r--src/invidious/helpers/utils.cr26
-rw-r--r--src/invidious/routes/misc.cr7
-rw-r--r--src/invidious/views/search.ecr177
4 files changed, 112 insertions, 99 deletions
diff --git a/locales/en-US.json b/locales/en-US.json
index 12663915..1f4cd8d6 100644
--- a/locales/en-US.json
+++ b/locales/en-US.json
@@ -162,6 +162,7 @@
"Show less": "Show less",
"Watch on YouTube": "Watch on YouTube",
"Switch Invidious Instance": "Switch Invidious Instance",
+ "Broken?": "Broken?",
"Hide annotations": "Hide annotations",
"Show annotations": "Show annotations",
"Genre: ": "Genre: ",
diff --git a/src/invidious/helpers/utils.cr b/src/invidious/helpers/utils.cr
index 8c893310..cb94b44a 100644
--- a/src/invidious/helpers/utils.cr
+++ b/src/invidious/helpers/utils.cr
@@ -410,18 +410,18 @@ def convert_theme(theme)
end
end
-def fetch_random_instance()
- instance_list = HTTP::Client.get "https://api.invidious.io/instances.json"
- instance_list = JSON.parse(instance_list.body)
-
- filtered_instance_list = [] of String
- instance_list.as_a.each do |data|
- if data[1]["type"] == "https"
- if data[1]["monitor"]
- health = data[1]["monitor"].as_h["dailyRatios"][0].as_h["ratio"]
- filtered_instance_list << data[0].as_s if health.to_s.to_f > 90
- end
- end
+def fetch_random_instance
+ instance_list = HTTP::Client.get "https://api.invidious.io/instances.json"
+ instance_list = JSON.parse(instance_list.body)
+
+ filtered_instance_list = [] of String
+ instance_list.as_a.each do |data|
+ if data[1]["type"] == "https"
+ if data[1]["monitor"]
+ health = data[1]["monitor"].as_h["dailyRatios"][0].as_h["ratio"]
+ filtered_instance_list << data[0].as_s if health.to_s.to_f > 90
+ end
end
- return filtered_instance_list.sample(1)[0]
+ end
+ return filtered_instance_list.sample(1)[0]
end
diff --git a/src/invidious/routes/misc.cr b/src/invidious/routes/misc.cr
index 857d0596..c14e0e54 100644
--- a/src/invidious/routes/misc.cr
+++ b/src/invidious/routes/misc.cr
@@ -37,8 +37,13 @@ class Invidious::Routes::Misc < Invidious::Routes::BaseRoute
end
def cross_instance_redirect(env)
+ instance_url = fetch_random_instance
+ if env.params.query["id"]?
id = env.params.query["id"]
- instance_url = fetch_random_instance
env.redirect "https://#{instance_url}/watch?v=#{id}"
+ elsif env.params.query["q"]?
+ query, page = env.params.query["q"], env.params.query["page"]
+ env.redirect "https://#{instance_url}/search?q=#{query}&page=#{page}"
+ end
end
end
diff --git a/src/invidious/views/search.ecr b/src/invidious/views/search.ecr
index fefc9fbb..fdb9205c 100644
--- a/src/invidious/views/search.ecr
+++ b/src/invidious/views/search.ecr
@@ -2,92 +2,99 @@
<title><%= search_query.not_nil!.size > 30 ? HTML.escape(query.not_nil![0,30].rstrip(".") + "...") : HTML.escape(query.not_nil!) %> - Invidious</title>
<% end %>
-<details id="filters">
- <summary>
- <h3 style="display:inline"> <%= translate(locale, "filter") %> </h3>
- </summary>
- <div id="filters" class="pure-g h-box">
- <div class="pure-u-1-3 pure-u-md-1-5">
- <b><%= translate(locale, "date") %></b>
- <hr/>
- <% ["hour", "today", "week", "month", "year"].each do |date| %>
- <div class="pure-u-1 pure-md-1-5">
- <% if operator_hash.fetch("date", "all") == date %>
- <b><%= translate(locale, date) %></b>
- <% else %>
- <a href="/search?q=<%= HTML.escape(query.not_nil!.gsub(/ ?date:[a-z]+/, "") + " date:" + date) %>&page=<%= page %>">
- <%= translate(locale, date) %>
- </a>
- <% end %>
- </div>
- <% end %>
+<!-- Search redirection and filtering UI -->
+<% if count == 0 %>
+ <h3 style="text-align: center">
+ <%= translate(locale, "Broken?") %> <a href="/redirect?q=<%= HTML.escape(query.not_nil!) %>&page=<%= page + 1 %>"><%= translate(locale, "Switch Invidious Instance") %></a>
+ </h3>
+<% else %>
+ <details id="filters">
+ <summary>
+ <h3 style="display:inline"> <%= translate(locale, "filter") %> </h3>
+ </summary>
+ <div id="filters" class="pure-g h-box">
+ <div class="pure-u-1-3 pure-u-md-1-5">
+ <b><%= translate(locale, "date") %></b>
+ <hr/>
+ <% ["hour", "today", "week", "month", "year"].each do |date| %>
+ <div class="pure-u-1 pure-md-1-5">
+ <% if operator_hash.fetch("date", "all") == date %>
+ <b><%= translate(locale, date) %></b>
+ <% else %>
+ <a href="/search?q=<%= HTML.escape(query.not_nil!.gsub(/ ?date:[a-z]+/, "") + " date:" + date) %>&page=<%= page %>">
+ <%= translate(locale, date) %>
+ </a>
+ <% end %>
+ </div>
+ <% end %>
+ </div>
+ <div class="pure-u-1-3 pure-u-md-1-5">
+ <b><%= translate(locale, "content_type") %></b>
+ <hr/>
+ <% ["video", "channel", "playlist", "movie", "show"].each do |content_type| %>
+ <div class="pure-u-1 pure-md-1-5">
+ <% if operator_hash.fetch("content_type", "all") == content_type %>
+ <b><%= translate(locale, content_type) %></b>
+ <% else %>
+ <a href="/search?q=<%= HTML.escape(query.not_nil!.gsub(/ ?content_type:[a-z]+/, "") + " content_type:" + content_type) %>&page=<%= page %>">
+ <%= translate(locale, content_type) %>
+ </a>
+ <% end %>
+ </div>
+ <% end %>
+ </div>
+ <div class="pure-u-1-3 pure-u-md-1-5">
+ <b><%= translate(locale, "duration") %></b>
+ <hr/>
+ <% ["short", "long"].each do |duration| %>
+ <div class="pure-u-1 pure-md-1-5">
+ <% if operator_hash.fetch("duration", "all") == duration %>
+ <b><%= translate(locale, duration) %></b>
+ <% else %>
+ <a href="/search?q=<%= HTML.escape(query.not_nil!.gsub(/ ?duration:[a-z]+/, "") + " duration:" + duration) %>&page=<%= page %>">
+ <%= translate(locale, duration) %>
+ </a>
+ <% end %>
+ </div>
+ <% end %>
+ </div>
+ <div class="pure-u-1-3 pure-u-md-1-5">
+ <b><%= translate(locale, "features") %></b>
+ <hr/>
+ <% ["hd", "subtitles", "creative_commons", "3d", "live", "purchased", "4k", "360", "location", "hdr"].each do |feature| %>
+ <div class="pure-u-1 pure-md-1-5">
+ <% if operator_hash.fetch("features", "all").includes?(feature) %>
+ <b><%= translate(locale, feature) %></b>
+ <% elsif operator_hash.has_key?("features") %>
+ <a href="/search?q=<%= HTML.escape(query.not_nil!.gsub(/features:/, "features:" + feature + ",")) %>&page=<%= page %>">
+ <%= translate(locale, feature) %>
+ </a>
+ <% else %>
+ <a href="/search?q=<%= HTML.escape(query.not_nil! + " features:" + feature) %>&page=<%= page %>">
+ <%= translate(locale, feature) %>
+ </a>
+ <% end %>
+ </div>
+ <% end %>
+ </div>
+ <div class="pure-u-1-3 pure-u-md-1-5">
+ <b><%= translate(locale, "sort") %></b>
+ <hr/>
+ <% ["relevance", "rating", "date", "views"].each do |sort| %>
+ <div class="pure-u-1 pure-md-1-5">
+ <% if operator_hash.fetch("sort", "relevance") == sort %>
+ <b><%= translate(locale, sort) %></b>
+ <% else %>
+ <a href="/search?q=<%= HTML.escape(query.not_nil!.gsub(/ ?sort:[a-z]+/, "") + " sort:" + sort) %>&page=<%= page %>">
+ <%= translate(locale, sort) %>
+ </a>
+ <% end %>
+ </div>
+ <% end %>
+ </div>
</div>
- <div class="pure-u-1-3 pure-u-md-1-5">
- <b><%= translate(locale, "content_type") %></b>
- <hr/>
- <% ["video", "channel", "playlist", "movie", "show"].each do |content_type| %>
- <div class="pure-u-1 pure-md-1-5">
- <% if operator_hash.fetch("content_type", "all") == content_type %>
- <b><%= translate(locale, content_type) %></b>
- <% else %>
- <a href="/search?q=<%= HTML.escape(query.not_nil!.gsub(/ ?content_type:[a-z]+/, "") + " content_type:" + content_type) %>&page=<%= page %>">
- <%= translate(locale, content_type) %>
- </a>
- <% end %>
- </div>
- <% end %>
- </div>
- <div class="pure-u-1-3 pure-u-md-1-5">
- <b><%= translate(locale, "duration") %></b>
- <hr/>
- <% ["short", "long"].each do |duration| %>
- <div class="pure-u-1 pure-md-1-5">
- <% if operator_hash.fetch("duration", "all") == duration %>
- <b><%= translate(locale, duration) %></b>
- <% else %>
- <a href="/search?q=<%= HTML.escape(query.not_nil!.gsub(/ ?duration:[a-z]+/, "") + " duration:" + duration) %>&page=<%= page %>">
- <%= translate(locale, duration) %>
- </a>
- <% end %>
- </div>
- <% end %>
- </div>
- <div class="pure-u-1-3 pure-u-md-1-5">
- <b><%= translate(locale, "features") %></b>
- <hr/>
- <% ["hd", "subtitles", "creative_commons", "3d", "live", "purchased", "4k", "360", "location", "hdr"].each do |feature| %>
- <div class="pure-u-1 pure-md-1-5">
- <% if operator_hash.fetch("features", "all").includes?(feature) %>
- <b><%= translate(locale, feature) %></b>
- <% elsif operator_hash.has_key?("features") %>
- <a href="/search?q=<%= HTML.escape(query.not_nil!.gsub(/features:/, "features:" + feature + ",")) %>&page=<%= page %>">
- <%= translate(locale, feature) %>
- </a>
- <% else %>
- <a href="/search?q=<%= HTML.escape(query.not_nil! + " features:" + feature) %>&page=<%= page %>">
- <%= translate(locale, feature) %>
- </a>
- <% end %>
- </div>
- <% end %>
- </div>
- <div class="pure-u-1-3 pure-u-md-1-5">
- <b><%= translate(locale, "sort") %></b>
- <hr/>
- <% ["relevance", "rating", "date", "views"].each do |sort| %>
- <div class="pure-u-1 pure-md-1-5">
- <% if operator_hash.fetch("sort", "relevance") == sort %>
- <b><%= translate(locale, sort) %></b>
- <% else %>
- <a href="/search?q=<%= HTML.escape(query.not_nil!.gsub(/ ?sort:[a-z]+/, "") + " sort:" + sort) %>&page=<%= page %>">
- <%= translate(locale, sort) %>
- </a>
- <% end %>
- </div>
- <% end %>
- </div>
- </div>
-</details>
+ </details>
+<% end %>
<hr/>