From b8afb7bec8d5a3faac8462d9070011216048f673 Mon Sep 17 00:00:00 2001 From: Samantaz Fox Date: Sat, 15 Jul 2023 15:44:15 +0200 Subject: [PATCH 1/4] Routes: use 'resolve_url()' in 404 error route --- src/invidious/routes/errors.cr | 56 +++++++++++----------------------- 1 file changed, 18 insertions(+), 38 deletions(-) diff --git a/src/invidious/routes/errors.cr b/src/invidious/routes/errors.cr index 1e9ab44e..2ecb032c 100644 --- a/src/invidious/routes/errors.cr +++ b/src/invidious/routes/errors.cr @@ -5,48 +5,28 @@ module Invidious::Routes::ErrorRoutes return env.redirect "#{env.request.path[15..]}?#{env.params.query}" end - if md = env.request.path.match(/^\/(?([a-zA-Z0-9_-]{11})|(\w+))$/) - item = md["id"] - + if match = env.request.path.match(/^\/(?[a-zA-Z0-9_-]{11})$/) + # NOTE: we assume that a 11 chars long path is a video ID + # to spare a call to 'resolve_url' and improve response time. + id = match["id"] + url = HttpServer::Utils.add_params_to_url("/watch?v=#{id}", env.params.query) + return env.redirect url.to_s + # + elsif match = env.request.path.match(/^\/(?\w+)$/) # Check if item is branding URL e.g. https://youtube.com/gaming - response = YT_POOL.client &.get("/#{item}") + begin + response = YoutubeAPI.resolve_url("https://youtube.com/#{env.request.path}") + endpoint = response["endpoint"] - if response.status_code == 301 - response = YT_POOL.client &.get(URI.parse(response.headers["Location"]).request_target) - end - - if response.body.empty? - env.response.headers["Location"] = "/" - haltf env, status_code: 302 - end - - html = XML.parse_html(response.body) - ucid = html.xpath_node(%q(//link[@rel="canonical"])).try &.["href"].split("/")[-1] - - if ucid - env.response.headers["Location"] = "/channel/#{ucid}" - haltf env, status_code: 302 - end - - params = [] of String - env.params.query.each do |k, v| - params << "#{k}=#{v}" - end - params = params.join("&") - - url = "/watch?v=#{item}" - if !params.empty? - url += "&#{params}" - end - - # Check if item is video ID - if item.match(/^[a-zA-Z0-9_-]{11}$/) && YT_POOL.client &.head("/watch?v=#{item}").status_code != 404 - env.response.headers["Location"] = url - haltf env, status_code: 302 + if ucid = endpoint.dig?("browseEndpoint", "browseId") + url = HttpServer::Utils.add_params_to_url("/channel/#{ucid}", env.params.query) + return env.redirect url.to_s + end + rescue ex end end - env.response.headers["Location"] = "/" - haltf env, status_code: 302 + # TODO: create a proper 404 page + haltf env, status_code: 404 end end From 594f25141c07315f4e4ccab66fff2c1902d3ba9c Mon Sep 17 00:00:00 2001 From: Samantaz Fox Date: Sun, 10 Sep 2023 17:00:10 +0200 Subject: [PATCH 2/4] Add a simple error code page (mostly for handling 404s) --- assets/css/default.css | 22 ++++++++++++++++++++++ src/invidious/routes/errors.cr | 4 ++-- src/invidious/views/error_code.ecr | 11 +++++++++++ 3 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 src/invidious/views/error_code.ecr diff --git a/assets/css/default.css b/assets/css/default.css index a47762ec..7b2960d6 100644 --- a/assets/css/default.css +++ b/assets/css/default.css @@ -326,6 +326,28 @@ input[type="search"]::-webkit-search-cancel-button { } +/* + * Error page + */ + +div.center-hv { + height: 100%; + display: flex; + justify-content: center; + align-items: center; + flex-flow: column; +} + +p#error-code, p#error-message { + position: relative; + padding: 0; + margin: 0; +} + +p#error-code { font-size: 8em; bottom: 3vh; right: 5vw; } +p#error-message { font-size: 2em; bottom: 2vh; left: 3vw; } + + /* * Responsive rules */ diff --git a/src/invidious/routes/errors.cr b/src/invidious/routes/errors.cr index 2ecb032c..f6b94df3 100644 --- a/src/invidious/routes/errors.cr +++ b/src/invidious/routes/errors.cr @@ -26,7 +26,7 @@ module Invidious::Routes::ErrorRoutes end end - # TODO: create a proper 404 page - haltf env, status_code: 404 + env.response.status_code = 404 + templated "error_code" end end diff --git a/src/invidious/views/error_code.ecr b/src/invidious/views/error_code.ecr new file mode 100644 index 00000000..6d5ac048 --- /dev/null +++ b/src/invidious/views/error_code.ecr @@ -0,0 +1,11 @@ +<% message = HTML.escape(env.response.status.description || "Unknown error") %> + + +<% content_for "header" do %> +<%= message %> - Invidious +<% end %> + +
+

<%= env.response.status.code %>

+

<%= message %>

+
From 72d2817c3683c14fb49d7c5603e001db54d2078c Mon Sep 17 00:00:00 2001 From: Samantaz Fox Date: Sun, 17 Sep 2023 14:47:22 +0200 Subject: [PATCH 3/4] HTML: Make template.ecr more resilient to errors --- src/invidious/views/template.ecr | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/invidious/views/template.ecr b/src/invidious/views/template.ecr index 9904b4fc..2263f8e9 100644 --- a/src/invidious/views/template.ecr +++ b/src/invidious/views/template.ecr @@ -1,8 +1,12 @@ -<% - locale = env.get("preferences").as(Preferences).locale - dark_mode = env.get("preferences").as(Preferences).dark_mode -%> +<%- + user = env.get?("user").try &.as(IV::User) + prefs = env.get?("preferences").try &.as(Preferences) + + locale = prefs.try &.locale || "en-US" + dark_mode = prefs.try &.dark_mode || "auto" + show_nick = prefs.try &.show_nick || false +-%> @@ -40,7 +44,7 @@ <% end %>
- <% if env.get? "user" %> + <% if user %> - <% if env.get("preferences").as(Preferences).show_nick %> + <%- if show_nick -%>
- <%= HTML.escape(env.get("user").as(Invidious::User).email) %> + <%= HTML.escape(user.try &.email) %>
- <% end %> + <%- end -%>
" method="post"> "> @@ -158,7 +162,7 @@
- <% if env.get? "user" %> + <% if user %>