mirror of
				https://github.com/iv-org/invidious.git
				synced 2025-11-04 06:31:57 +00:00 
			
		
		
		
	Add sort options to streams
This commit is contained in:
		@@ -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)
 | 
			
		||||
 
 | 
			
		||||
@@ -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)
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user