From d65a35d4ae16215ed660a58abf679bca8e9a33fe Mon Sep 17 00:00:00 2001 From: evazion Date: Sun, 30 Oct 2022 04:31:23 -0500 Subject: [PATCH] media assets: add fix script to refresh metadata. Add a script to go through every media asset and check the metadata (width, height, duration, filesize, md5, EXIF metadata) and update it if it's changed. This is necessary after upgrading ExifTool because the metadata it returns may have changed. --- app/models/media_asset.rb | 6 ++++ script/fixes/123_refresh_media_metadata.rb | 34 ++++++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100755 script/fixes/123_refresh_media_metadata.rb diff --git a/app/models/media_asset.rb b/app/models/media_asset.rb index 84b73184a..94a3c26eb 100644 --- a/app/models/media_asset.rb +++ b/app/models/media_asset.rb @@ -78,6 +78,12 @@ class MediaAsset < ApplicationRecord end def open_file + open_file! + rescue + nil + end + + def open_file! file = storage_service.open(file_path) frame_delays = media_asset.frame_delays if media_asset.is_ugoira? MediaFile.open(file, frame_delays: frame_delays, strict: false) diff --git a/script/fixes/123_refresh_media_metadata.rb b/script/fixes/123_refresh_media_metadata.rb new file mode 100755 index 000000000..6d3ab7790 --- /dev/null +++ b/script/fixes/123_refresh_media_metadata.rb @@ -0,0 +1,34 @@ +#!/usr/bin/env ruby + +require_relative "base" + +with_confirmation do + condition = ENV.fetch("COND", "TRUE") + fix = ENV.fetch("FIX", "false").truthy? + + MediaAsset.active.where(condition).find_each do |asset| + variant = asset.variant(:original) + media_file = variant.open_file + + if media_file.nil? + puts ({ id: asset.id, error: "file doesn't exist", path: variant.file_path }).to_json + next + end + + # Setting `file` updates the metadata if it's different. + asset.file = media_file + asset.media_metadata.file = media_file + + old = asset.media_metadata.metadata_was.to_h + new = asset.media_metadata.metadata.to_h + metadata_changes = { added_metadata: (new.to_a - old.to_a).to_h, removed_metadata: (old.to_a - new.to_a).to_h }.compact_blank + puts ({ id: asset.id, **asset.changes, **metadata_changes }).to_json + + if fix + asset.save! if asset.changed? + asset.media_metadata.save! if asset.media_metadata.changed? + end + + media_file.close + end +end