mirror of
https://github.com/iv-org/invidious.git
synced 2025-07-18 11:28:31 +00:00
cherry picked commits for dev-token-updater
This commit is contained in:
parent
70e4eb7f5d
commit
4fa7aa65bd
@ -67,6 +67,9 @@
|
|||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
|
**Patches**
|
||||||
|
- token updater patch (mooleshacat)
|
||||||
|
|
||||||
**User features**
|
**User features**
|
||||||
- Lightweight
|
- Lightweight
|
||||||
- No ads
|
- No ads
|
||||||
|
@ -189,6 +189,10 @@ Invidious::Jobs.register Invidious::Jobs::NotificationJob.new(CONNECTION_CHANNEL
|
|||||||
|
|
||||||
Invidious::Jobs.register Invidious::Jobs::ClearExpiredItemsJob.new
|
Invidious::Jobs.register Invidious::Jobs::ClearExpiredItemsJob.new
|
||||||
|
|
||||||
|
ReloadPOToken.get_tokens #init
|
||||||
|
|
||||||
|
Invidious::Jobs.register Invidious::Jobs::MonitorCfgPotokensJob.new()
|
||||||
|
|
||||||
Invidious::Jobs.register Invidious::Jobs::InstanceListRefreshJob.new
|
Invidious::Jobs.register Invidious::Jobs::InstanceListRefreshJob.new
|
||||||
|
|
||||||
Invidious::Jobs.start_all
|
Invidious::Jobs.start_all
|
||||||
|
17
src/invidious/jobs/token_monitor.cr
Normal file
17
src/invidious/jobs/token_monitor.cr
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
|
||||||
|
class Invidious::Jobs::MonitorCfgPotokensJob < Invidious::Jobs::BaseJob
|
||||||
|
include Invidious
|
||||||
|
def begin
|
||||||
|
loop do
|
||||||
|
|
||||||
|
LOGGER.info("jobs: running MonitorCfgPotokens job")
|
||||||
|
|
||||||
|
ReloadPOToken.get_tokens
|
||||||
|
|
||||||
|
LOGGER.info("jobs: MonitorCfgPotokens: pot: " + ReloadPOToken.pot.as(String))
|
||||||
|
LOGGER.info("jobs: MonitorCfgPotokens: vdata: " + ReloadPOToken.vdata.as(String))
|
||||||
|
|
||||||
|
sleep 15.seconds
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
83
src/invidious/reloadpotoken.cr
Normal file
83
src/invidious/reloadpotoken.cr
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
class ReloadPOToken
|
||||||
|
|
||||||
|
@@instance = new
|
||||||
|
|
||||||
|
def self.pot
|
||||||
|
@@pot
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.vdata
|
||||||
|
@@vdata
|
||||||
|
end
|
||||||
|
|
||||||
|
def initialize
|
||||||
|
|
||||||
|
@@pot = "error"
|
||||||
|
@@vdata = "error"
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.get_tokens
|
||||||
|
|
||||||
|
# Load config from file or YAML string env var
|
||||||
|
env_config_file = "INVIDIOUS_CONFIG_FILE"
|
||||||
|
env_config_yaml = "INVIDIOUS_CONFIG"
|
||||||
|
|
||||||
|
config_file = ENV.has_key?(env_config_file) ? ENV.fetch(env_config_file) : "config/config.yml"
|
||||||
|
config_yaml = ENV.has_key?(env_config_yaml) ? ENV.fetch(env_config_yaml) : File.read(config_file)
|
||||||
|
|
||||||
|
config = Config.from_yaml(config_yaml)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Update config from env vars (upcased and prefixed with "INVIDIOUS_")
|
||||||
|
{% for ivar in Config.instance_vars %}
|
||||||
|
{% env_id = "INVIDIOUS_#{ivar.id.upcase}" %}
|
||||||
|
|
||||||
|
if ENV.has_key?({{env_id}})
|
||||||
|
env_value = ENV.fetch({{env_id}})
|
||||||
|
success = false
|
||||||
|
|
||||||
|
# Use YAML converter if specified
|
||||||
|
{% ann = ivar.annotation(::YAML::Field) %}
|
||||||
|
{% if ann && ann[:converter] %}
|
||||||
|
config.{{ivar.id}} = {{ann[:converter]}}.from_yaml(YAML::ParseContext.new, YAML::Nodes.parse(ENV.fetch({{env_id}})).nodes[0])
|
||||||
|
success = true
|
||||||
|
|
||||||
|
# Use regular YAML parser otherwise
|
||||||
|
{% else %}
|
||||||
|
{% ivar_types = ivar.type.union? ? ivar.type.union_types : [ivar.type] %}
|
||||||
|
# Sort types to avoid parsing nulls and numbers as strings
|
||||||
|
{% ivar_types = ivar_types.sort_by { |ivar_type| ivar_type == Nil ? 0 : ivar_type == Int32 ? 1 : 2 } %}
|
||||||
|
{{ivar_types}}.each do |ivar_type|
|
||||||
|
if !success
|
||||||
|
begin
|
||||||
|
config.{{ivar.id}} = ivar_type.from_yaml(env_value)
|
||||||
|
success = true
|
||||||
|
rescue
|
||||||
|
# nop
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
{% end %}
|
||||||
|
|
||||||
|
# Exit on fail
|
||||||
|
if !success
|
||||||
|
puts %(Config.{{ivar.id}} failed to parse #{env_value} as {{ivar.type}})
|
||||||
|
exit(1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
{% end %}
|
||||||
|
|
||||||
|
|
||||||
|
@@pot = config.po_token
|
||||||
|
@@vdata = config.visitor_data
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.get_instance
|
||||||
|
return @@instance
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
@ -330,8 +330,8 @@ module YoutubeAPI
|
|||||||
client_context["client"]["platform"] = platform
|
client_context["client"]["platform"] = platform
|
||||||
end
|
end
|
||||||
|
|
||||||
if CONFIG.visitor_data.is_a?(String)
|
if ReloadPOToken.vdata.is_a?(String)
|
||||||
client_context["client"]["visitorData"] = CONFIG.visitor_data.as(String)
|
client_context["client"]["visitorData"] = ReloadPOToken.vdata.as(String)
|
||||||
end
|
end
|
||||||
|
|
||||||
return client_context
|
return client_context
|
||||||
@ -492,7 +492,7 @@ module YoutubeAPI
|
|||||||
"contentPlaybackContext" => playback_ctx,
|
"contentPlaybackContext" => playback_ctx,
|
||||||
},
|
},
|
||||||
"serviceIntegrityDimensions" => {
|
"serviceIntegrityDimensions" => {
|
||||||
"poToken" => CONFIG.po_token,
|
"poToken" => ReloadPOToken.pot.as(String),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -626,8 +626,8 @@ module YoutubeAPI
|
|||||||
headers["User-Agent"] = user_agent
|
headers["User-Agent"] = user_agent
|
||||||
end
|
end
|
||||||
|
|
||||||
if CONFIG.visitor_data.is_a?(String)
|
if ReloadPOToken.vdata.is_a?(String)
|
||||||
headers["X-Goog-Visitor-Id"] = CONFIG.visitor_data.as(String)
|
headers["X-Goog-Visitor-Id"] = ReloadPOToken.vdata.as(String)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Logging
|
# Logging
|
||||||
|
Loading…
Reference in New Issue
Block a user