#!/bin/sh
# FIXME TODO:
# improve the default ufraw configuration
# localization?
# 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 ".*" "$1" |sed -e 's|.*\(.*\).*|\1|'
}
# extract input file from ufraw id file
get_input_from_id ()
{
grep ".*" "$1" |sed -e 's|.*\(.*\).*|\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
output=`get_output_from_id "$idfile"`
[ ! -f "$output" -o "$idfile" -nt "$output" ]
}
# refresh the output file specified by given id file, if necessary
process_ufraw_id_file ()
{
idfile=$1
if id_file_changed "$idfile" ; then
ufraw-batch --overwrite "$idfile"
add_xmp_from_sidecar "$idfile"
fi
}
# test for newly added raw files that were never processed
raw_file_not_processed ()
{
rawfile=$1
basename=${rawfile%.*}
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
process_raw_file_default ()
{
rawfile=$1
if raw_file_not_processed "$rawfile" ; then
ufraw-batch --create-id=also \
--wb=camera \
--exposure=auto \
--out-type=jpeg \
--compression=96 \
"$rawfile"
idfile=${rawfile%.*}.ufraw
add_xmp_from_sidecar "$idfile"
fi
}
# process all files listed in file $1
# if $2 is not empty, produce output for zenity --progress
process_list ()
{
list=$1
use_zenity=$2
count=`wc -l <$list`
n=0
[ -n "$use_zenity" ] && echo 0
if [ "$count" -gt 0 ] ; then
while read file; do
[ -f "$file" ] || continue
if echo "$file"|grep -E -q -i "$RAW_REGEX" ; then
process_raw_file_default "$file"
elif echo "$file"|grep -E -q "$ID_REGEX" ; then
process_ufraw_id_file "$file"
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))
done <$list
fi
[ -n "$use_zenity" ] && echo 100
}
# 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 "$@" -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 "$@" -regextype posix-egrep -regex "$ID_REGEX" -print | while read idfile ; do
id_file_changed "$idfile" && echo "$idfile"
done >>$list
if [ -n "$DISPLAY" ] ; then
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
process_list $list
fi
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
}
#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" |sed -e "s|^\([^/]\)|$PWD/\1|"
done >>$list
process_list $list
rm $list
fi