forked from midou/invidious
videos: handle different JSON structs being present in cache
This commit is contained in:
parent
db91d3af66
commit
2acff70811
@ -7,6 +7,16 @@ end
|
|||||||
struct Video
|
struct Video
|
||||||
include DB::Serializable
|
include DB::Serializable
|
||||||
|
|
||||||
|
# Version of the JSON structure
|
||||||
|
# It prevents us from loading an incompatible version from cache
|
||||||
|
# (either newer or older, if instances with different versions run
|
||||||
|
# concurrently, e.g during a version upgrade rollout).
|
||||||
|
#
|
||||||
|
# NOTE: don't forget to bump this number if any change is made to
|
||||||
|
# the `params` structure in videos/parser.cr!!!
|
||||||
|
#
|
||||||
|
SCHEMA_VERSION = 2
|
||||||
|
|
||||||
property id : String
|
property id : String
|
||||||
|
|
||||||
@[DB::Field(converter: Video::JSONConverter)]
|
@[DB::Field(converter: Video::JSONConverter)]
|
||||||
@ -55,6 +65,10 @@ struct Video
|
|||||||
return VideoType.parse?(video_type) || VideoType::Video
|
return VideoType.parse?(video_type) || VideoType::Video
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def schema_version : Int
|
||||||
|
return info["version"]?.try &.as_i || 1
|
||||||
|
end
|
||||||
|
|
||||||
def published : Time
|
def published : Time
|
||||||
return info["published"]?
|
return info["published"]?
|
||||||
.try { |t| Time.parse(t.as_s, "%Y-%m-%d", Time::Location::UTC) } || Time.utc
|
.try { |t| Time.parse(t.as_s, "%Y-%m-%d", Time::Location::UTC) } || Time.utc
|
||||||
@ -326,7 +340,8 @@ def get_video(id, refresh = true, region = nil, force_refresh = false)
|
|||||||
if (refresh &&
|
if (refresh &&
|
||||||
(Time.utc - video.updated > 10.minutes) ||
|
(Time.utc - video.updated > 10.minutes) ||
|
||||||
(video.premiere_timestamp.try &.< Time.utc)) ||
|
(video.premiere_timestamp.try &.< Time.utc)) ||
|
||||||
force_refresh
|
force_refresh ||
|
||||||
|
video.schema_version != Video::SCHEMA_VERSION # cache control
|
||||||
begin
|
begin
|
||||||
video = fetch_video(id, region)
|
video = fetch_video(id, region)
|
||||||
Invidious::Database::Videos.update(video)
|
Invidious::Database::Videos.update(video)
|
||||||
|
@ -71,7 +71,8 @@ def extract_video_info(video_id : String, proxy_region : String? = nil, context_
|
|||||||
# Stop here if video is not a scheduled livestream
|
# Stop here if video is not a scheduled livestream
|
||||||
if playability_status != "LIVE_STREAM_OFFLINE"
|
if playability_status != "LIVE_STREAM_OFFLINE"
|
||||||
return {
|
return {
|
||||||
"reason" => JSON::Any.new(reason),
|
"version" => JSON::Any.new(Video::SCHEMA_VERSION.to_i64),
|
||||||
|
"reason" => JSON::Any.new(reason),
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
elsif video_id != player_response.dig("videoDetails", "videoId")
|
elsif video_id != player_response.dig("videoDetails", "videoId")
|
||||||
@ -121,6 +122,9 @@ def extract_video_info(video_id : String, proxy_region : String? = nil, context_
|
|||||||
params[f] = player_response[f] if player_response[f]?
|
params[f] = player_response[f] if player_response[f]?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Data structure version, for cache control
|
||||||
|
params["version"] = JSON::Any.new(Video::SCHEMA_VERSION.to_i64)
|
||||||
|
|
||||||
return params
|
return params
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user