SigHelper: Add support for PLAYER_UPDATE_TIMESTAMP opcode
This commit is contained in:
parent
3b7e45b7bc
commit
ec1bb5db87
3 changed files with 36 additions and 5 deletions
|
@ -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:
|
||||
|
||||
|
||||
#########################################
|
||||
#
|
||||
|
|
|
@ -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, &)
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in a new issue