Use a single function for fetching channel contents
This commit is contained in:
parent
63e5d72466
commit
0d63ad5a7f
|
@ -1,4 +1,4 @@
|
||||||
def produce_channel_videos_continuation(ucid, page = 1, auto_generated = nil, sort_by = "newest", v2 = false)
|
def produce_channel_content_continuation(ucid, content, page = 1, auto_generated = nil, sort_by = "newest", v2 = false)
|
||||||
object_inner_2 = {
|
object_inner_2 = {
|
||||||
"2:0:embedded" => {
|
"2:0:embedded" => {
|
||||||
"1:0:varint" => 0_i64,
|
"1:0:varint" => 0_i64,
|
||||||
|
@ -16,6 +16,13 @@ def produce_channel_videos_continuation(ucid, page = 1, auto_generated = nil, so
|
||||||
.try { |i| Base64.urlsafe_encode(i) }
|
.try { |i| Base64.urlsafe_encode(i) }
|
||||||
.try { |i| URI.encode_www_form(i) }
|
.try { |i| URI.encode_www_form(i) }
|
||||||
|
|
||||||
|
content_numerical =
|
||||||
|
case content
|
||||||
|
when "videos" then 15
|
||||||
|
when "livestreams" then 14
|
||||||
|
else 15 # Fallback to "videos"
|
||||||
|
end
|
||||||
|
|
||||||
sort_by_numerical =
|
sort_by_numerical =
|
||||||
case sort_by
|
case sort_by
|
||||||
when "newest" then 1_i64
|
when "newest" then 1_i64
|
||||||
|
@ -27,7 +34,7 @@ def produce_channel_videos_continuation(ucid, page = 1, auto_generated = nil, so
|
||||||
object_inner_1 = {
|
object_inner_1 = {
|
||||||
"110:embedded" => {
|
"110:embedded" => {
|
||||||
"3:embedded" => {
|
"3:embedded" => {
|
||||||
"15:embedded" => {
|
"#{content_numerical}:embedded" => {
|
||||||
"1:embedded" => {
|
"1:embedded" => {
|
||||||
"1:string" => object_inner_2_encoded,
|
"1:string" => object_inner_2_encoded,
|
||||||
},
|
},
|
||||||
|
@ -62,76 +69,16 @@ def produce_channel_videos_continuation(ucid, page = 1, auto_generated = nil, so
|
||||||
return continuation
|
return continuation
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def make_initial_content_ctoken(ucid, content, sort_by) : String
|
||||||
|
return produce_channel_content_continuation(ucid, content, sort_by: sort_by)
|
||||||
|
end
|
||||||
|
|
||||||
# Used in bypass_captcha_job.cr
|
# Used in bypass_captcha_job.cr
|
||||||
def produce_channel_videos_url(ucid, page = 1, auto_generated = nil, sort_by = "newest", v2 = false)
|
def produce_channel_videos_url(ucid, page = 1, auto_generated = nil, sort_by = "newest", v2 = false)
|
||||||
continuation = produce_channel_videos_continuation(ucid, page, auto_generated, sort_by, v2)
|
continuation = produce_channel_content_continuation(ucid, "videos", page, auto_generated, sort_by, v2)
|
||||||
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
|
|
||||||
|
|
||||||
module Invidious::Channel::Tabs
|
module Invidious::Channel::Tabs
|
||||||
extend self
|
extend self
|
||||||
|
|
||||||
|
@ -139,10 +86,6 @@ module Invidious::Channel::Tabs
|
||||||
# Regular videos
|
# Regular videos
|
||||||
# -------------------
|
# -------------------
|
||||||
|
|
||||||
def make_initial_video_ctoken(ucid, sort_by) : String
|
|
||||||
return produce_channel_videos_continuation(ucid, sort_by: sort_by)
|
|
||||||
end
|
|
||||||
|
|
||||||
# Wrapper for AboutChannel, as we still need to call get_videos with
|
# Wrapper for AboutChannel, as we still need to call get_videos with
|
||||||
# an author name and ucid directly (e.g in RSS feeds).
|
# an author name and ucid directly (e.g in RSS feeds).
|
||||||
# TODO: figure out how to get rid of that
|
# TODO: figure out how to get rid of that
|
||||||
|
@ -164,7 +107,7 @@ module Invidious::Channel::Tabs
|
||||||
end
|
end
|
||||||
|
|
||||||
def get_videos(author : String, ucid : String, *, continuation : String? = nil, sort_by = "newest")
|
def get_videos(author : String, ucid : String, *, continuation : String? = nil, sort_by = "newest")
|
||||||
continuation ||= make_initial_video_ctoken(ucid, sort_by)
|
continuation ||= make_initial_content_ctoken(ucid, "videos", sort_by)
|
||||||
initial_data = YoutubeAPI.browse(continuation: continuation)
|
initial_data = YoutubeAPI.browse(continuation: continuation)
|
||||||
|
|
||||||
return extract_items(initial_data, author, ucid)
|
return extract_items(initial_data, author, ucid)
|
||||||
|
@ -208,13 +151,9 @@ module Invidious::Channel::Tabs
|
||||||
# Livestreams
|
# Livestreams
|
||||||
# -------------------
|
# -------------------
|
||||||
|
|
||||||
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")
|
def get_livestreams(channel : AboutChannel, continuation : String? = nil, sort_by = "newest")
|
||||||
if continuation.nil?
|
if continuation.nil?
|
||||||
continuation ||= make_initial_livestream_ctoken(channel.ucid, sort_by)
|
continuation ||= make_initial_content_ctoken(channel.ucid, "livestreams", sort_by)
|
||||||
end
|
end
|
||||||
|
|
||||||
initial_data = YoutubeAPI.browse(continuation: continuation)
|
initial_data = YoutubeAPI.browse(continuation: continuation)
|
||||||
|
|
Loading…
Reference in a new issue