mirror of
https://github.com/iv-org/invidious.git
synced 2024-10-01 01:25:56 -04:00
Add sort options to streams
This commit is contained in:
parent
8087e64dfe
commit
b0df3774db
@ -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"
|
return "/browse_ajax?continuation=#{continuation}&gl=US&hl=en"
|
||||||
end
|
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
|
module Invidious::Channel::Tabs
|
||||||
extend self
|
extend self
|
||||||
|
|
||||||
@ -144,21 +214,24 @@ module Invidious::Channel::Tabs
|
|||||||
# Livestreams
|
# Livestreams
|
||||||
# -------------------
|
# -------------------
|
||||||
|
|
||||||
def get_livestreams(channel : AboutChannel, continuation : String? = nil)
|
def make_initial_livestream_ctoken(ucid, sort_by) : String
|
||||||
if continuation.nil?
|
return produce_channel_livestreams_continuation(ucid, sort_by: sort_by)
|
||||||
# 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)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def get_livestreams(channel : AboutChannel, continuation : String? = nil, sort_by = "newest")
|
||||||
|
if continuation.nil?
|
||||||
|
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)
|
return extract_items(initial_data, channel.author, channel.ucid)
|
||||||
end
|
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?
|
if continuation.nil?
|
||||||
# Fetch the first "page" of streams
|
# Fetch the first "page" of stream
|
||||||
items, next_continuation = get_livestreams(channel)
|
items, next_continuation = get_livestreams(channel, sort_by: sort_by)
|
||||||
else
|
else
|
||||||
# Fetch a "page" of streams using the given continuation token
|
# Fetch a "page" of streams using the given continuation token
|
||||||
items, next_continuation = get_livestreams(channel, continuation: continuation)
|
items, next_continuation = get_livestreams(channel, continuation: continuation)
|
||||||
|
@ -207,11 +207,12 @@ module Invidious::Routes::API::V1::Channels
|
|||||||
get_channel()
|
get_channel()
|
||||||
|
|
||||||
# Retrieve continuation from URL parameters
|
# Retrieve continuation from URL parameters
|
||||||
|
sort_by = env.params.query["sort_by"]?.try &.downcase || "newest"
|
||||||
continuation = env.params.query["continuation"]?
|
continuation = env.params.query["continuation"]?
|
||||||
|
|
||||||
begin
|
begin
|
||||||
videos, next_continuation = Channel::Tabs.get_60_livestreams(
|
videos, next_continuation = Channel::Tabs.get_60_livestreams(
|
||||||
channel, continuation: continuation
|
channel, continuation: continuation, sort_by: sort_by
|
||||||
)
|
)
|
||||||
rescue ex
|
rescue ex
|
||||||
return error_json(500, ex)
|
return error_json(500, ex)
|
||||||
|
@ -81,13 +81,12 @@ module Invidious::Routes::Channels
|
|||||||
return env.redirect "/channel/#{channel.ucid}"
|
return env.redirect "/channel/#{channel.ucid}"
|
||||||
end
|
end
|
||||||
|
|
||||||
# TODO: support sort option for livestreams
|
sort_by = env.params.query["sort_by"]?.try &.downcase
|
||||||
sort_by = ""
|
sort_options = {"newest", "oldest", "popular"}
|
||||||
sort_options = [] of String
|
|
||||||
|
|
||||||
# Fetch items and continuation token
|
# Fetch items and continuation token
|
||||||
items, next_continuation = Channel::Tabs.get_60_livestreams(
|
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
|
selected_tab = Frontend::ChannelPage::TabsAvailable::Streams
|
||||||
|
Loading…
Reference in New Issue
Block a user