diff --git a/locales/en-US.json b/locales/en-US.json index e0b2dab4..8c8a4e82 100644 --- a/locales/en-US.json +++ b/locales/en-US.json @@ -115,9 +115,9 @@ "Feed menu: ": "Feed menu: ", "Top enabled: ": "Top enabled: ", "CAPTCHA enabled: ": "CAPTCHA enabled: ", - "Login enabled: ": "Login enabled? ", - "Registration enabled: ": "Registration enabled? ", - "Report statistics: ": "Report statistics? ", + "Login enabled: ": "Login enabled: ", + "Registration enabled: ": "Registration enabled: ", + "Report statistics: ": "Report statistics: ", "Save preferences": "Save preferences", "Subscription manager": "Subscription manager", "Token manager": "Token manager", diff --git a/src/invidious.cr b/src/invidious.cr index 215619af..30688db3 100644 --- a/src/invidious.cr +++ b/src/invidious.cr @@ -293,10 +293,8 @@ before_all do |env| end dark_mode = convert_theme(env.params.query["dark_mode"]?) || preferences.dark_mode.to_s - thin_mode = env.params.query["thin_mode"]? || preferences.thin_mode.to_s thin_mode = thin_mode == "true" - locale = env.params.query["hl"]? || preferences.locale preferences.dark_mode = dark_mode @@ -319,21 +317,21 @@ before_all do |env| end get "/" do |env| - locale = LOCALES[env.get("preferences").as(Preferences).locale]? + preferences = env.get("preferences").as(Preferences) + locale = LOCALES[preferences.locale]? user = env.get? "user" - if user - user = user.as(User) - if user.preferences.redirect_feed - next env.redirect "/feed/subscriptions" - end - end - - case config.default_home + case preferences.default_home + when "" + templated "empty" when "Popular" templated "popular" when "Top" - templated "top" + if config.top_enabled + templated "top" + else + templated "empty" + end when "Trending" env.redirect "/feed/trending" when "Subscriptions" @@ -342,6 +340,12 @@ get "/" do |env| else templated "popular" end + when "Playlists" + if user + env.redirect "/view_all_playlists" + else + templated "popular" + end end end @@ -783,6 +787,10 @@ end # Playlists +get "/feed/playlists" do |env| + env.redirect "/view_all_playlists" +end + get "/view_all_playlists" do |env| locale = LOCALES[env.get("preferences").as(Preferences).locale]? @@ -1952,9 +1960,15 @@ post "/preferences" do |env| related_videos ||= "off" related_videos = related_videos == "on" - redirect_feed = env.params.body["redirect_feed"]?.try &.as(String) - redirect_feed ||= "off" - redirect_feed = redirect_feed == "on" + default_home = env.params.body["default_home"]?.try &.as(String) || CONFIG.default_user_preferences.default_home + + feed_menu = [] of String + 5.times do |index| + option = env.params.body["feed_menu[#{index}]"]?.try &.as(String) || "" + if !option.empty? + feed_menu << option + end + end locale = env.params.body["locale"]?.try &.as(String) locale ||= CONFIG.default_user_preferences.locale @@ -2002,7 +2016,8 @@ post "/preferences" do |env| notifications_only: notifications_only, player_style: player_style, quality: quality, - redirect_feed: redirect_feed, + default_home: default_home, + feed_menu: feed_menu, related_videos: related_videos, sort: sort, speed: speed, @@ -2017,16 +2032,16 @@ post "/preferences" do |env| PG_DB.exec("UPDATE users SET preferences = $1 WHERE email = $2", preferences, user.email) if config.admins.includes? user.email - config.default_home = env.params.body["default_home"]?.try &.as(String) || config.default_home + CONFIG.default_user_preferences.default_home = env.params.body["admin_default_home"]?.try &.as(String) || CONFIG.default_user_preferences.default_home - feed_menu = [] of String - 4.times do |index| - option = env.params.body["feed_menu[#{index}]"]?.try &.as(String) || "" + admin_feed_menu = [] of String + 5.times do |index| + option = env.params.body["admin_feed_menu[#{index}]"]?.try &.as(String) || "" if !option.empty? - feed_menu << option + admin_feed_menu << option end end - config.feed_menu = feed_menu + CONFIG.default_user_preferences.feed_menu = admin_feed_menu top_enabled = env.params.body["top_enabled"]?.try &.as(String) top_enabled ||= "off" diff --git a/src/invidious/helpers/helpers.cr b/src/invidious/helpers/helpers.cr index d227fdf9..d23d5f07 100644 --- a/src/invidious/helpers/helpers.cr +++ b/src/invidious/helpers/helpers.cr @@ -94,9 +94,7 @@ struct ConfigPreferences result end rescue ex - result = value.read_bool - - if result + if value.read_bool "dark" else "light" @@ -110,7 +108,7 @@ struct ConfigPreferences def self.from_yaml(ctx : YAML::ParseContext, node : YAML::Nodes::Node) : String unless node.is_a?(YAML::Nodes::Scalar) - node.raise "Expected sequence, not #{node.class}" + node.raise "Expected scalar, not #{node.class}" end case node.value @@ -134,7 +132,7 @@ struct ConfigPreferences comments: {type: Array(String), default: ["youtube", ""], converter: StringToArray}, continue: {type: Bool, default: false}, continue_autoplay: {type: Bool, default: true}, - dark_mode: {type: String, default: "", converter: BoolToString}, + dark_mode: {type: String, default: "light", converter: BoolToString}, latest_only: {type: Bool, default: false}, listen: {type: Bool, default: false}, local: {type: Bool, default: false}, @@ -143,7 +141,8 @@ struct ConfigPreferences notifications_only: {type: Bool, default: false}, player_style: {type: String, default: "invidious"}, quality: {type: String, default: "hd720"}, - redirect_feed: {type: Bool, default: false}, + default_home: {type: String, default: "Popular"}, + feed_menu: {type: Array(String), default: ["Popular", "Trending", "Subscriptions", "Playlists"]}, related_videos: {type: Bool, default: true}, sort: {type: String, default: "published"}, speed: {type: Float32, default: 1.0_f32}, @@ -215,8 +214,6 @@ struct Config hmac_key: String?, # HMAC signing key for CSRF tokens and verifying pubsub subscriptions domain: String?, # Domain to be used for links to resources on the site where an absolute URL is required use_pubsub_feeds: {type: Bool | Int32, default: false}, # Subscribe to channels using PubSubHubbub (requires domain, hmac_key) - default_home: {type: String, default: "Top"}, - feed_menu: {type: Array(String), default: ["Popular", "Top", "Trending", "Subscriptions"]}, top_enabled: {type: Bool, default: true}, captcha_enabled: {type: Bool, default: true}, login_enabled: {type: Bool, default: true}, diff --git a/src/invidious/users.cr b/src/invidious/users.cr index f2ebb66f..2d45d69d 100644 --- a/src/invidious/users.cr +++ b/src/invidious/users.cr @@ -84,7 +84,8 @@ struct Preferences notifications_only: {type: Bool, default: CONFIG.default_user_preferences.notifications_only}, player_style: {type: String, default: CONFIG.default_user_preferences.player_style, converter: ProcessString}, quality: {type: String, default: CONFIG.default_user_preferences.quality, converter: ProcessString}, - redirect_feed: {type: Bool, default: CONFIG.default_user_preferences.redirect_feed}, + default_home: {type: String, default: CONFIG.default_user_preferences.default_home}, + feed_menu: {type: Array(String), default: CONFIG.default_user_preferences.feed_menu}, related_videos: {type: Bool, default: CONFIG.default_user_preferences.related_videos}, sort: {type: String, default: CONFIG.default_user_preferences.sort, converter: ProcessString}, speed: {type: Float32, default: CONFIG.default_user_preferences.speed}, diff --git a/src/invidious/views/components/feed_menu.ecr b/src/invidious/views/components/feed_menu.ecr index 9867f56f..f72db2da 100644 --- a/src/invidious/views/components/feed_menu.ecr +++ b/src/invidious/views/components/feed_menu.ecr @@ -2,9 +2,9 @@
- <% feed_menu = config.feed_menu.dup %> + <% feed_menu = env.get("preferences").as(Preferences).feed_menu.dup %> <% if !env.get?("user") %> - <% feed_menu.reject! {|feed| feed == "Subscriptions"} %> + <% feed_menu.reject! {|item| {"Subscriptions", "Playlists"}.includes? item} %> <% end %> <% feed_menu.each do |feed| %>
diff --git a/src/invidious/views/empty.ecr b/src/invidious/views/empty.ecr new file mode 100644 index 00000000..c10c097e --- /dev/null +++ b/src/invidious/views/empty.ecr @@ -0,0 +1,8 @@ +<% content_for "header" do %> +"> + + Invidious + +<% end %> + +<%= rendered "components/feed_menu" %> diff --git a/src/invidious/views/popular.ecr b/src/invidious/views/popular.ecr index 88c49582..62abb12a 100644 --- a/src/invidious/views/popular.ecr +++ b/src/invidious/views/popular.ecr @@ -1,7 +1,7 @@ <% content_for "header" do %> "> - <% if config.default_home != "Popular" %> + <% if env.get("preferences").as(Preferences).default_home != "Popular" %> <%= translate(locale, "Popular") %> - Invidious <% else %> Invidious diff --git a/src/invidious/views/preferences.ecr b/src/invidious/views/preferences.ecr index 1183fba8..17e5804e 100644 --- a/src/invidious/views/preferences.ecr +++ b/src/invidious/views/preferences.ecr @@ -135,6 +135,32 @@ function update_value(element) { <input name="thin_mode" id="thin_mode" type="checkbox" <% if preferences.thin_mode %>checked<% end %>> </div> + <% if env.get?("user") %> + <% feed_options = {"", "Popular", "Top", "Trending", "Subscriptions", "Playlists"} %> + <% else %> + <% feed_options = {"", "Popular", "Top", "Trending"} %> + <% end %> + + <div class="pure-control-group"> + <label for="default_home"><%= translate(locale, "Default homepage: ") %></label> + <select name="default_home" id="default_home"> + <% feed_options.each do |option| %> + <option value="<%= option %>" <% if preferences.default_home == option %> selected <% end %>><%= translate(locale, option) %></option> + <% end %> + </select> + </div> + + <div class="pure-control-group"> + <label for="feed_menu"><%= translate(locale, "Feed menu: ") %></label> + <% (feed_options.size - 1).times do |index| %> + <select name="feed_menu[<%= index %>]" id="feed_menu[<%= index %>]"> + <% feed_options.each do |option| %> + <option value="<%= option %>" <% if preferences.feed_menu[index]? == option %> selected <% end %>><%= translate(locale, option) %></option> + <% end %> + </select> + <% end %> + </div> + <% if env.get? "user" %> <legend><%= translate(locale, "Subscription preferences") %></legend> @@ -143,11 +169,6 @@ function update_value(element) { <input name="annotations_subscribed" id="annotations_subscribed" type="checkbox" <% if preferences.annotations_subscribed %>checked<% end %>> </div> - <div class="pure-control-group"> - <label for="redirect_feed"><%= translate(locale, "Redirect homepage to feed: ") %></label> - <input name="redirect_feed" id="redirect_feed" type="checkbox" <% if preferences.redirect_feed %>checked<% end %>> - </div> - <div class="pure-control-group"> <label for="max_results"><%= translate(locale, "Number of videos shown in feed: ") %></label> <input name="max_results" id="max_results" type="number" value="<%= preferences.max_results %>"> @@ -193,20 +214,20 @@ function update_value(element) { <legend><%= translate(locale, "Administrator preferences") %></legend> <div class="pure-control-group"> - <label for="default_home"><%= translate(locale, "Default homepage: ") %></label> - <select name="default_home" id="default_home"> - <% {"Popular", "Top", "Trending", "Subscriptions"}.each do |option| %> - <option value="<%= option %>" <% if config.default_home == option %> selected <% end %>><%= translate(locale, option) %></option> + <label for="admin_default_home"><%= translate(locale, "Default homepage: ") %></label> + <select name="admin_default_home" id="admin_default_home"> + <% feed_options.each do |option| %> + <option value="<%= option %>" <% if CONFIG.default_user_preferences.default_home == option %> selected <% end %>><%= translate(locale, option) %></option> <% end %> </select> </div> <div class="pure-control-group"> - <label for="feed_menu"><%= translate(locale, "Feed menu: ") %></label> - <% 4.times do |index| %> - <select name="feed_menu[<%= index %>]" id="feed_menu[<%= index %>]"> - <% {"", "Popular", "Top", "Trending", "Subscriptions"}.each do |option| %> - <option value="<%= option %>" <% if config.feed_menu[index]? == option %> selected <% end %>><%= translate(locale, option) %></option> + <label for="admin_feed_menu"><%= translate(locale, "Feed menu: ") %></label> + <% (feed_options.size - 1).times do |index| %> + <select name="admin_feed_menu[<%= index %>]" id="admin_feed_menu[<%= index %>]"> + <% feed_options.each do |option| %> + <option value="<%= option %>" <% if CONFIG.default_user_preferences.feed_menu[index]? == option %> selected <% end %>><%= translate(locale, option) %></option> <% end %> </select> <% end %> diff --git a/src/invidious/views/top.ecr b/src/invidious/views/top.ecr index d5fb3de6..f5db3aaa 100644 --- a/src/invidious/views/top.ecr +++ b/src/invidious/views/top.ecr @@ -1,7 +1,7 @@ <% content_for "header" do %> <meta name="description" content="<%= translate(locale, "An alternative front-end to YouTube") %>"> <title> - <% if config.default_home != "Top" %> + <% if env.get("preferences").as(Preferences).default_home != "Top" %> <%= translate(locale, "Top") %> - Invidious <% else %> Invidious diff --git a/src/invidious/views/trending.ecr b/src/invidious/views/trending.ecr index d7784928..42acb15c 100644 --- a/src/invidious/views/trending.ecr +++ b/src/invidious/views/trending.ecr @@ -1,7 +1,7 @@ <% content_for "header" do %> <meta name="description" content="<%= translate(locale, "An alternative front-end to YouTube") %>"> <title> - <% if config.default_home != "Trending" %> + <% if env.get("preferences").as(Preferences).default_home != "Trending" %> <%= translate(locale, "Trending") %> - Invidious <% else %> Invidious diff --git a/src/invidious/views/view_all_playlists.ecr b/src/invidious/views/view_all_playlists.ecr index ef9c85c0..0fa7a325 100644 --- a/src/invidious/views/view_all_playlists.ecr +++ b/src/invidious/views/view_all_playlists.ecr @@ -2,6 +2,8 @@ <title><%= translate(locale, "Playlists") %> - Invidious <% end %> +<%= rendered "components/feed_menu" %> +

<%= translate(locale, "`x` playlists", %(#{items.size})) %>