summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/invidious.cr65
-rw-r--r--src/invidious/channels.cr4
-rw-r--r--src/invidious/routes/search.cr59
3 files changed, 66 insertions, 62 deletions
diff --git a/src/invidious.cr b/src/invidious.cr
index 4793a60a..767a8748 100644
--- a/src/invidious.cr
+++ b/src/invidious.cr
@@ -311,68 +311,9 @@ Invidious::Routing.get "/add_playlist_items", Invidious::Routes::Playlists, :add
Invidious::Routing.post "/playlist_ajax", Invidious::Routes::Playlists, :playlist_ajax
Invidious::Routing.get "/playlist", Invidious::Routes::Playlists, :show
Invidious::Routing.get "/mix", Invidious::Routes::Playlists, :mix
-
-# Search
-
-get "/opensearch.xml" do |env|
- locale = LOCALES[env.get("preferences").as(Preferences).locale]?
- env.response.content_type = "application/opensearchdescription+xml"
-
- XML.build(indent: " ", encoding: "UTF-8") do |xml|
- xml.element("OpenSearchDescription", xmlns: "http://a9.com/-/spec/opensearch/1.1/") do
- xml.element("ShortName") { xml.text "Invidious" }
- xml.element("LongName") { xml.text "Invidious Search" }
- xml.element("Description") { xml.text "Search for videos, channels, and playlists on Invidious" }
- xml.element("InputEncoding") { xml.text "UTF-8" }
- xml.element("Image", width: 48, height: 48, type: "image/x-icon") { xml.text "#{HOST_URL}/favicon.ico" }
- xml.element("Url", type: "text/html", method: "get", template: "#{HOST_URL}/search?q={searchTerms}")
- end
- end
-end
-
-get "/results" do |env|
- locale = LOCALES[env.get("preferences").as(Preferences).locale]?
-
- query = env.params.query["search_query"]?
- query ||= env.params.query["q"]?
- query ||= ""
-
- page = env.params.query["page"]?.try &.to_i?
- page ||= 1
-
- if query
- env.redirect "/search?q=#{URI.encode_www_form(query)}&page=#{page}"
- else
- env.redirect "/"
- end
-end
-
-get "/search" do |env|
- locale = LOCALES[env.get("preferences").as(Preferences).locale]?
- region = env.params.query["region"]?
-
- query = env.params.query["search_query"]?
- query ||= env.params.query["q"]?
- query ||= ""
-
- if query.empty?
- next env.redirect "/"
- end
-
- page = env.params.query["page"]?.try &.to_i?
- page ||= 1
-
- user = env.get? "user"
-
- begin
- search_query, count, videos = process_search_query(query, page, user, region: nil)
- rescue ex
- next error_template(500, ex)
- end
-
- env.set "search", query
- templated "search"
-end
+Invidious::Routing.get "/opensearch.xml", Invidious::Routes::Search, :opensearch
+Invidious::Routing.get "/results", Invidious::Routes::Search, :results
+Invidious::Routing.get "/search", Invidious::Routes::Search, :search
# Users
diff --git a/src/invidious/channels.cr b/src/invidious/channels.cr
index 93507c56..444a6eda 100644
--- a/src/invidious/channels.cr
+++ b/src/invidious/channels.cr
@@ -801,6 +801,10 @@ def get_about_info(ucid, locale)
raise InfoException.new(error_message)
end
+ if browse_endpoint = initdata["onResponseReceivedActions"]?.try &.[0]?.try &.["navigateAction"]?.try &.["endpoint"]?.try &.["browseEndpoint"]?
+ raise ChannelRedirect.new(channel_id: browse_endpoint["browseId"].to_s)
+ end
+
author = initdata["metadata"]["channelMetadataRenderer"]["title"].as_s
author_url = initdata["metadata"]["channelMetadataRenderer"]["channelUrl"].as_s
author_thumbnail = initdata["metadata"]["channelMetadataRenderer"]["avatar"]["thumbnails"][0]["url"].as_s
diff --git a/src/invidious/routes/search.cr b/src/invidious/routes/search.cr
new file mode 100644
index 00000000..48446161
--- /dev/null
+++ b/src/invidious/routes/search.cr
@@ -0,0 +1,59 @@
+class Invidious::Routes::Search < Invidious::Routes::BaseRoute
+ def opensearch(env)
+ locale = LOCALES[env.get("preferences").as(Preferences).locale]?
+ env.response.content_type = "application/opensearchdescription+xml"
+
+ XML.build(indent: " ", encoding: "UTF-8") do |xml|
+ xml.element("OpenSearchDescription", xmlns: "http://a9.com/-/spec/opensearch/1.1/") do
+ xml.element("ShortName") { xml.text "Invidious" }
+ xml.element("LongName") { xml.text "Invidious Search" }
+ xml.element("Description") { xml.text "Search for videos, channels, and playlists on Invidious" }
+ xml.element("InputEncoding") { xml.text "UTF-8" }
+ xml.element("Image", width: 48, height: 48, type: "image/x-icon") { xml.text "#{HOST_URL}/favicon.ico" }
+ xml.element("Url", type: "text/html", method: "get", template: "#{HOST_URL}/search?q={searchTerms}")
+ end
+ end
+ end
+
+ def results(env)
+ locale = LOCALES[env.get("preferences").as(Preferences).locale]?
+
+ query = env.params.query["search_query"]?
+ query ||= env.params.query["q"]?
+ query ||= ""
+
+ page = env.params.query["page"]?.try &.to_i?
+ page ||= 1
+
+ if query
+ env.redirect "/search?q=#{URI.encode_www_form(query)}&page=#{page}"
+ else
+ env.redirect "/"
+ end
+ end
+
+ def search(env)
+ locale = LOCALES[env.get("preferences").as(Preferences).locale]?
+ region = env.params.query["region"]?
+
+ query = env.params.query["search_query"]?
+ query ||= env.params.query["q"]?
+ query ||= ""
+
+ return env.redirect "/" if query.empty?
+
+ page = env.params.query["page"]?.try &.to_i?
+ page ||= 1
+
+ user = env.get? "user"
+
+ begin
+ search_query, count, videos = process_search_query(query, page, user, region: nil)
+ rescue ex
+ return error_template(500, ex)
+ end
+
+ env.set "search", query
+ templated "search"
+ end
+end