#!/bin/bash
# FIXME TODO:
-# restore XMP in output files from input sidecars
-# getopt, verbosity levels
# improve the default ufraw configuration
# localization?
-# help
# matches raw file names, used as case insensitive
RAW_REGEX='.*\.(arw|srf|sr2|crw|cr2|kdc|dcr|k25|raf|mef|mos|mrw|nef|orf|pef|ptx|dng|x3f|raw|r3d|3fr|erf)$'
+# matches output file names, used as case insensitive
+OUT_REGEX='.*\.(jpg|jpeg|png|tif|tiff|ppm)$'
+
# matches ufraw id file names, used as case sensitive
ID_REGEX='.*\.ufraw$'
+# matches xmp sidecar file names, used as case insensitive
+XMP_REGEX='.*\.xmp$'
+
+# extract output file from ufraw id file
get_output_from_id ()
{
grep "<OutputFilename>.*</OutputFilename>" "$1" |sed -e 's|.*<OutputFilename>\(.*\)</OutputFilename>.*|\1|'
}
+# extract input file from ufraw id file
+get_input_from_id ()
+{
+ grep "<InputFilename>.*</InputFilename>" "$1" |sed -e 's|.*<InputFilename>\(.*\)</InputFilename>.*|\1|'
+}
+
+add_xmp_from_sidecar ()
+{
+ idfile=$1
+ input=`get_input_from_id "$idfile"`
+ [ -f "$input" ] || return 1
+
+ basename=${input%.*}
+ dirname=${basename%/*}
+ xmp=`find "$dirname" -maxdepth 1 -path "$basename.*" -regextype posix-egrep -iregex "$XMP_REGEX" -print | head -n 1`
+ [ -f "$xmp" ] || return 1
+
+ output=`get_output_from_id "$idfile"`
+
+ [ -f "$output" ] || return 1
+ xmpext=.${xmp##*.}
+
+ # passing the source file to exiv2 is unnecessary complicated
+ # do not change the orientation, ufraw resets it to 1
+ exiv2 insert -ixX -l "$dirname" -S "$xmpext" "$output"
+ exiv2 -M "set Xmp.tiff.Orientation 1" "$output"
+}
+
# test if the id file has changed and the output needs to be refreshed
id_file_changed ()
{
idfile=$1
if id_file_changed "$idfile" ; then
ufraw-batch --overwrite "$idfile"
+ add_xmp_from_sidecar "$idfile"
fi
}
{
rawfile=$1
basename=${rawfile%.*}
- [ ! -f "$basename.ufraw" ]
+ dirname=${basename%/*}
+ outfiles=`find "$dirname" -maxdepth 1 -path "$basename.*" -regextype posix-egrep \( -iregex "$OUT_REGEX" -o -regex "$ID_REGEX" \) -print `
+ [ -z "$outfiles" ] # return true if no possible output file exists
+
+ # raw+jpeg pair created by the camera is considered processed,
+ # - this function returns false, the jpeg from camera is preserved and id file is not created
}
# process raw file for the first time
--out-type=jpeg \
--compression=96 \
"$rawfile"
+ idfile=${rawfile%.*}.ufraw
+ add_xmp_from_sidecar "$idfile"
fi
}
{
list=$1
use_zenity=$2
-
+
count=`wc -l <$list`
n=0
[ -n "$use_zenity" ] && echo 0
fi
n=$((n + 1))
-
+
# the function can end at the 'echo' command with broken pipe
# if it is cancelled via zenity
[ -n "$use_zenity" ] && echo $((n * 100 / count))
[ -n "$use_zenity" ] && echo 100
}
-# process all files in directory $1, including subdirectories
+# process all files in directories $@, including subdirectories
# processing is controlled by zenity dialogs if $DISPLAY is set
process_tree ()
{
list=`mktemp /tmp/geeqie-ufraw-list.XXXXXXXXXX` || exit 1
- find "$1" -regextype posix-egrep -iregex "$RAW_REGEX" -print | while read rawfile ; do
+ find "$@" -regextype posix-egrep -iregex "$RAW_REGEX" -print | while read rawfile ; do
raw_file_not_processed "$rawfile" && echo "$rawfile"
done >>$list
#refresh output from changed id files
- find "$1" -regextype posix-egrep -regex "$ID_REGEX" -print | while read idfile ; do
+ find "$@" -regextype posix-egrep -regex "$ID_REGEX" -print | while read idfile ; do
id_file_changed "$idfile" && echo "$idfile"
done >>$list
if [ -s $list ] && \
zenity --list --title "Files to proceed" --text "Files to proceed" --column "Files" <$list ; then
process_list $list with_zenity | zenity --progress --auto-close
+ else
+ zenity --info --title "All files are up-to-date" --text "All files are up-to-date"
fi
else
# no DISPLAY
rm $list
}
+print_help ()
+{
+ cat << EOT
+
+ RAW file collection maintenance tool
+
+ Usage:
+ geeqie-ufraw [raw file | id file] ...
+ geeqie-ufraw --recursive [dir] ...
+ geeqie-ufraw -h | --help
+
+ This script searches for new RAW files or for modified UFRaw
+ ID files and process them with ufraw-batch. It can work either
+ on individual files or on whole directory.
+ The functions are designed to be usable from Geeqie menu.
+
+EOT
+}
-if [ -d "$1" ] ; then
- # $1 is a directory
- process_tree "$1"
+#parse commandline
+
+while true ; do
+ case "$1" in
+ -v|--verbose)
+ verbose=yes #fixme: not used yet
+ shift ;;
+ -R|--recursive)
+ recursive=yes
+ shift ;;
+ -h|-help|--help|-*)
+ print_help
+ exit ;;
+ *)
+ break ;;
+ esac
+done
+
+if [ $# -lt 1 ] ; then
+ print_help
+ exit
+fi
+
+if [ -n "$recursive" ] ; then
+ # recursive processing of directories
+ process_tree "$@"
else
list=`mktemp /tmp/geeqie-ufraw-list.XXXXXXXXXX` || exit 1
for file in "$@" ; do
- echo $file
+ echo "$file" |sed -e "s|^\([^/]\)|$PWD/\1|"
done >>$list
process_list $list
rm $list