diff --git a/config/config.example.yml b/config/config.example.yml index a3a2eeb76..0388b5915 100644 --- a/config/config.example.yml +++ b/config/config.example.yml @@ -250,12 +250,13 @@ http_proxy: # ----------------------------- ## -## Enable/Disable the "Popular" tab on the main page. +## Enable/Disable specific pages on the main page. ## -## Accepted values: true, false -## Default: true +#pages_enabled: +# trending: true +# popular: true +# search: true ## -#popular_enabled: true ## ## Enable/Disable statstics (available at /api/v1/stats). diff --git a/locales/en-US.json b/locales/en-US.json index c23f6bc33..d0e38d35f 100644 --- a/locales/en-US.json +++ b/locales/en-US.json @@ -498,5 +498,7 @@ "toggle_theme": "Toggle Theme", "carousel_slide": "Slide {{current}} of {{total}}", "carousel_skip": "Skip the Carousel", - "carousel_go_to": "Go to slide `x`" + "carousel_go_to": "Go to slide `x`", + "preferences_trending_enabled_label": "Trending enabled: ", + "preferences_search_enabled_label": "Search enabled: " } diff --git a/src/invidious.cr b/src/invidious.cr index b422dcbbf..b0ae71c79 100644 --- a/src/invidious.cr +++ b/src/invidious.cr @@ -188,7 +188,7 @@ if (CONFIG.use_pubsub_feeds.is_a?(Bool) && CONFIG.use_pubsub_feeds.as(Bool)) || Invidious::Jobs.register Invidious::Jobs::SubscribeToFeedsJob.new(PG_DB, HMAC_KEY) end -if CONFIG.popular_enabled +if CONFIG.page_enabled?("popular") Invidious::Jobs.register Invidious::Jobs::PullPopularVideosJob.new(PG_DB) end diff --git a/src/invidious/config.cr b/src/invidious/config.cr index c4ca622f9..78535493d 100644 --- a/src/invidious/config.cr +++ b/src/invidious/config.cr @@ -100,7 +100,7 @@ class Config property domain : String? # Subscribe to channels using PubSubHubbub (requires domain, hmac_key) property use_pubsub_feeds : Bool | Int32 = false - property popular_enabled : Bool = true + property pages_enabled : Hash(String, Bool) = {"trending" => true, "popular" => true, "search" => true} property captcha_enabled : Bool = true property login_enabled : Bool = true property registration_enabled : Bool = true @@ -173,6 +173,10 @@ class Config end end + def page_enabled?(page : String) : Bool + @pages_enabled[page]? || false + end + def self.load # Load config from file or YAML string env var env_config_file = "INVIDIOUS_CONFIG_FILE" diff --git a/src/invidious/routes/api/v1/feeds.cr b/src/invidious/routes/api/v1/feeds.cr index fea2993c6..bfec4fb6f 100644 --- a/src/invidious/routes/api/v1/feeds.cr +++ b/src/invidious/routes/api/v1/feeds.cr @@ -4,6 +4,11 @@ module Invidious::Routes::API::V1::Feeds env.response.content_type = "application/json" + if !CONFIG.page_enabled?("trending") + error_message = {"error" => "Administrator has disabled this endpoint."}.to_json + haltf env, 403, error_message + end + region = env.params.query["region"]? trending_type = env.params.query["type"]? @@ -29,7 +34,7 @@ module Invidious::Routes::API::V1::Feeds env.response.content_type = "application/json" - if !CONFIG.popular_enabled + if !CONFIG.page_enabled?("popular") error_message = {"error" => "Administrator has disabled this endpoint."}.to_json haltf env, 403, error_message end diff --git a/src/invidious/routes/api/v1/search.cr b/src/invidious/routes/api/v1/search.cr index 59a30745e..3d978c17b 100644 --- a/src/invidious/routes/api/v1/search.cr +++ b/src/invidious/routes/api/v1/search.cr @@ -5,6 +5,11 @@ module Invidious::Routes::API::V1::Search env.response.content_type = "application/json" + if !CONFIG.page_enabled?("search") + error_message = {"error" => "Administrator has disabled this endpoint."}.to_json + haltf env, 403, error_message + end + query = Invidious::Search::Query.new(env.params.query, :regular, region) begin diff --git a/src/invidious/routes/feeds.cr b/src/invidious/routes/feeds.cr index ea7fb3965..0cc3c11cc 100644 --- a/src/invidious/routes/feeds.cr +++ b/src/invidious/routes/feeds.cr @@ -34,7 +34,7 @@ module Invidious::Routes::Feeds def self.popular(env) locale = env.get("preferences").as(Preferences).locale - if CONFIG.popular_enabled + if CONFIG.page_enabled?("popular") templated "feeds/popular" else message = translate(locale, "The Popular feed has been disabled by the administrator.") @@ -45,19 +45,24 @@ module Invidious::Routes::Feeds def self.trending(env) locale = env.get("preferences").as(Preferences).locale - trending_type = env.params.query["type"]? - trending_type ||= "Default" + if CONFIG.page_enabled?("trending") + trending_type = env.params.query["type"]? + trending_type ||= "Default" - region = env.params.query["region"]? - region ||= env.get("preferences").as(Preferences).region + region = env.params.query["region"]? + region ||= env.get("preferences").as(Preferences).region - begin - trending, plid = fetch_trending(trending_type, region, locale) - rescue ex - return error_template(500, ex) - end + begin + trending, plid = fetch_trending(trending_type, region, locale) + rescue ex + return error_template(500, ex) + end - templated "feeds/trending" + templated "feeds/trending" + else + message = translate(locale, "The Trending feed has been disabled by the administrator.") + templated "message" + end end def self.subscriptions(env) diff --git a/src/invidious/routes/preferences.cr b/src/invidious/routes/preferences.cr index 39ca77c06..34cea3878 100644 --- a/src/invidious/routes/preferences.cr +++ b/src/invidious/routes/preferences.cr @@ -199,9 +199,12 @@ module Invidious::Routes::PreferencesRoute end CONFIG.default_user_preferences.feed_menu = admin_feed_menu - popular_enabled = env.params.body["popular_enabled"]?.try &.as(String) - popular_enabled ||= "off" - CONFIG.popular_enabled = popular_enabled == "on" + pages_enabled = { + "popular" => (env.params.body["popular_enabled"]?.try &.as(String) || "off") == "on", + "trending" => (env.params.body["trending_enabled"]?.try &.as(String) || "off") == "on", + "search" => (env.params.body["search_enabled"]?.try &.as(String) || "off") == "on", + } + CONFIG.pages_enabled = pages_enabled captcha_enabled = env.params.body["captcha_enabled"]?.try &.as(String) captcha_enabled ||= "off" diff --git a/src/invidious/routes/search.cr b/src/invidious/routes/search.cr index 449709228..8c500e02a 100644 --- a/src/invidious/routes/search.cr +++ b/src/invidious/routes/search.cr @@ -40,47 +40,46 @@ module Invidious::Routes::Search prefs = env.get("preferences").as(Preferences) locale = prefs.locale - region = env.params.query["region"]? || prefs.region + if CONFIG.page_enabled?("search") + region = env.params.query["region"]? || prefs.region - query = Invidious::Search::Query.new(env.params.query, :regular, region) + query = Invidious::Search::Query.new(env.params.query, :regular, region) - if query.empty? - # Display the full page search box implemented in #1977 - env.set "search", "" - templated "search_homepage", navbar_search: false - else - user = env.get? "user" - - # An URL was copy/pasted in the search box. - # Redirect the user to the appropriate page. - if query.url? - return env.redirect UrlSanitizer.process(query.text).to_s - end - - begin - items = query.process - rescue ex : ChannelSearchException - 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'.") - rescue ex - return error_template(500, ex) - end - - redirect_url = Invidious::Frontend::Misc.redirect_url(env) - - # Pagination - page_nav_html = Frontend::Pagination.nav_numeric(locale, - base_url: "/search?#{query.to_http_params}", - current_page: query.page, - show_next: (items.size >= 20) - ) - - if query.type == Invidious::Search::Query::Type::Channel - env.set "search", "channel:#{query.channel} #{query.text}" + if query.empty? + # Display the full page search box implemented in #1977 + env.set "search", "" + templated "search_homepage", navbar_search: false else - env.set "search", query.text + user = env.get? "user" + + begin + items = query.process + rescue ex : ChannelSearchException + 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'.") + rescue ex + return error_template(500, ex) + end + + redirect_url = Invidious::Frontend::Misc.redirect_url(env) + + # Pagination + page_nav_html = Frontend::Pagination.nav_numeric(locale, + base_url: "/search?#{query.to_http_params}", + current_page: query.page, + show_next: (items.size >= 20) + ) + + if query.type == Invidious::Search::Query::Type::Channel + env.set "search", "channel:#{query.channel} #{query.text}" + else + env.set "search", query.text + end + + templated "search" end - - templated "search" + else + message = translate(locale, "Search has been disabled by the administrator.") + templated "message" end end diff --git a/src/invidious/views/user/preferences.ecr b/src/invidious/views/user/preferences.ecr index cf8b55936..cb9d2abdd 100644 --- a/src/invidious/views/user/preferences.ecr +++ b/src/invidious/views/user/preferences.ecr @@ -289,9 +289,18 @@