mirror of
https://github.com/iv-org/invidious.git
synced 2024-11-25 15:07:22 +00:00
SigHelper: Add support for PLAYER_UPDATE_TIMESTAMP opcode
This commit is contained in:
parent
3b7e45b7bc
commit
ec1bb5db87
@ -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:
|
||||||
|
|
||||||
|
|
||||||
#########################################
|
#########################################
|
||||||
#
|
#
|
||||||
|
@ -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, &)
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user