Skip to content

Instantly share code, notes, and snippets.

@pstaender
Created September 8, 2021 11:48
Show Gist options
  • Save pstaender/da15d05e5705694f246df74c36f615ef to your computer and use it in GitHub Desktop.
Save pstaender/da15d05e5705694f246df74c36f615ef to your computer and use it in GitHub Desktop.
require 'digest'
require 'json'
require 'shellwords'
def command?(name)
`which #{name}`
$?.success?
end
unless command?('sips')
STDERR.puts 'Sry, only for mac os is supported (sips is required)'
exit 1
end
unless command?('7z')
STDERR.puts 'Problem: Install 7z first, `brew install p7zip`'
exit 1
end
def file_extension(file)
extension = file.match(/\.([^\.]+?)$/)
extension && extension[1] ? extension[1].downcase : nil
end
def is_image?(file)
image_formats = %w{dng arw cr2 jpg png bmp}
extension = file_extension(file)
extension && image_formats.include?(extension)
end
def create_image_preview(file, preview)
previewSize = 640
STDERR.puts "Creating image preview -> #{preview} (#{previewSize}px)"
if file_extension(file) == 'jpg'
`sips -Z #{previewSize} '#{file.shellescape}' --out '#{preview.shellescape}'`
else
`sips -s format jpeg '#{file.shellescape}' --out '#{preview.shellescape}'`
`sips -Z #{previewSize} '#{preview.shellescape}'`
end
end
preview_dir = "#{__dir__}/previews"
Dir.mkdir(preview_dir) unless File.exists?("#{__dir__}/previews")
data = {}
base_folder = ARGV.last
archive_filename = File.basename(base_folder)
raise "archive filename can not be empty" if archive_filename.empty?
Dir.glob("#{base_folder}/**/*").each do |file|
next unless File.file?(file)
hash = Digest::SHA1.hexdigest(file)
filename = file[base_folder.size..file.size]
d = {
filename: filename,
size: File.size(file) / 1024
}
if is_image?(file)
d[:type] = 'image'
preview = "#{preview_dir}/#{hash}.jpg"
create_image_preview(file, preview) unless File.exists?(preview)
if File.exists?(preview)
d[:preview] = "#{hash}.jpg"
end
end
data[hash] ||= []
data[hash] << d
end
puts "Creating ZIP file #{archive_filename}.zip with json file and image previews"
File.write("#{archive_filename}.json", JSON.pretty_generate(data))
archive_commands = [
"mkdir -p '#{__dir__}/#{archive_filename.shellescape}'",
"mv '#{archive_filename.shellescape}.json' '#{__dir__}/#{archive_filename.shellescape}/'",
"mv '#{preview_dir.shellescape}' '#{__dir__}/#{archive_filename.shellescape}'",
"7z a '#{archive_filename.shellescape}.zip' '#{__dir__}/#{archive_filename.shellescape}'",
]
`#{archive_commands.join(" && ")}`
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment