Skip to content

Commit

Permalink
Channels: Add Courses to channel page and channel API (#5158)
Browse files Browse the repository at this point in the history
Closes #5144
  • Loading branch information
syeopite committed Feb 26, 2025
2 parents c5e9447 + eaf4738 commit 9fbe394
Show file tree
Hide file tree
Showing 7 changed files with 64 additions and 1 deletion.
1 change: 1 addition & 0 deletions locales/en-US.json
Original file line number Diff line number Diff line change
Expand Up @@ -493,6 +493,7 @@
"channel_tab_streams_label": "Livestreams",
"channel_tab_podcasts_label": "Podcasts",
"channel_tab_releases_label": "Releases",
"channel_tab_courses_label": "Courses",
"channel_tab_playlists_label": "Playlists",
"channel_tab_community_label": "Community",
"channel_tab_channels_label": "Channels",
Expand Down
9 changes: 9 additions & 0 deletions src/invidious/channels/playlists.cr
Original file line number Diff line number Diff line change
Expand Up @@ -44,3 +44,12 @@ def fetch_channel_releases(ucid, author, continuation)
end
return extract_items(initial_data, author, ucid)
end

def fetch_channel_courses(ucid, author, continuation)
if continuation
initial_data = YoutubeAPI.browse(continuation)
else
initial_data = YoutubeAPI.browse(ucid, params: "Egdjb3Vyc2Vz8gYFCgPCAQA%3D")
end
return extract_items(initial_data, author, ucid)
end
1 change: 1 addition & 0 deletions src/invidious/frontend/channel_page.cr
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ module Invidious::Frontend::ChannelPage
Streams
Podcasts
Releases
Courses
Playlists
Community
Channels
Expand Down
29 changes: 29 additions & 0 deletions src/invidious/routes/api/v1/channels.cr
Original file line number Diff line number Diff line change
Expand Up @@ -368,6 +368,35 @@ module Invidious::Routes::API::V1::Channels
end
end

def self.courses(env)
locale = env.get("preferences").as(Preferences).locale

env.response.content_type = "application/json"

ucid = env.params.url["ucid"]
continuation = env.params.query["continuation"]?

# Use the macro defined above
channel = nil # Make the compiler happy
get_channel()

items, next_continuation = fetch_channel_courses(channel.ucid, channel.author, continuation)

JSON.build do |json|
json.object do
json.field "playlists" do
json.array do
items.each do |item|
item.to_json(locale, json) if item.is_a?(SearchPlaylist)
end
end
end

json.field "continuation", next_continuation if next_continuation
end
end
end

def self.community(env)
locale = env.get("preferences").as(Preferences).locale

Expand Down
22 changes: 21 additions & 1 deletion src/invidious/routes/channels.cr
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,26 @@ module Invidious::Routes::Channels
templated "channel"
end

def self.courses(env)
data = self.fetch_basic_information(env)
return data if !data.is_a?(Tuple)

locale, user, subscriptions, continuation, ucid, channel = data

sort_by = ""
sort_options = [] of String

items, next_continuation = fetch_channel_courses(
channel.ucid, channel.author, continuation
)

items = items.select(SearchPlaylist)
items.each(&.author = "")

selected_tab = Frontend::ChannelPage::TabsAvailable::Courses
templated "channel"
end

def self.community(env)
data = self.fetch_basic_information(env)
if !data.is_a?(Tuple)
Expand Down Expand Up @@ -307,7 +327,7 @@ module Invidious::Routes::Channels

private KNOWN_TABS = {
"home", "videos", "shorts", "streams", "podcasts",
"releases", "playlists", "community", "channels", "about",
"releases", "courses", "playlists", "community", "channels", "about",
}

# Redirects brand url channels to a normal /channel/:ucid route
Expand Down
2 changes: 2 additions & 0 deletions src/invidious/routing.cr
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,7 @@ module Invidious::Routing
get "/channel/:ucid/streams", Routes::Channels, :streams
get "/channel/:ucid/podcasts", Routes::Channels, :podcasts
get "/channel/:ucid/releases", Routes::Channels, :releases
get "/channel/:ucid/courses", Routes::Channels, :courses
get "/channel/:ucid/playlists", Routes::Channels, :playlists
get "/channel/:ucid/community", Routes::Channels, :community
get "/channel/:ucid/channels", Routes::Channels, :channels
Expand Down Expand Up @@ -250,6 +251,7 @@ module Invidious::Routing
get "/api/v1/channels/:ucid/streams", {{namespace}}::Channels, :streams
get "/api/v1/channels/:ucid/podcasts", {{namespace}}::Channels, :podcasts
get "/api/v1/channels/:ucid/releases", {{namespace}}::Channels, :releases
get "/api/v1/channels/:ucid/courses", {{namespace}}::Channels, :courses
get "/api/v1/channels/:ucid/playlists", {{namespace}}::Channels, :playlists
get "/api/v1/channels/:ucid/community", {{namespace}}::Channels, :community
get "/api/v1/channels/:ucid/channels", {{namespace}}::Channels, :channels
Expand Down
1 change: 1 addition & 0 deletions src/invidious/views/channel.ecr
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
when .channels? then "/channel/#{ucid}/channels"
when .podcasts? then "/channel/#{ucid}/podcasts"
when .releases? then "/channel/#{ucid}/releases"
when .courses? then "/channel/#{ucid}/courses"
else
"/channel/#{ucid}"
end
Expand Down

0 comments on commit 9fbe394

Please sign in to comment.