mirror of
				https://github.com/iv-org/invidious.git
				synced 2025-10-31 12:42:09 +00:00 
			
		
		
		
	Merge pull request #3124 from iv-org/add-404-status-code
This commit is contained in:
		| @@ -31,7 +31,12 @@ def get_about_info(ucid, locale) : AboutChannel | ||||
|   end | ||||
|  | ||||
|   if initdata.dig?("alerts", 0, "alertRenderer", "type") == "ERROR" | ||||
|     raise InfoException.new(initdata["alerts"][0]["alertRenderer"]["text"]["simpleText"].as_s) | ||||
|     error_message = initdata["alerts"][0]["alertRenderer"]["text"]["simpleText"].as_s | ||||
|     if error_message == "This channel does not exist." | ||||
|       raise NotFoundException.new(error_message) | ||||
|     else | ||||
|       raise InfoException.new(error_message) | ||||
|     end | ||||
|   end | ||||
|  | ||||
|   if browse_endpoint = initdata["onResponseReceivedActions"]?.try &.[0]?.try &.["navigateAction"]?.try &.["endpoint"]?.try &.["browseEndpoint"]? | ||||
|   | ||||
| @@ -6,7 +6,7 @@ def fetch_channel_community(ucid, continuation, locale, format, thin_mode) | ||||
|   end | ||||
|  | ||||
|   if response.status_code != 200 | ||||
|     raise InfoException.new("This channel does not exist.") | ||||
|     raise NotFoundException.new("This channel does not exist.") | ||||
|   end | ||||
|  | ||||
|   ucid = response.body.match(/https:\/\/www.youtube.com\/channel\/(?<ucid>UC[a-zA-Z0-9_-]{22})/).not_nil!["ucid"] | ||||
| @@ -47,7 +47,11 @@ def fetch_channel_community(ucid, continuation, locale, format, thin_mode) | ||||
|     error_message = (message["text"]["simpleText"]? || | ||||
|                      message["text"]["runs"]?.try &.[0]?.try &.["text"]?) | ||||
|       .try &.as_s || "" | ||||
|     raise InfoException.new(error_message) | ||||
|     if error_message == "This channel does not exist." | ||||
|       raise NotFoundException.new(error_message) | ||||
|     else | ||||
|       raise InfoException.new(error_message) | ||||
|     end | ||||
|   end | ||||
|  | ||||
|   response = JSON.build do |json| | ||||
|   | ||||
| @@ -95,7 +95,7 @@ def fetch_youtube_comments(id, cursor, format, locale, thin_mode, region, sort_b | ||||
|     contents = body["contents"]? | ||||
|     header = body["header"]? | ||||
|   else | ||||
|     raise InfoException.new("Could not fetch comments") | ||||
|     raise NotFoundException.new("Comments not found.") | ||||
|   end | ||||
|  | ||||
|   if !contents | ||||
| @@ -290,7 +290,7 @@ def fetch_reddit_comments(id, sort_by = "confidence") | ||||
|  | ||||
|     thread = result[0].data.as(RedditListing).children[0].data.as(RedditLink) | ||||
|   else | ||||
|     raise InfoException.new("Could not fetch comments") | ||||
|     raise NotFoundException.new("Comments not found.") | ||||
|   end | ||||
|  | ||||
|   client.close | ||||
|   | ||||
| @@ -18,3 +18,7 @@ class BrokenTubeException < Exception | ||||
|     return "Missing JSON element \"#{@element}\"" | ||||
|   end | ||||
| end | ||||
|  | ||||
| # Exception threw when an element is not found. | ||||
| class NotFoundException < InfoException | ||||
| end | ||||
|   | ||||
| @@ -317,7 +317,7 @@ def get_playlist(plid : String) | ||||
|     if playlist = Invidious::Database::Playlists.select(id: plid) | ||||
|       return playlist | ||||
|     else | ||||
|       raise InfoException.new("Playlist does not exist.") | ||||
|       raise NotFoundException.new("Playlist does not exist.") | ||||
|     end | ||||
|   else | ||||
|     return fetch_playlist(plid) | ||||
|   | ||||
| @@ -16,6 +16,8 @@ module Invidious::Routes::API::Manifest | ||||
|       video = get_video(id, region: region) | ||||
|     rescue ex : VideoRedirect | ||||
|       return env.redirect env.request.resource.gsub(id, ex.video_id) | ||||
|     rescue ex : NotFoundException | ||||
|       haltf env, status_code: 404 | ||||
|     rescue ex | ||||
|       haltf env, status_code: 403 | ||||
|     end | ||||
|   | ||||
| @@ -237,6 +237,8 @@ module Invidious::Routes::API::V1::Authenticated | ||||
|  | ||||
|     begin | ||||
|       video = get_video(video_id) | ||||
|     rescue ex : NotFoundException | ||||
|       return error_json(404, ex) | ||||
|     rescue ex | ||||
|       return error_json(500, ex) | ||||
|     end | ||||
|   | ||||
| @@ -13,6 +13,8 @@ module Invidious::Routes::API::V1::Channels | ||||
|     rescue ex : ChannelRedirect | ||||
|       env.response.headers["Location"] = env.request.resource.gsub(ucid, ex.channel_id) | ||||
|       return error_json(302, "Channel is unavailable", {"authorId" => ex.channel_id}) | ||||
|     rescue ex : NotFoundException | ||||
|       return error_json(404, ex) | ||||
|     rescue ex | ||||
|       return error_json(500, ex) | ||||
|     end | ||||
| @@ -170,6 +172,8 @@ module Invidious::Routes::API::V1::Channels | ||||
|     rescue ex : ChannelRedirect | ||||
|       env.response.headers["Location"] = env.request.resource.gsub(ucid, ex.channel_id) | ||||
|       return error_json(302, "Channel is unavailable", {"authorId" => ex.channel_id}) | ||||
|     rescue ex : NotFoundException | ||||
|       return error_json(404, ex) | ||||
|     rescue ex | ||||
|       return error_json(500, ex) | ||||
|     end | ||||
| @@ -205,6 +209,8 @@ module Invidious::Routes::API::V1::Channels | ||||
|     rescue ex : ChannelRedirect | ||||
|       env.response.headers["Location"] = env.request.resource.gsub(ucid, ex.channel_id) | ||||
|       return error_json(302, "Channel is unavailable", {"authorId" => ex.channel_id}) | ||||
|     rescue ex : NotFoundException | ||||
|       return error_json(404, ex) | ||||
|     rescue ex | ||||
|       return error_json(500, ex) | ||||
|     end | ||||
|   | ||||
| @@ -12,6 +12,8 @@ module Invidious::Routes::API::V1::Videos | ||||
|     rescue ex : VideoRedirect | ||||
|       env.response.headers["Location"] = env.request.resource.gsub(id, ex.video_id) | ||||
|       return error_json(302, "Video is unavailable", {"videoId" => ex.video_id}) | ||||
|     rescue ex : NotFoundException | ||||
|       return error_json(404, ex) | ||||
|     rescue ex | ||||
|       return error_json(500, ex) | ||||
|     end | ||||
| @@ -42,6 +44,8 @@ module Invidious::Routes::API::V1::Videos | ||||
|     rescue ex : VideoRedirect | ||||
|       env.response.headers["Location"] = env.request.resource.gsub(id, ex.video_id) | ||||
|       return error_json(302, "Video is unavailable", {"videoId" => ex.video_id}) | ||||
|     rescue ex : NotFoundException | ||||
|       haltf env, 404 | ||||
|     rescue ex | ||||
|       haltf env, 500 | ||||
|     end | ||||
| @@ -167,6 +171,8 @@ module Invidious::Routes::API::V1::Videos | ||||
|     rescue ex : VideoRedirect | ||||
|       env.response.headers["Location"] = env.request.resource.gsub(id, ex.video_id) | ||||
|       return error_json(302, "Video is unavailable", {"videoId" => ex.video_id}) | ||||
|     rescue ex : NotFoundException | ||||
|       haltf env, 404 | ||||
|     rescue ex | ||||
|       haltf env, 500 | ||||
|     end | ||||
| @@ -324,6 +330,8 @@ module Invidious::Routes::API::V1::Videos | ||||
|  | ||||
|       begin | ||||
|         comments = fetch_youtube_comments(id, continuation, format, locale, thin_mode, region, sort_by: sort_by) | ||||
|       rescue ex : NotFoundException | ||||
|         return error_json(404, ex) | ||||
|       rescue ex | ||||
|         return error_json(500, ex) | ||||
|       end | ||||
|   | ||||
| @@ -85,6 +85,9 @@ module Invidious::Routes::Channels | ||||
|     rescue ex : InfoException | ||||
|       env.response.status_code = 500 | ||||
|       error_message = ex.message | ||||
|     rescue ex : NotFoundException | ||||
|       env.response.status_code = 404 | ||||
|       error_message = ex.message | ||||
|     rescue ex | ||||
|       return error_template(500, ex) | ||||
|     end | ||||
| @@ -118,7 +121,7 @@ module Invidious::Routes::Channels | ||||
|       resolved_url = YoutubeAPI.resolve_url("https://youtube.com#{env.request.path}#{yt_url_params.size > 0 ? "?#{yt_url_params}" : ""}") | ||||
|       ucid = resolved_url["endpoint"]["browseEndpoint"]["browseId"] | ||||
|     rescue ex : InfoException | KeyError | ||||
|       raise InfoException.new(translate(locale, "This channel does not exist.")) | ||||
|       return error_template(404, translate(locale, "This channel does not exist.")) | ||||
|     end | ||||
|  | ||||
|     selected_tab = env.request.path.split("/")[-1] | ||||
| @@ -141,7 +144,7 @@ module Invidious::Routes::Channels | ||||
|  | ||||
|     user = env.params.query["user"]? | ||||
|     if !user | ||||
|       raise InfoException.new("This channel does not exist.") | ||||
|       return error_template(404, "This channel does not exist.") | ||||
|     else | ||||
|       env.redirect "/user/#{user}#{uri_params}" | ||||
|     end | ||||
| @@ -197,6 +200,8 @@ module Invidious::Routes::Channels | ||||
|       channel = get_about_info(ucid, locale) | ||||
|     rescue ex : ChannelRedirect | ||||
|       return env.redirect env.request.resource.gsub(ucid, ex.channel_id) | ||||
|     rescue ex : NotFoundException | ||||
|       return error_template(404, ex) | ||||
|     rescue ex | ||||
|       return error_template(500, ex) | ||||
|     end | ||||
|   | ||||
| @@ -7,6 +7,8 @@ module Invidious::Routes::Embed | ||||
|         playlist = get_playlist(plid) | ||||
|         offset = env.params.query["index"]?.try &.to_i? || 0 | ||||
|         videos = get_playlist_videos(playlist, offset: offset) | ||||
|       rescue ex : NotFoundException | ||||
|         return error_template(404, ex) | ||||
|       rescue ex | ||||
|         return error_template(500, ex) | ||||
|       end | ||||
| @@ -60,6 +62,8 @@ module Invidious::Routes::Embed | ||||
|           playlist = get_playlist(plid) | ||||
|           offset = env.params.query["index"]?.try &.to_i? || 0 | ||||
|           videos = get_playlist_videos(playlist, offset: offset) | ||||
|         rescue ex : NotFoundException | ||||
|           return error_template(404, ex) | ||||
|         rescue ex | ||||
|           return error_template(500, ex) | ||||
|         end | ||||
| @@ -119,6 +123,8 @@ module Invidious::Routes::Embed | ||||
|       video = get_video(id, region: params.region) | ||||
|     rescue ex : VideoRedirect | ||||
|       return env.redirect env.request.resource.gsub(id, ex.video_id) | ||||
|     rescue ex : NotFoundException | ||||
|       return error_template(404, ex) | ||||
|     rescue ex | ||||
|       return error_template(500, ex) | ||||
|     end | ||||
|   | ||||
| @@ -150,6 +150,8 @@ module Invidious::Routes::Feeds | ||||
|       channel = get_about_info(ucid, locale) | ||||
|     rescue ex : ChannelRedirect | ||||
|       return env.redirect env.request.resource.gsub(ucid, ex.channel_id) | ||||
|     rescue ex : NotFoundException | ||||
|       return error_atom(404, ex) | ||||
|     rescue ex | ||||
|       return error_atom(500, ex) | ||||
|     end | ||||
|   | ||||
| @@ -66,7 +66,13 @@ module Invidious::Routes::Playlists | ||||
|     user = user.as(User) | ||||
|  | ||||
|     playlist_id = env.params.query["list"] | ||||
|     playlist = get_playlist(playlist_id) | ||||
|     begin | ||||
|       playlist = get_playlist(playlist_id) | ||||
|     rescue ex : NotFoundException | ||||
|       return error_template(404, ex) | ||||
|     rescue ex | ||||
|       return error_template(500, ex) | ||||
|     end | ||||
|     subscribe_playlist(user, playlist) | ||||
|  | ||||
|     env.redirect "/playlist?list=#{playlist.id}" | ||||
| @@ -304,6 +310,8 @@ module Invidious::Routes::Playlists | ||||
|       playlist_id = env.params.query["playlist_id"] | ||||
|       playlist = get_playlist(playlist_id).as(InvidiousPlaylist) | ||||
|       raise "Invalid user" if playlist.author != user.email | ||||
|     rescue ex : NotFoundException | ||||
|       return error_json(404, ex) | ||||
|     rescue ex | ||||
|       if redirect | ||||
|         return error_template(400, ex) | ||||
| @@ -334,6 +342,8 @@ module Invidious::Routes::Playlists | ||||
|  | ||||
|       begin | ||||
|         video = get_video(video_id) | ||||
|       rescue ex : NotFoundException | ||||
|         return error_json(404, ex) | ||||
|       rescue ex | ||||
|         if redirect | ||||
|           return error_template(500, ex) | ||||
| @@ -394,6 +404,8 @@ module Invidious::Routes::Playlists | ||||
|  | ||||
|     begin | ||||
|       playlist = get_playlist(plid) | ||||
|     rescue ex : NotFoundException | ||||
|       return error_template(404, ex) | ||||
|     rescue ex | ||||
|       return error_template(500, ex) | ||||
|     end | ||||
|   | ||||
| @@ -265,7 +265,13 @@ module Invidious::Routes::VideoPlayback | ||||
|       return error_template(403, "Administrator has disabled this endpoint.") | ||||
|     end | ||||
|  | ||||
|     video = get_video(id, region: region) | ||||
|     begin | ||||
|       video = get_video(id, region: region) | ||||
|     rescue ex : NotFoundException | ||||
|       return error_template(404, ex) | ||||
|     rescue ex | ||||
|       return error_template(500, ex) | ||||
|     end | ||||
|  | ||||
|     fmt = video.fmt_stream.find(nil) { |f| f["itag"].as_i == itag } || video.adaptive_fmts.find(nil) { |f| f["itag"].as_i == itag } | ||||
|     url = fmt.try &.["url"]?.try &.as_s | ||||
|   | ||||
| @@ -63,6 +63,9 @@ module Invidious::Routes::Watch | ||||
|       video = get_video(id, region: params.region) | ||||
|     rescue ex : VideoRedirect | ||||
|       return env.redirect env.request.resource.gsub(id, ex.video_id) | ||||
|     rescue ex : NotFoundException | ||||
|       LOGGER.error("get_video not found: #{id} : #{ex.message}") | ||||
|       return error_template(404, ex) | ||||
|     rescue ex | ||||
|       LOGGER.error("get_video: #{id} : #{ex.message}") | ||||
|       return error_template(500, ex) | ||||
|   | ||||
| @@ -1158,7 +1158,11 @@ def fetch_video(id, region) | ||||
|   end | ||||
|  | ||||
|   if reason = info["reason"]? | ||||
|     raise InfoException.new(reason.as_s || "") | ||||
|     if reason == "Video unavailable" | ||||
|       raise NotFoundException.new(reason.as_s || "") | ||||
|     else | ||||
|       raise InfoException.new(reason.as_s || "") | ||||
|     end | ||||
|   end | ||||
|  | ||||
|   video = Video.new({ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Samantaz Fox
					Samantaz Fox