Created
September 8, 2021 11:48
-
-
Save pstaender/da15d05e5705694f246df74c36f615ef to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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