diff --git a/assets/js/watch.js b/assets/js/watch.js index cff84e4d..d2a9ba62 100644 --- a/assets/js/watch.js +++ b/assets/js/watch.js @@ -219,9 +219,7 @@ function get_youtube_comments() { '&hl=' + video_data.preferences.locale + '&thin_mode=' + video_data.preferences.thin_mode; - var onNon200 = function (xhr) { comments.innerHTML = fallback; }; - if (video_data.params.comments[1] === 'youtube') - onNon200 = function (xhr) {}; + var onNon200 = function (xhr) { comments.innerHTML = xhr.response.errorHtml; }; helpers.xhr('GET', url, {retries: 5, entity_name: 'comments'}, { on200: function (response) { diff --git a/src/invidious/helpers/errors.cr b/src/invidious/helpers/errors.cr index 6e5a975d..11c7a598 100644 --- a/src/invidious/helpers/errors.cr +++ b/src/invidious/helpers/errors.cr @@ -90,6 +90,59 @@ def error_template_helper(env : HTTP::Server::Context, status_code : Int32, mess return templated "error" end +# ------------------- +# Mini error templates (for components that had an error) +# ------------------- + +def mini_error_template(env : HTTP::Server::Context, exception : Exception) + String.build do |str| + # Copied from error_template_helper + locale = env.get("preferences").as(Preferences).locale + issue_title = "#{exception.message} (#{exception.class})" + + issue_template = <<-TEXT + Title: `#{HTML.escape(issue_title)}` + Date: `#{Time::Format::ISO_8601_DATE_TIME.format(Time.utc)}` + Route: `#{HTML.escape(env.request.resource)}` + Version: `#{SOFTWARE["version"]} @ #{SOFTWARE["branch"]}` + + TEXT + + issue_template += github_details("Backtrace", exception.inspect_with_backtrace) + + # URLs for the error message below + url_faq = "https://github.com/iv-org/documentation/blob/master/docs/faq.md" + url_search_issues = "https://github.com/iv-org/invidious/issues" + + url_switch = "https://redirect.invidious.io" + env.request.resource + + url_new_issue = "https://github.com/iv-org/invidious/issues/new" + url_new_issue += "?labels=bug&template=bug_report.md&title=" + url_new_issue += URI.encode_www_form("[Bug] " + issue_title) + + str << <<-END_HTML +
+ END_HTML + end +end + # ------------------- # Atom feeds # ------------------- diff --git a/src/invidious/routes/api/v1/videos.cr b/src/invidious/routes/api/v1/videos.cr index af4fc806..1bd07ccf 100644 --- a/src/invidious/routes/api/v1/videos.cr +++ b/src/invidious/routes/api/v1/videos.cr @@ -337,7 +337,7 @@ module Invidious::Routes::API::V1::Videos rescue ex : NotFoundException return error_json(404, ex) rescue ex - return error_json(500, ex) + return error_json(500, ex, {"errorHtml" => mini_error_template(env, ex)}) end return comments diff --git a/src/invidious/routes/watch.cr b/src/invidious/routes/watch.cr index e5cf3716..7862b061 100644 --- a/src/invidious/routes/watch.cr +++ b/src/invidious/routes/watch.cr @@ -103,6 +103,8 @@ module Invidious::Routes::Watch comment_html = Comments.fill_links(comment_html, "https", "www.reddit.com") comment_html = Comments.replace_links(comment_html) + else + comment_html = mini_error_template(env, ex) end end elsif source == "reddit" @@ -115,6 +117,8 @@ module Invidious::Routes::Watch rescue ex if preferences.comments[1] == "youtube" comment_html = JSON.parse(Comments.fetch_youtube(id, nil, "html", locale, preferences.thin_mode, region))["contentHtml"] + else + comment_html = mini_error_template(env, ex) end end end