summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/invidious.cr9
-rw-r--r--src/invidious/channels.cr16
-rw-r--r--src/invidious/views/channel.ecr33
3 files changed, 48 insertions, 10 deletions
diff --git a/src/invidious.cr b/src/invidious.cr
index 96af04fa..83824869 100644
--- a/src/invidious.cr
+++ b/src/invidious.cr
@@ -1889,6 +1889,9 @@ get "/channel/:ucid" do |env|
page = env.params.query["page"]?.try &.to_i?
page ||= 1
+ sort_by = env.params.query["sort_by"]?.try &.downcase
+ sort_by ||= "newest"
+
begin
author, ucid, auto_generated, sub_count = get_about_info(ucid)
rescue ex
@@ -1904,7 +1907,7 @@ get "/channel/:ucid" do |env|
end
end
- videos, count = get_60_videos(ucid, page, auto_generated)
+ videos, count = get_60_videos(ucid, page, auto_generated, sort_by)
templated "channel"
end
@@ -2432,6 +2435,8 @@ get "/api/v1/channels/:ucid" do |env|
env.response.content_type = "application/json"
ucid = env.params.url["ucid"]
+ sort_by = env.params.query["sort_by"]?.try &.downcase
+ sort_by ||= "newest"
begin
author, ucid, auto_generated = get_about_info(ucid)
@@ -2442,7 +2447,7 @@ get "/api/v1/channels/:ucid" do |env|
page = 1
begin
- videos, count = get_60_videos(ucid, page, auto_generated)
+ videos, count = get_60_videos(ucid, page, auto_generated, sort_by)
rescue ex
error_message = {"error" => ex.message}.to_json
halt env, status_code: 500, response: error_message
diff --git a/src/invidious/channels.cr b/src/invidious/channels.cr
index dcab5e29..f713d97b 100644
--- a/src/invidious/channels.cr
+++ b/src/invidious/channels.cr
@@ -163,7 +163,7 @@ def fetch_channel(ucid, client, db, pull_all_videos = true)
return channel
end
-def produce_channel_videos_url(ucid, page = 1, auto_generated = nil)
+def produce_channel_videos_url(ucid, page = 1, auto_generated = nil, sort_by = "newest")
if auto_generated
seed = Time.unix(1525757349)
@@ -190,6 +190,16 @@ def produce_channel_videos_url(ucid, page = 1, auto_generated = nil)
meta += page.size.to_u8.unsafe_chr
meta += page
+ case sort_by
+ when "newest"
+ # Empty tags can be omitted
+ # meta += "\x18\x00"
+ when "popular"
+ meta += "\x18\x01"
+ when "oldest"
+ meta += "\x18\x02"
+ end
+
meta = Base64.urlsafe_encode(meta)
meta = URI.escape(meta)
@@ -254,14 +264,14 @@ def get_about_info(ucid)
return {author, ucid, auto_generated, sub_count}
end
-def get_60_videos(ucid, page, auto_generated)
+def get_60_videos(ucid, page, auto_generated, sort_by = "newest")
count = 0
videos = [] of SearchVideo
client = make_client(YT_URL)
2.times do |i|
- url = produce_channel_videos_url(ucid, page * 2 + (i - 1), auto_generated: auto_generated)
+ url = produce_channel_videos_url(ucid, page * 2 + (i - 1), auto_generated: auto_generated, sort_by: sort_by)
response = client.get(url)
json = JSON.parse(response.body)
diff --git a/src/invidious/views/channel.ecr b/src/invidious/views/channel.ecr
index b9b75ef5..448f97e5 100644
--- a/src/invidious/views/channel.ecr
+++ b/src/invidious/views/channel.ecr
@@ -40,9 +40,32 @@
<% end %>
</div>
-<p class="h-box">
- <a href="https://www.youtube.com/channel/<%= ucid %>">View channel on YouTube</a>
-</p>
+<div class="pure-g h-box">
+ <div class="pure-u-1-3">
+ <a href="https://www.youtube.com/channel/<%= ucid %>">View channel on YouTube</a>
+ </div>
+ <div class="pure-u-1-3">
+ </div>
+ <div class="pure-u-1-3">
+ <div class="pure-g" style="text-align:right;">
+ <% {"newest", "oldest", "popular"}.each do |sort| %>
+ <div class="pure-u-1-3">
+ <% if sort_by == sort %>
+ <b><%= sort %></b>
+ <% else %>
+ <a href="/channel/<%= ucid %>?page=<%= page %>&sort_by=<%= sort %>">
+ <%= sort %>
+ </a>
+ <% end %>
+ </div>
+ <% end %>
+ </div>
+ </div>
+</div>
+
+<div class="h-box">
+ <hr>
+</div>
<% videos.each_slice(4) do |slice| %>
<div class="pure-g">
@@ -55,13 +78,13 @@
<div class="pure-g h-box">
<div class="pure-u-1 pure-u-md-1-5">
<% if page >= 2 %>
- <a href="/channel/<%= ucid %>?page=<%= page - 1 %>">Previous page</a>
+ <a href="/channel/<%= ucid %>?page=<%= page - 1 %><% if sort_by != "newest" %>&sort_by=<%= sort_by %><% end %>">Previous page</a>
<% end %>
</div>
<div class="pure-u-1 pure-u-md-3-5"></div>
<div style="text-align:right;" class="pure-u-1 pure-u-md-1-5">
<% if count == 60 %>
- <a href="/channel/<%= ucid %>?page=<%= page + 1 %>">Next page</a>
+ <a href="/channel/<%= ucid %>?page=<%= page + 1 %><% if sort_by != "newest" %>&sort_by=<%= sort_by %><% end %>">Next page</a>
<% end %>
</div>
</div>