2021-10-03 05:04:02 +09:00
{% skip_file if flag? ( :api_only ) %}
2021-08-11 19:36:25 +09:00
module Invidious::Routes::Search
def self . opensearch ( env )
2021-11-09 07:52:55 +09:00
locale = env . get ( " preferences " ) . as ( Preferences ) . locale
2020-12-02 09:02:39 +09:00
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
2021-08-11 19:36:25 +09:00
def self . results ( env )
2021-11-09 07:52:55 +09:00
locale = env . get ( " preferences " ) . as ( Preferences ) . locale
2020-12-02 09:02:39 +09:00
query = env . params . query [ " search_query " ]?
query || = env . params . query [ " q " ]?
2021-06-14 04:40:11 +09:00
page = env . params . query [ " page " ]?
2020-12-02 09:02:39 +09:00
2021-06-14 04:40:11 +09:00
if query && ! query . empty?
if page && ! page . empty?
env . redirect " /search?q= " + URI . encode_www_form ( query ) + " &page= " + page
else
env . redirect " /search?q= " + URI . encode_www_form ( query )
end
2020-12-02 09:02:39 +09:00
else
2021-06-14 04:40:11 +09:00
env . redirect " /search "
2020-12-02 09:02:39 +09:00
end
end
2021-08-11 19:36:25 +09:00
def self . search ( env )
2022-03-27 04:15:02 +09:00
prefs = env . get ( " preferences " ) . as ( Preferences )
locale = prefs . locale
2020-12-02 09:02:39 +09:00
2022-03-27 04:15:02 +09:00
region = env . params . query [ " region " ]? || prefs . region
query = Invidious :: Search :: Query . new ( env . params . query , :regular , region )
2020-12-02 09:02:39 +09:00
2022-03-27 04:15:02 +09:00
if query . empty?
2021-06-14 04:40:11 +09:00
# Display the full page search box implemented in #1977
env . set " search " , " "
templated " search_homepage " , navbar_search : false
2021-06-15 00:10:02 +09:00
else
user = env . get? " user "
2020-12-02 09:02:39 +09:00
2021-06-15 00:10:02 +09:00
begin
2022-03-27 04:15:02 +09:00
videos = query . process
2022-01-19 09:56:26 +09:00
rescue ex : ChannelSearchException
2022-01-26 02:35:19 +09:00
return error_template ( 404 , " Unable to find channel with id of ' #{ HTML . escape ( ex . channel ) } '. Are you sure that's an actual channel id? It should look like 'UC4QobU6STFB0P71PMvOGN5A'. " )
2021-06-15 00:10:02 +09:00
rescue ex
return error_template ( 500 , ex )
end
2020-12-02 09:02:39 +09:00
2022-03-27 04:15:02 +09:00
env . set " search " , query . text
2021-06-15 00:10:02 +09:00
templated " search "
2021-01-03 09:35:31 +09:00
end
2020-12-02 09:02:39 +09:00
end
2022-05-27 01:31:02 +09:00
def self . hashtag ( env : HTTP :: Server :: Context )
locale = env . get ( " preferences " ) . as ( Preferences ) . locale
hashtag = env . params . url [ " hashtag " ]?
if hashtag . nil? || hashtag . empty?
return error_template ( 400 , " Invalid request " )
end
page = env . params . query [ " page " ]?
if page . nil?
page = 1
else
page = Math . max ( 1 , page . to_i )
env . params . query . delete_all ( " page " )
end
begin
videos = Invidious :: Hashtag . fetch ( hashtag , page )
rescue ex
return error_template ( 500 , ex )
end
params = env . params . query . empty? ? " " : " & #{ env . params . query } "
hashtag_encoded = URI . encode_www_form ( hashtag , space_to_plus : false )
url_prev_page = " /hashtag/ #{ hashtag_encoded } ?page= #{ page - 1 } #{ params } "
url_next_page = " /hashtag/ #{ hashtag_encoded } ?page= #{ page + 1 } #{ params } "
templated " hashtag "
end
2020-12-02 09:02:39 +09:00
end