|
|
@ -1,11 +1,7 @@
|
|
|
|
module Invidious::Routes::API::V1::Channels
|
|
|
|
module Invidious::Routes::API::V1::Channels
|
|
|
|
def self.home(env)
|
|
|
|
# Macro to avoid duplicating some code below
|
|
|
|
locale = env.get("preferences").as(Preferences).locale
|
|
|
|
# This sets the `channel` variable, or handles Exceptions.
|
|
|
|
|
|
|
|
private macro get_channel
|
|
|
|
env.response.content_type = "application/json"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ucid = env.params.url["ucid"]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
begin
|
|
|
|
begin
|
|
|
|
channel = get_about_info(ucid, locale)
|
|
|
|
channel = get_about_info(ucid, locale)
|
|
|
|
rescue ex : ChannelRedirect
|
|
|
|
rescue ex : ChannelRedirect
|
|
|
@ -16,6 +12,17 @@ module Invidious::Routes::API::V1::Channels
|
|
|
|
rescue ex
|
|
|
|
rescue ex
|
|
|
|
return error_json(500, ex)
|
|
|
|
return error_json(500, ex)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def self.home(env)
|
|
|
|
|
|
|
|
locale = env.get("preferences").as(Preferences).locale
|
|
|
|
|
|
|
|
ucid = env.params.url["ucid"]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
env.response.content_type = "application/json"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Use the private macro defined above.
|
|
|
|
|
|
|
|
channel = nil # Make the compiler happy
|
|
|
|
|
|
|
|
get_channel()
|
|
|
|
|
|
|
|
|
|
|
|
# Retrieve "sort by" setting from URL parameters
|
|
|
|
# Retrieve "sort by" setting from URL parameters
|
|
|
|
sort_by = env.params.query["sort_by"]?.try &.downcase || "newest"
|
|
|
|
sort_by = env.params.query["sort_by"]?.try &.downcase || "newest"
|
|
|
@ -138,29 +145,89 @@ module Invidious::Routes::API::V1::Channels
|
|
|
|
|
|
|
|
|
|
|
|
def self.videos(env)
|
|
|
|
def self.videos(env)
|
|
|
|
locale = env.get("preferences").as(Preferences).locale
|
|
|
|
locale = env.get("preferences").as(Preferences).locale
|
|
|
|
|
|
|
|
ucid = env.params.url["ucid"]
|
|
|
|
|
|
|
|
|
|
|
|
env.response.content_type = "application/json"
|
|
|
|
env.response.content_type = "application/json"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Use the private macro defined above.
|
|
|
|
|
|
|
|
channel = nil # Make the compiler happy
|
|
|
|
|
|
|
|
get_channel()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Retrieve some URL parameters
|
|
|
|
|
|
|
|
sort_by = env.params.query["sort_by"]?.try &.downcase || "newest"
|
|
|
|
|
|
|
|
continuation = env.params.query["continuation"]?
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
begin
|
|
|
|
|
|
|
|
videos, next_continuation = Channel::Tabs.get_60_videos(
|
|
|
|
|
|
|
|
channel, continuation: continuation, sort_by: sort_by
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
rescue ex
|
|
|
|
|
|
|
|
return error_json(500, ex)
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return JSON.build do |json|
|
|
|
|
|
|
|
|
json.object do
|
|
|
|
|
|
|
|
json.field "videos" do
|
|
|
|
|
|
|
|
json.array do
|
|
|
|
|
|
|
|
videos.each &.to_json(locale, json)
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
json.field "continuation", next_continuation if next_continuation
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def self.shorts(env)
|
|
|
|
|
|
|
|
locale = env.get("preferences").as(Preferences).locale
|
|
|
|
ucid = env.params.url["ucid"]
|
|
|
|
ucid = env.params.url["ucid"]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
env.response.content_type = "application/json"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Use the private macro defined above.
|
|
|
|
|
|
|
|
channel = nil # Make the compiler happy
|
|
|
|
|
|
|
|
get_channel()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Retrieve continuation from URL parameters
|
|
|
|
|
|
|
|
continuation = env.params.query["continuation"]?
|
|
|
|
|
|
|
|
|
|
|
|
begin
|
|
|
|
begin
|
|
|
|
channel = get_about_info(ucid, locale)
|
|
|
|
videos, next_continuation = Channel::Tabs.get_shorts(
|
|
|
|
rescue ex : ChannelRedirect
|
|
|
|
channel, continuation: continuation
|
|
|
|
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
|
|
|
|
rescue ex
|
|
|
|
return error_json(500, ex)
|
|
|
|
return error_json(500, ex)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
# Retrieve some URL parameters
|
|
|
|
return JSON.build do |json|
|
|
|
|
sort_by = env.params.query["sort_by"]?.try &.downcase || "newest"
|
|
|
|
json.object do
|
|
|
|
|
|
|
|
json.field "videos" do
|
|
|
|
|
|
|
|
json.array do
|
|
|
|
|
|
|
|
videos.each &.to_json(locale, json)
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
json.field "continuation", next_continuation if next_continuation
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def self.streams(env)
|
|
|
|
|
|
|
|
locale = env.get("preferences").as(Preferences).locale
|
|
|
|
|
|
|
|
ucid = env.params.url["ucid"]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
env.response.content_type = "application/json"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Use the private macro defined above.
|
|
|
|
|
|
|
|
channel = nil # Make the compiler happy
|
|
|
|
|
|
|
|
get_channel()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Retrieve continuation from URL parameters
|
|
|
|
continuation = env.params.query["continuation"]?
|
|
|
|
continuation = env.params.query["continuation"]?
|
|
|
|
|
|
|
|
|
|
|
|
begin
|
|
|
|
begin
|
|
|
|
videos, next_continuation = Channel::Tabs.get_60_videos(
|
|
|
|
videos, next_continuation = Channel::Tabs.get_60_livestreams(
|
|
|
|
channel, continuation: continuation, sort_by: sort_by
|
|
|
|
channel, continuation: continuation
|
|
|
|
)
|
|
|
|
)
|
|
|
|
rescue ex
|
|
|
|
rescue ex
|
|
|
|
return error_json(500, ex)
|
|
|
|
return error_json(500, ex)
|
|
|
@ -190,16 +257,9 @@ module Invidious::Routes::API::V1::Channels
|
|
|
|
env.params.query["sort_by"]?.try &.downcase ||
|
|
|
|
env.params.query["sort_by"]?.try &.downcase ||
|
|
|
|
"last"
|
|
|
|
"last"
|
|
|
|
|
|
|
|
|
|
|
|
begin
|
|
|
|
# Use the macro defined above
|
|
|
|
channel = get_about_info(ucid, locale)
|
|
|
|
channel = nil # Make the compiler happy
|
|
|
|
rescue ex : ChannelRedirect
|
|
|
|
get_channel()
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
items, continuation = fetch_channel_playlists(channel.ucid, channel.author, continuation, sort_by)
|
|
|
|
items, continuation = fetch_channel_playlists(channel.ucid, channel.author, continuation, sort_by)
|
|
|
|
|
|
|
|
|
|
|
|