metadata: add CLI script for printing image metadata

Add a utility script for printing image metadata from the command line.

Usage: `bin/lsmetadata 1.jpg 2.jpg`
This commit is contained in:
evazion
2021-09-15 21:37:21 -05:00
parent 822f72387e
commit 9cc8d8aa4a
2 changed files with 40 additions and 0 deletions

View File

@@ -6,6 +6,8 @@
# supported by a File.
class MediaFile
extend Memoist
include ActiveModel::Serializers::JSON
attr_accessor :file
# delegate all File methods to `file`.
@@ -168,5 +170,18 @@ class MediaFile
nil
end
def attributes
{
path: path,
width: width,
height: height,
file_ext: file_ext,
file_size: file_size,
md5: md5,
is_corrupt?: is_corrupt?,
metadata: metadata
}.stringify_keys
end
memoize :file_ext, :file_size, :md5, :metadata
end

25
bin/lsmetadata Executable file
View File

@@ -0,0 +1,25 @@
#!/usr/bin/env ruby
# List metadata for given image and video files in JSON format.
#
# Usage:
#
# bin/lsmetadata 1.jpg | jq # list file
# bin/lsmetadata | jq # list all files in current directory
# bin/lsmetadata images/ | jq # list directory
# bin/lsmetadata images/**/* | jq # list directory recursively
#
# # Run from Docker without having to install Danbooru
# docker run -rm -it -v $PWD:/mnt ghcr.io/danbooru/danbooru bin/lsmetadata /mnt/images/**/* | jq
APP_PATH = File.expand_path('../config/application', __dir__)
require_relative "../config/environment"
files = ARGV
files = [Dir.pwd] if files.empty?
files.map! { |file| File.directory?(file) ? Dir[file + "/*"] : file }.flatten!
files.reject! { |file| File.directory?(file) }
files.each do |filename|
puts MediaFile.open(filename).to_json
end