Add 404 status code on all possible endpoints
This commit is contained in:
parent
c2d91c9544
commit
c201ea53ba
@ -31,7 +31,12 @@ def get_about_info(ucid, locale) : AboutChannel
|
|||||||
end
|
end
|
||||||
|
|
||||||
if initdata.dig?("alerts", 0, "alertRenderer", "type") == "ERROR"
|
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
|
end
|
||||||
|
|
||||||
if browse_endpoint = initdata["onResponseReceivedActions"]?.try &.[0]?.try &.["navigateAction"]?.try &.["endpoint"]?.try &.["browseEndpoint"]?
|
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
|
end
|
||||||
|
|
||||||
if response.status_code != 200
|
if response.status_code != 200
|
||||||
raise InfoException.new("This channel does not exist.")
|
raise NotFoundException.new("This channel does not exist.")
|
||||||
end
|
end
|
||||||
|
|
||||||
ucid = response.body.match(/https:\/\/www.youtube.com\/channel\/(?<ucid>UC[a-zA-Z0-9_-]{22})/).not_nil!["ucid"]
|
ucid = response.body.match(/https:\/\/www.youtube.com\/channel\/(?<ucid>UC[a-zA-Z0-9_-]{22})/).not_nil!["ucid"]
|
||||||
@ -49,8 +49,12 @@ def fetch_channel_community(ucid, continuation, locale, format, thin_mode)
|
|||||||
error_message = (message["text"]["simpleText"]? ||
|
error_message = (message["text"]["simpleText"]? ||
|
||||||
message["text"]["runs"]?.try &.[0]?.try &.["text"]?)
|
message["text"]["runs"]?.try &.[0]?.try &.["text"]?)
|
||||||
.try &.as_s || ""
|
.try &.as_s || ""
|
||||||
|
if error_message == "This channel does not exist."
|
||||||
|
raise NotFoundException.new(error_message)
|
||||||
|
else
|
||||||
raise InfoException.new(error_message)
|
raise InfoException.new(error_message)
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
response = JSON.build do |json|
|
response = JSON.build do |json|
|
||||||
json.object do
|
json.object do
|
||||||
|
@ -95,7 +95,7 @@ def fetch_youtube_comments(id, cursor, format, locale, thin_mode, region, sort_b
|
|||||||
contents = body["contents"]?
|
contents = body["contents"]?
|
||||||
header = body["header"]?
|
header = body["header"]?
|
||||||
else
|
else
|
||||||
raise InfoException.new("Could not fetch comments")
|
raise NotFoundException.new("Comments not found.")
|
||||||
end
|
end
|
||||||
|
|
||||||
if !contents
|
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)
|
thread = result[0].data.as(RedditListing).children[0].data.as(RedditLink)
|
||||||
else
|
else
|
||||||
raise InfoException.new("Could not fetch comments")
|
raise NotFoundException.new("Comments not found.")
|
||||||
end
|
end
|
||||||
|
|
||||||
client.close
|
client.close
|
||||||
|
@ -18,3 +18,7 @@ class BrokenTubeException < Exception
|
|||||||
return "Missing JSON element \"#{@element}\""
|
return "Missing JSON element \"#{@element}\""
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Exception used to hold the bogus UCID during a channel search.
|
||||||
|
class NotFoundException < InfoException
|
||||||
|
end
|
||||||
|
@ -317,7 +317,7 @@ def get_playlist(plid : String)
|
|||||||
if playlist = Invidious::Database::Playlists.select(id: plid)
|
if playlist = Invidious::Database::Playlists.select(id: plid)
|
||||||
return playlist
|
return playlist
|
||||||
else
|
else
|
||||||
raise InfoException.new("Playlist does not exist.")
|
raise NotFoundException.new("Playlist does not exist.")
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
return fetch_playlist(plid)
|
return fetch_playlist(plid)
|
||||||
|
@ -16,6 +16,8 @@ module Invidious::Routes::API::Manifest
|
|||||||
video = get_video(id, region: region)
|
video = get_video(id, region: region)
|
||||||
rescue ex : VideoRedirect
|
rescue ex : VideoRedirect
|
||||||
return env.redirect env.request.resource.gsub(id, ex.video_id)
|
return env.redirect env.request.resource.gsub(id, ex.video_id)
|
||||||
|
rescue ex : NotFoundException
|
||||||
|
haltf env, status_code: 404
|
||||||
rescue ex
|
rescue ex
|
||||||
haltf env, status_code: 403
|
haltf env, status_code: 403
|
||||||
end
|
end
|
||||||
|
@ -237,6 +237,8 @@ module Invidious::Routes::API::V1::Authenticated
|
|||||||
|
|
||||||
begin
|
begin
|
||||||
video = get_video(video_id)
|
video = get_video(video_id)
|
||||||
|
rescue ex : NotFoundException
|
||||||
|
return error_json(404, ex)
|
||||||
rescue ex
|
rescue ex
|
||||||
return error_json(500, ex)
|
return error_json(500, ex)
|
||||||
end
|
end
|
||||||
|
@ -13,6 +13,8 @@ module Invidious::Routes::API::V1::Channels
|
|||||||
rescue ex : ChannelRedirect
|
rescue ex : ChannelRedirect
|
||||||
env.response.headers["Location"] = env.request.resource.gsub(ucid, ex.channel_id)
|
env.response.headers["Location"] = env.request.resource.gsub(ucid, ex.channel_id)
|
||||||
return error_json(302, "Channel is unavailable", {"authorId" => ex.channel_id})
|
return error_json(302, "Channel is unavailable", {"authorId" => ex.channel_id})
|
||||||
|
rescue ex : NotFoundException
|
||||||
|
return error_json(404, ex)
|
||||||
rescue ex
|
rescue ex
|
||||||
return error_json(500, ex)
|
return error_json(500, ex)
|
||||||
end
|
end
|
||||||
@ -170,6 +172,8 @@ module Invidious::Routes::API::V1::Channels
|
|||||||
rescue ex : ChannelRedirect
|
rescue ex : ChannelRedirect
|
||||||
env.response.headers["Location"] = env.request.resource.gsub(ucid, ex.channel_id)
|
env.response.headers["Location"] = env.request.resource.gsub(ucid, ex.channel_id)
|
||||||
return error_json(302, "Channel is unavailable", {"authorId" => ex.channel_id})
|
return error_json(302, "Channel is unavailable", {"authorId" => ex.channel_id})
|
||||||
|
rescue ex : NotFoundException
|
||||||
|
return error_json(404, ex)
|
||||||
rescue ex
|
rescue ex
|
||||||
return error_json(500, ex)
|
return error_json(500, ex)
|
||||||
end
|
end
|
||||||
@ -205,6 +209,8 @@ module Invidious::Routes::API::V1::Channels
|
|||||||
rescue ex : ChannelRedirect
|
rescue ex : ChannelRedirect
|
||||||
env.response.headers["Location"] = env.request.resource.gsub(ucid, ex.channel_id)
|
env.response.headers["Location"] = env.request.resource.gsub(ucid, ex.channel_id)
|
||||||
return error_json(302, "Channel is unavailable", {"authorId" => ex.channel_id})
|
return error_json(302, "Channel is unavailable", {"authorId" => ex.channel_id})
|
||||||
|
rescue ex : NotFoundException
|
||||||
|
return error_json(404, ex)
|
||||||
rescue ex
|
rescue ex
|
||||||
return error_json(500, ex)
|
return error_json(500, ex)
|
||||||
end
|
end
|
||||||
|
@ -12,6 +12,8 @@ module Invidious::Routes::API::V1::Videos
|
|||||||
rescue ex : VideoRedirect
|
rescue ex : VideoRedirect
|
||||||
env.response.headers["Location"] = env.request.resource.gsub(id, ex.video_id)
|
env.response.headers["Location"] = env.request.resource.gsub(id, ex.video_id)
|
||||||
return error_json(302, "Video is unavailable", {"videoId" => ex.video_id})
|
return error_json(302, "Video is unavailable", {"videoId" => ex.video_id})
|
||||||
|
rescue ex : NotFoundException
|
||||||
|
return error_json(404, ex)
|
||||||
rescue ex
|
rescue ex
|
||||||
return error_json(500, ex)
|
return error_json(500, ex)
|
||||||
end
|
end
|
||||||
@ -42,6 +44,8 @@ module Invidious::Routes::API::V1::Videos
|
|||||||
rescue ex : VideoRedirect
|
rescue ex : VideoRedirect
|
||||||
env.response.headers["Location"] = env.request.resource.gsub(id, ex.video_id)
|
env.response.headers["Location"] = env.request.resource.gsub(id, ex.video_id)
|
||||||
return error_json(302, "Video is unavailable", {"videoId" => ex.video_id})
|
return error_json(302, "Video is unavailable", {"videoId" => ex.video_id})
|
||||||
|
rescue ex : NotFoundException
|
||||||
|
haltf env, 404
|
||||||
rescue ex
|
rescue ex
|
||||||
haltf env, 500
|
haltf env, 500
|
||||||
end
|
end
|
||||||
@ -167,6 +171,8 @@ module Invidious::Routes::API::V1::Videos
|
|||||||
rescue ex : VideoRedirect
|
rescue ex : VideoRedirect
|
||||||
env.response.headers["Location"] = env.request.resource.gsub(id, ex.video_id)
|
env.response.headers["Location"] = env.request.resource.gsub(id, ex.video_id)
|
||||||
return error_json(302, "Video is unavailable", {"videoId" => ex.video_id})
|
return error_json(302, "Video is unavailable", {"videoId" => ex.video_id})
|
||||||
|
rescue ex : NotFoundException
|
||||||
|
haltf env, 404
|
||||||
rescue ex
|
rescue ex
|
||||||
haltf env, 500
|
haltf env, 500
|
||||||
end
|
end
|
||||||
@ -324,6 +330,8 @@ module Invidious::Routes::API::V1::Videos
|
|||||||
|
|
||||||
begin
|
begin
|
||||||
comments = fetch_youtube_comments(id, continuation, format, locale, thin_mode, region, sort_by: sort_by)
|
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
|
rescue ex
|
||||||
return error_json(500, ex)
|
return error_json(500, ex)
|
||||||
end
|
end
|
||||||
|
@ -85,6 +85,9 @@ module Invidious::Routes::Channels
|
|||||||
rescue ex : InfoException
|
rescue ex : InfoException
|
||||||
env.response.status_code = 500
|
env.response.status_code = 500
|
||||||
error_message = ex.message
|
error_message = ex.message
|
||||||
|
rescue ex : NotFoundException
|
||||||
|
env.response.status_code = 404
|
||||||
|
error_message = ex.message
|
||||||
rescue ex
|
rescue ex
|
||||||
return error_template(500, ex)
|
return error_template(500, ex)
|
||||||
end
|
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}" : ""}")
|
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"]
|
ucid = resolved_url["endpoint"]["browseEndpoint"]["browseId"]
|
||||||
rescue ex : InfoException | KeyError
|
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
|
end
|
||||||
|
|
||||||
selected_tab = env.request.path.split("/")[-1]
|
selected_tab = env.request.path.split("/")[-1]
|
||||||
@ -141,7 +144,7 @@ module Invidious::Routes::Channels
|
|||||||
|
|
||||||
user = env.params.query["user"]?
|
user = env.params.query["user"]?
|
||||||
if !user
|
if !user
|
||||||
raise InfoException.new("This channel does not exist.")
|
return error_template(404, "This channel does not exist.")
|
||||||
else
|
else
|
||||||
env.redirect "/user/#{user}#{uri_params}"
|
env.redirect "/user/#{user}#{uri_params}"
|
||||||
end
|
end
|
||||||
@ -197,6 +200,8 @@ module Invidious::Routes::Channels
|
|||||||
channel = get_about_info(ucid, locale)
|
channel = get_about_info(ucid, locale)
|
||||||
rescue ex : ChannelRedirect
|
rescue ex : ChannelRedirect
|
||||||
return env.redirect env.request.resource.gsub(ucid, ex.channel_id)
|
return env.redirect env.request.resource.gsub(ucid, ex.channel_id)
|
||||||
|
rescue ex : NotFoundException
|
||||||
|
return error_template(404, ex)
|
||||||
rescue ex
|
rescue ex
|
||||||
return error_template(500, ex)
|
return error_template(500, ex)
|
||||||
end
|
end
|
||||||
|
@ -7,6 +7,8 @@ module Invidious::Routes::Embed
|
|||||||
playlist = get_playlist(plid)
|
playlist = get_playlist(plid)
|
||||||
offset = env.params.query["index"]?.try &.to_i? || 0
|
offset = env.params.query["index"]?.try &.to_i? || 0
|
||||||
videos = get_playlist_videos(playlist, offset: offset)
|
videos = get_playlist_videos(playlist, offset: offset)
|
||||||
|
rescue ex : NotFoundException
|
||||||
|
return error_template(404, ex)
|
||||||
rescue ex
|
rescue ex
|
||||||
return error_template(500, ex)
|
return error_template(500, ex)
|
||||||
end
|
end
|
||||||
@ -60,6 +62,8 @@ module Invidious::Routes::Embed
|
|||||||
playlist = get_playlist(plid)
|
playlist = get_playlist(plid)
|
||||||
offset = env.params.query["index"]?.try &.to_i? || 0
|
offset = env.params.query["index"]?.try &.to_i? || 0
|
||||||
videos = get_playlist_videos(playlist, offset: offset)
|
videos = get_playlist_videos(playlist, offset: offset)
|
||||||
|
rescue ex : NotFoundException
|
||||||
|
return error_template(404, ex)
|
||||||
rescue ex
|
rescue ex
|
||||||
return error_template(500, ex)
|
return error_template(500, ex)
|
||||||
end
|
end
|
||||||
@ -119,6 +123,8 @@ module Invidious::Routes::Embed
|
|||||||
video = get_video(id, region: params.region)
|
video = get_video(id, region: params.region)
|
||||||
rescue ex : VideoRedirect
|
rescue ex : VideoRedirect
|
||||||
return env.redirect env.request.resource.gsub(id, ex.video_id)
|
return env.redirect env.request.resource.gsub(id, ex.video_id)
|
||||||
|
rescue ex : NotFoundException
|
||||||
|
return error_template(404, ex)
|
||||||
rescue ex
|
rescue ex
|
||||||
return error_template(500, ex)
|
return error_template(500, ex)
|
||||||
end
|
end
|
||||||
|
@ -150,6 +150,8 @@ module Invidious::Routes::Feeds
|
|||||||
channel = get_about_info(ucid, locale)
|
channel = get_about_info(ucid, locale)
|
||||||
rescue ex : ChannelRedirect
|
rescue ex : ChannelRedirect
|
||||||
return env.redirect env.request.resource.gsub(ucid, ex.channel_id)
|
return env.redirect env.request.resource.gsub(ucid, ex.channel_id)
|
||||||
|
rescue ex : NotFoundException
|
||||||
|
return error_atom(404, ex)
|
||||||
rescue ex
|
rescue ex
|
||||||
return error_atom(500, ex)
|
return error_atom(500, ex)
|
||||||
end
|
end
|
||||||
|
@ -66,7 +66,13 @@ module Invidious::Routes::Playlists
|
|||||||
user = user.as(User)
|
user = user.as(User)
|
||||||
|
|
||||||
playlist_id = env.params.query["list"]
|
playlist_id = env.params.query["list"]
|
||||||
|
begin
|
||||||
playlist = get_playlist(playlist_id)
|
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)
|
subscribe_playlist(user, playlist)
|
||||||
|
|
||||||
env.redirect "/playlist?list=#{playlist.id}"
|
env.redirect "/playlist?list=#{playlist.id}"
|
||||||
@ -304,6 +310,8 @@ module Invidious::Routes::Playlists
|
|||||||
playlist_id = env.params.query["playlist_id"]
|
playlist_id = env.params.query["playlist_id"]
|
||||||
playlist = get_playlist(playlist_id).as(InvidiousPlaylist)
|
playlist = get_playlist(playlist_id).as(InvidiousPlaylist)
|
||||||
raise "Invalid user" if playlist.author != user.email
|
raise "Invalid user" if playlist.author != user.email
|
||||||
|
rescue ex : NotFoundException
|
||||||
|
return error_json(404, ex)
|
||||||
rescue ex
|
rescue ex
|
||||||
if redirect
|
if redirect
|
||||||
return error_template(400, ex)
|
return error_template(400, ex)
|
||||||
@ -334,6 +342,8 @@ module Invidious::Routes::Playlists
|
|||||||
|
|
||||||
begin
|
begin
|
||||||
video = get_video(video_id)
|
video = get_video(video_id)
|
||||||
|
rescue ex : NotFoundException
|
||||||
|
return error_json(404, ex)
|
||||||
rescue ex
|
rescue ex
|
||||||
if redirect
|
if redirect
|
||||||
return error_template(500, ex)
|
return error_template(500, ex)
|
||||||
@ -394,6 +404,8 @@ module Invidious::Routes::Playlists
|
|||||||
|
|
||||||
begin
|
begin
|
||||||
playlist = get_playlist(plid)
|
playlist = get_playlist(plid)
|
||||||
|
rescue ex : NotFoundException
|
||||||
|
return error_template(404, ex)
|
||||||
rescue ex
|
rescue ex
|
||||||
return error_template(500, ex)
|
return error_template(500, ex)
|
||||||
end
|
end
|
||||||
|
@ -265,7 +265,13 @@ module Invidious::Routes::VideoPlayback
|
|||||||
return error_template(403, "Administrator has disabled this endpoint.")
|
return error_template(403, "Administrator has disabled this endpoint.")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
begin
|
||||||
video = get_video(id, region: region)
|
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 }
|
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
|
url = fmt.try &.["url"]?.try &.as_s
|
||||||
|
@ -63,6 +63,9 @@ module Invidious::Routes::Watch
|
|||||||
video = get_video(id, region: params.region)
|
video = get_video(id, region: params.region)
|
||||||
rescue ex : VideoRedirect
|
rescue ex : VideoRedirect
|
||||||
return env.redirect env.request.resource.gsub(id, ex.video_id)
|
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
|
rescue ex
|
||||||
LOGGER.error("get_video: #{id} : #{ex.message}")
|
LOGGER.error("get_video: #{id} : #{ex.message}")
|
||||||
return error_template(500, ex)
|
return error_template(500, ex)
|
||||||
|
@ -1159,8 +1159,12 @@ def fetch_video(id, region)
|
|||||||
end
|
end
|
||||||
|
|
||||||
if reason = info["reason"]?
|
if reason = info["reason"]?
|
||||||
|
if reason == "Video unavailable"
|
||||||
|
raise NotFoundException.new(reason.as_s || "")
|
||||||
|
else
|
||||||
raise InfoException.new(reason.as_s || "")
|
raise InfoException.new(reason.as_s || "")
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
video = Video.new({
|
video = Video.new({
|
||||||
id: id,
|
id: id,
|
||||||
|
Loading…
Reference in New Issue
Block a user