summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorsrc-tinkerer <overfill0600@proton.me>2023-11-01 21:56:25 +0330
committersrc-tinkerer <overfill0600@proton.me>2023-11-01 21:56:25 +0330
commitb0df3774dbb9494007bd5a7de62ae8cf756f3c7c (patch)
tree38aeb653624002c87fb227a3ce57fc71d25b1dc4 /src
parent8087e64dfe8353bd7ee224b1985fcb1d8a47122c (diff)
downloadinvidious-b0df3774dbb9494007bd5a7de62ae8cf756f3c7c.tar.gz
invidious-b0df3774dbb9494007bd5a7de62ae8cf756f3c7c.tar.bz2
invidious-b0df3774dbb9494007bd5a7de62ae8cf756f3c7c.zip
Add sort options to streams
Diffstat (limited to 'src')
-rw-r--r--src/invidious/channels/videos.cr89
-rw-r--r--src/invidious/routes/api/v1/channels.cr3
-rw-r--r--src/invidious/routes/channels.cr7
3 files changed, 86 insertions, 13 deletions
diff --git a/src/invidious/channels/videos.cr b/src/invidious/channels/videos.cr
index beb86e08..87af0caf 100644
--- a/src/invidious/channels/videos.cr
+++ b/src/invidious/channels/videos.cr
@@ -68,6 +68,76 @@ def produce_channel_videos_url(ucid, page = 1, auto_generated = nil, sort_by = "
return "/browse_ajax?continuation=#{continuation}&gl=US&hl=en"
end
+def produce_channel_livestreams_continuation(ucid, page = 1, auto_generated = nil, sort_by = "newest", v2 = false)
+ object_inner_2 = {
+ "2:0:embedded" => {
+ "1:0:varint" => 0_i64,
+ },
+ "5:varint" => 50_i64,
+ "6:varint" => 1_i64,
+ "7:varint" => (page * 30).to_i64,
+ "9:varint" => 1_i64,
+ "10:varint" => 0_i64,
+ }
+
+ object_inner_2_encoded = object_inner_2
+ .try { |i| Protodec::Any.cast_json(i) }
+ .try { |i| Protodec::Any.from_json(i) }
+ .try { |i| Base64.urlsafe_encode(i) }
+ .try { |i| URI.encode_www_form(i) }
+
+ sort_by_numerical =
+ case sort_by
+ when "newest" then 1_i64
+ when "popular" then 2_i64
+ when "oldest" then 4_i64
+ else 1_i64 # Fallback to "newest"
+ end
+
+ object_inner_1 = {
+ "110:embedded" => {
+ "3:embedded" => {
+ "14:embedded" => {
+ "1:embedded" => {
+ "1:string" => object_inner_2_encoded,
+ },
+ "2:embedded" => {
+ "1:string" => "00000000-0000-0000-0000-000000000000",
+ },
+ "3:varint" => sort_by_numerical,
+ },
+ },
+ },
+ }
+
+ object_inner_1_encoded = object_inner_1
+ .try { |i| Protodec::Any.cast_json(i) }
+ .try { |i| Protodec::Any.from_json(i) }
+ .try { |i| Base64.urlsafe_encode(i) }
+ .try { |i| URI.encode_www_form(i) }
+
+ object = {
+ "80226972:embedded" => {
+ "2:string" => ucid,
+ "3:string" => object_inner_1_encoded,
+ "35:string" => "browse-feed#{ucid}videos102",
+ },
+ }
+
+ continuation = object.try { |i| Protodec::Any.cast_json(i) }
+ .try { |i| Protodec::Any.from_json(i) }
+ .try { |i| Base64.urlsafe_encode(i) }
+ .try { |i| URI.encode_www_form(i) }
+
+ return continuation
+end
+
+# Used in bypass_captcha_job.cr
+def produce_channel_livestream_url(ucid, page = 1, auto_generated = nil, sort_by = "newest", v2 = false)
+ continuation = produce_channel_livestreams_continuation(ucid, page, auto_generated, sort_by, v2)
+ return "/browse_ajax?continuation=#{continuation}&gl=US&hl=en"
+end
+
module Invidious::Channel::Tabs
extend self
@@ -144,21 +214,24 @@ module Invidious::Channel::Tabs
# Livestreams
# -------------------
- def get_livestreams(channel : AboutChannel, continuation : String? = nil)
+ def make_initial_livestream_ctoken(ucid, sort_by) : String
+ return produce_channel_livestreams_continuation(ucid, sort_by: sort_by)
+ end
+
+ def get_livestreams(channel : AboutChannel, continuation : String? = nil, sort_by = "newest")
if continuation.nil?
- # EgdzdHJlYW1z8gYECgJ6AA%3D%3D is the protobuf object to load "streams"
- initial_data = YoutubeAPI.browse(channel.ucid, params: "EgdzdHJlYW1z8gYECgJ6AA%3D%3D")
- else
- initial_data = YoutubeAPI.browse(continuation: continuation)
+ continuation ||= make_initial_livestream_ctoken(channel.ucid, sort_by)
end
+ initial_data = YoutubeAPI.browse(continuation: continuation)
+
return extract_items(initial_data, channel.author, channel.ucid)
end
- def get_60_livestreams(channel : AboutChannel, continuation : String? = nil)
+ def get_60_livestreams(channel : AboutChannel, *, continuation : String? = nil, sort_by = "newest")
if continuation.nil?
- # Fetch the first "page" of streams
- items, next_continuation = get_livestreams(channel)
+ # Fetch the first "page" of stream
+ items, next_continuation = get_livestreams(channel, sort_by: sort_by)
else
# Fetch a "page" of streams using the given continuation token
items, next_continuation = get_livestreams(channel, continuation: continuation)
diff --git a/src/invidious/routes/api/v1/channels.cr b/src/invidious/routes/api/v1/channels.cr
index 67018660..f759f6ab 100644
--- a/src/invidious/routes/api/v1/channels.cr
+++ b/src/invidious/routes/api/v1/channels.cr
@@ -207,11 +207,12 @@ module Invidious::Routes::API::V1::Channels
get_channel()
# Retrieve continuation from 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_livestreams(
- channel, continuation: continuation
+ channel, continuation: continuation, sort_by: sort_by
)
rescue ex
return error_json(500, ex)
diff --git a/src/invidious/routes/channels.cr b/src/invidious/routes/channels.cr
index d4d8b1c1..c18644ec 100644
--- a/src/invidious/routes/channels.cr
+++ b/src/invidious/routes/channels.cr
@@ -81,13 +81,12 @@ module Invidious::Routes::Channels
return env.redirect "/channel/#{channel.ucid}"
end
- # TODO: support sort option for livestreams
- sort_by = ""
- sort_options = [] of String
+ sort_by = env.params.query["sort_by"]?.try &.downcase
+ sort_options = {"newest", "oldest", "popular"}
# Fetch items and continuation token
items, next_continuation = Channel::Tabs.get_60_livestreams(
- channel, continuation: continuation
+ channel, continuation: continuation, sort_by: (sort_by || "newest")
)
selected_tab = Frontend::ChannelPage::TabsAvailable::Streams