diff --git a/src/invidious/database/channels.cr b/src/invidious/database/channels.cr index df44e485..21c1ee64 100644 --- a/src/invidious/database/channels.cr +++ b/src/invidious/database/channels.cr @@ -85,6 +85,25 @@ module Invidious::Database::Channels return PG_DB.query_all(request, ids, as: InvidiousChannel) end + + # Select channels sorted by last published video + def select_sorted(ids : Array(String)) : Array(InvidiousChannel)? + return [] of InvidiousChannel if ids.empty? + + request = <<-SQL + WITH max_published AS ( + SELECT ucid, MAX(published) AS last_published + FROM channel_videos + GROUP BY ucid + ) + SELECT channels.id, channels.author, channels.subscribed, channels.updated, channels.deleted FROM channels + LEFT JOIN max_published ON channels.id = max_published.ucid + WHERE channels.id = ANY($1) + ORDER BY max_published.last_published DESC NULLS LAST; + SQL + + return PG_DB.query_all(request, ids, as: InvidiousChannel) + end end # diff --git a/src/invidious/routes/api/v1/authenticated.cr b/src/invidious/routes/api/v1/authenticated.cr index a35d2f2b..9dc31240 100644 --- a/src/invidious/routes/api/v1/authenticated.cr +++ b/src/invidious/routes/api/v1/authenticated.cr @@ -153,7 +153,12 @@ module Invidious::Routes::API::V1::Authenticated env.response.content_type = "application/json" user = env.get("user").as(User) - subscriptions = Invidious::Database::Channels.select(user.subscriptions) + sort = env.params.query["sort"]?.try &.== "last" + if sort + subscriptions = Invidious::Database::Channels.select_sorted(user.subscriptions) + else + subscriptions = Invidious::Database::Channels.select(user.subscriptions) + end JSON.build do |json| json.array do