From 9cc8d8aa4abf1376e9e666a2f843900642ebd527 Mon Sep 17 00:00:00 2001 From: evazion Date: Wed, 15 Sep 2021 21:37:21 -0500 Subject: [PATCH] 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` --- app/logical/media_file.rb | 15 +++++++++++++++ bin/lsmetadata | 25 +++++++++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100755 bin/lsmetadata diff --git a/app/logical/media_file.rb b/app/logical/media_file.rb index 1702e0102..d22ee19ae 100644 --- a/app/logical/media_file.rb +++ b/app/logical/media_file.rb @@ -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 diff --git a/bin/lsmetadata b/bin/lsmetadata new file mode 100755 index 000000000..b29513518 --- /dev/null +++ b/bin/lsmetadata @@ -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