From f75a81c9eeb792c0b99075bc47a1243a23b8700b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9ry=20Mathieu=20=28Mathius=29?= Date: Mon, 21 Feb 2022 10:53:20 +0100 Subject: [PATCH] Make configurable time between each RefreshChannelsJob --- config/config.example.yml | 8 ++++ docker-compose.yml | 2 + src/invidious/config.cr | 12 +++--- src/invidious/helpers/utils.cr | 44 +++++++++++++++------- src/invidious/jobs/refresh_channels_job.cr | 5 +-- 5 files changed, 49 insertions(+), 22 deletions(-) diff --git a/config/config.example.yml b/config/config.example.yml index 59cb486b..475f2703 100644 --- a/config/config.example.yml +++ b/config/config.example.yml @@ -314,6 +314,14 @@ https_only: false ## channel_threads: 1 +## +## Time between channel_refresh +## +## Accepted values: a valid time interval (hours:min:seconds) +## Default: 00:30:00 +## +channel_refresh_time: 00:30:00 + ## ## Forcefully dump and re-download the entire list of uploaded ## videos when crawling channel (during subscriptions update). diff --git a/docker-compose.yml b/docker-compose.yml index c76c314c..964bb702 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -23,7 +23,9 @@ services: environment: # Adapted from ./config/config.yml INVIDIOUS_CONFIG: | + log_level: Info channel_threads: 1 + channel_refresh_time: 00:30:00 check_tables: true feed_threads: 1 db: diff --git a/src/invidious/config.cr b/src/invidious/config.cr index 72e145da..150f8064 100644 --- a/src/invidious/config.cr +++ b/src/invidious/config.cr @@ -56,11 +56,13 @@ end class Config include YAML::Serializable - property channel_threads : Int32 = 1 # Number of threads to use for crawling videos from channels (for updating subscriptions) - property feed_threads : Int32 = 1 # Number of threads to use for updating feeds - property output : String = "STDOUT" # Log file path or STDOUT - property log_level : LogLevel = LogLevel::Info # Default log level, valid YAML values are ints and strings, see src/invidious/helpers/logger.cr - property db : DBConfig? = nil # Database configuration with separate parameters (username, hostname, etc) + property channel_threads : Int32 = 1 # Number of threads to use for crawling videos from channels (for updating subscriptions) + @[YAML::Field(converter: TimeSpanConverter)] + property channel_refresh_time : Time::Span = 30.minutes # Time between channel_refresh + property feed_threads : Int32 = 1 # Number of threads to use for updating feeds + property output : String = "STDOUT" # Log file path or STDOUT + property log_level : LogLevel = LogLevel::Info # Default log level, valid YAML values are ints and strings, see src/invidious/helpers/logger.cr + property db : DBConfig? = nil # Database configuration with separate parameters (username, hostname, etc) @[YAML::Field(converter: Preferences::URIConverter)] property database_url : URI = URI.parse("") # Database configuration using 12-Factor "Database URL" syntax diff --git a/src/invidious/helpers/utils.cr b/src/invidious/helpers/utils.cr index a58a21b1..2702c5e9 100644 --- a/src/invidious/helpers/utils.cr +++ b/src/invidious/helpers/utils.cr @@ -18,23 +18,39 @@ def elapsed_text(elapsed) "#{(millis * 1000).round(2)}µs" end -def decode_length_seconds(string) - length_seconds = string.gsub(/[^0-9:]/, "") - return 0_i32 if length_seconds.empty? +module TimeSpanConverter + def self.to_yaml(value : Time::Span, yaml : YAML::Nodes::Builder) + return yaml.scalar recode_length_seconds(value.total_seconds.to_i32) + end - length_seconds = length_seconds.split(":").map { |x| x.to_i? || 0 } - length_seconds = [0] * (3 - length_seconds.size) + length_seconds - - length_seconds = Time::Span.new( - hours: length_seconds[0], - minutes: length_seconds[1], - seconds: length_seconds[2] - ).total_seconds.to_i32 - - return length_seconds + def self.from_yaml(ctx : YAML::ParseContext, node : YAML::Nodes::Node) : Time::Span + if node.is_a?(YAML::Nodes::Scalar) + return decode_time_span(node.value) + else + node.raise "Expected scalar, not #{node.class}" + end + end end -def recode_length_seconds(time) +def decode_time_span(string : String) : Time::Span + time_span = string.gsub(/[^0-9:]/, "") + return Time::Span.new(seconds: 0) if time_span.empty? + + time_span = time_span.split(":").map { |x| x.to_i? || 0 } + time_span = [0] * (3 - time_span.size) + time_span + + return Time::Span.new( + hours: time_span[0], + minutes: time_span[1], + seconds: time_span[2] + ) +end + +def decode_length_seconds(string : String) : Int32 + return decode_time_span(string).total_seconds.to_i32 +end + +def recode_length_seconds(time : Int32) : String if time <= 0 return "" else diff --git a/src/invidious/jobs/refresh_channels_job.cr b/src/invidious/jobs/refresh_channels_job.cr index 55fb8154..3e04d1cd 100644 --- a/src/invidious/jobs/refresh_channels_job.cr +++ b/src/invidious/jobs/refresh_channels_job.cr @@ -58,9 +58,8 @@ class Invidious::Jobs::RefreshChannelsJob < Invidious::Jobs::BaseJob end end - # TODO: make this configurable - LOGGER.debug("RefreshChannelsJob: Done, sleeping for thirty minutes") - sleep 30.minutes + LOGGER.debug("RefreshChannelsJob: Done, sleeping for #{CONFIG.channel_refresh_time}") + sleep CONFIG.channel_refresh_time Fiber.yield end end