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
##
## 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
GET_SIGNATURE_TIMESTAMP = 3
GET_PLAYER_STATUS = 4
PLAYER_UPDATE_TIMESTAMP = 5
end
private record Request,
@ -135,7 +136,15 @@ module Invidious::SigHelper
player_version = IO::ByteFormat::NetworkEndian.decode(UInt32, bytes[1..4])
has_player ? player_version : nil
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
private def send_request(request : Request, &)

View file

@ -2,18 +2,27 @@ require "http/params"
require "./sig_helper"
struct Invidious::DecryptFunction
@last_update = Time.monotonic - 42.days
@last_update : Time = Time.utc - 42.days
def initialize
self.check_update
end
def check_update
now = Time.monotonic
if (now - @last_update) > 60.seconds
now = Time.utc
# 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")
Invidious::SigHelper::Client.force_update
@last_update = Time.monotonic
@last_update = Time.utc
end
end