SigHelper: Add support for PLAYER_UPDATE_TIMESTAMP opcode

This commit is contained in:
Samantaz Fox 2024-08-01 23:28:30 +02:00
parent 3b7e45b7bc
commit ec1bb5db87
No known key found for this signature in database
GPG key ID: F42821059186176E
3 changed files with 36 additions and 5 deletions

View file

@ -1,6 +1,6 @@
######################################### #########################################
# #
# Database configuration # Database and other external servers
# #
######################################### #########################################
@ -41,6 +41,19 @@ db:
#check_tables: false #check_tables: false
##
## Path to an external signature resolver, used to emulate
## the Youtube client's Javascript. If no such server is
## available, some videos will not be playable.
##
## When this setting is commented out, no external
## resolver will be used.
##
## Accepted values: a path to a UNIX socket or "<IP>:<Port>"
## Default: <none>
##
#signature_server:
######################################### #########################################
# #

View file

@ -61,6 +61,7 @@ module Invidious::SigHelper
DECRYPT_SIGNATURE = 2 DECRYPT_SIGNATURE = 2
GET_SIGNATURE_TIMESTAMP = 3 GET_SIGNATURE_TIMESTAMP = 3
GET_PLAYER_STATUS = 4 GET_PLAYER_STATUS = 4
PLAYER_UPDATE_TIMESTAMP = 5
end end
private record Request, private record Request,
@ -135,7 +136,15 @@ module Invidious::SigHelper
player_version = IO::ByteFormat::NetworkEndian.decode(UInt32, bytes[1..4]) player_version = IO::ByteFormat::NetworkEndian.decode(UInt32, bytes[1..4])
has_player ? player_version : nil has_player ? player_version : nil
end end
end
# Return when the player was last updated
def get_player_timestamp : UInt64?
request = Request.new(Opcode::GET_SIGNATURE_TIMESTAMP, nil)
return self.send_request(request) do |bytes|
IO::ByteFormat::NetworkEndian.decode(UInt64, bytes)
end
end end
private def send_request(request : Request, &) private def send_request(request : Request, &)

View file

@ -2,18 +2,27 @@ require "http/params"
require "./sig_helper" require "./sig_helper"
struct Invidious::DecryptFunction struct Invidious::DecryptFunction
@last_update = Time.monotonic - 42.days @last_update : Time = Time.utc - 42.days
def initialize def initialize
self.check_update self.check_update
end end
def check_update def check_update
now = Time.monotonic now = Time.utc
if (now - @last_update) > 60.seconds
# If we have updated in the last 5 minutes, do nothing
return if (now - @last_update) > 5.minutes
# Get the time when the player was updated, in the event where
# multiple invidious processes are run in parallel.
player_ts = Invidious::SigHelper::Client.get_player_timestamp
player_time = Time.unix(player_ts || 0)
if (now - player_time) > 5.minutes
LOGGER.debug("Signature: Player might be outdated, updating") LOGGER.debug("Signature: Player might be outdated, updating")
Invidious::SigHelper::Client.force_update Invidious::SigHelper::Client.force_update
@last_update = Time.monotonic @last_update = Time.utc
end end
end end