This commit is contained in:
Samantaz Fox 2024-02-12 21:51:25 +01:00
parent d8dee8e767
commit 81fdf7b089
No known key found for this signature in database
GPG Key ID: F42821059186176E
6 changed files with 16 additions and 22 deletions

View File

@ -3,7 +3,7 @@ require "./cache/*"
module Invidious::Cache
extend self
INSTANCE = self.init(CONFIG.cache)
private INSTANCE = self.init(CONFIG.cache)
def init(cfg : Config::CacheConfig) : ItemStore
# Environment variable takes precedence over local config
@ -26,4 +26,11 @@ module Invidious::Cache
raise InvalidConfigException.new "Invalid cache url. Only redis:// URL are currently supported."
end
end
# Shortcut methods to not have to specify INSTANCE everywhere in the code
{% for method in ["fetch", "store", "delete", "clear"] %}
def {{method.id}}(*args, **kwargs)
INSTANCE.{{method.id}}(*args, **kwargs)
end
{% end %}
end

View File

@ -1,9 +0,0 @@
require "json"
module Invidious::Cache
# Including this module allows the includer object to be cached.
# The object will automatically inherit from JSON::Serializable.
module CacheableItem
include JSON::Serializable
end
end

View File

@ -10,7 +10,7 @@ module Invidious::Cache
abstract def fetch(key : String)
# Stores a given item into cache
abstract def store(key : String, value : CacheableItem | String, expires : Time::Span)
abstract def store(key : String, value : String, expires : Time::Span)
# Prematurely deletes item(s) from the cache
abstract def delete(key : String)

View File

@ -9,7 +9,7 @@ module Invidious::Cache
return nil
end
def store(key : String, value : CacheableItem | String, expires : Time::Span)
def store(key : String, value : String, expires : Time::Span)
end
def delete(key : String)

View File

@ -14,8 +14,7 @@ module Invidious::Cache
return @redis.get(key)
end
def store(key : String, value : CacheableItem | String, expires : Time::Span)
value = value.to_json if value.is_a?(CacheableItem)
def store(key : String, value : String, expires : Time::Span)
@redis.set(key, value, ex: expires.to_i)
end

View File

@ -14,6 +14,7 @@ struct Video
# the `params` structure in videos/parser.cr!!!
#
SCHEMA_VERSION = 2
CACHE_KEY = "video_v#{SCHEMA_VERSION}"
property id : String
property info : Hash(String, JSON::Any)
@ -36,7 +37,7 @@ struct Video
end
def self.get(id : String, *, force_refresh = false, region = nil)
key = "video:#{id}"
key = "#{CACHE_KEY}:#{id}"
key += ":#{region}" if !region.nil?
# Fetch video from cache, unles a force refresh is requested
@ -50,12 +51,8 @@ struct Video
else
video = Video.new(id, JSON.parse(info).as_h)
# If video has premiered, live has started or the format
# of the video data has changed, refresh the data.
outdated_data = (video.schema_version != Video::SCHEMA_VERSION)
live_started = (video.live_now && video.published < Time.utc)
if outdated_data || live_started
# If the video has premiered or the live has started, refresh the data.
if (video.live_now && video.published < Time.utc)
video = Video.new(id, fetch_video(id, region))
updated = true
end
@ -71,7 +68,7 @@ struct Video
end
end
return video
return Video.new(id, info)
end
# Methods for API v1 JSON