# HG changeset patch
# User nadvornik
# Date 1245539711 0
# Node ID 00673c03d85626606bdaf4e2c81e47d05ef15fd1
# Parent 349ebc02b8e22862621401d3cdd80b8751a7e827
various geeqie-ufraw improvements
- handle xmp sidecars
- commandline options, help
diff -r 349ebc02b8e2 -r 00673c03d856 plugins/ufraw/geeqie-ufraw
--- a/plugins/ufraw/geeqie-ufraw Sat Jun 20 18:42:23 2009 +0000
+++ b/plugins/ufraw/geeqie-ufraw Sat Jun 20 23:15:11 2009 +0000
@@ -1,24 +1,56 @@
#!/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 ".*" "$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 ()
{
@@ -33,6 +65,7 @@
idfile=$1
if id_file_changed "$idfile" ; then
ufraw-batch --overwrite "$idfile"
+ add_xmp_from_sidecar "$idfile"
fi
}
@@ -41,7 +74,12 @@
{
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
@@ -55,6 +93,8 @@
--out-type=jpeg \
--compression=96 \
"$rawfile"
+ idfile=${rawfile%.*}.ufraw
+ add_xmp_from_sidecar "$idfile"
fi
}
@@ -64,7 +104,7 @@
{
list=$1
use_zenity=$2
-
+
count=`wc -l <$list`
n=0
[ -n "$use_zenity" ] && echo 0
@@ -80,7 +120,7 @@
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))
@@ -90,18 +130,18 @@
[ -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
@@ -109,6 +149,8 @@
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
@@ -117,15 +159,56 @@
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
-if [ -d "$1" ] ; then
- # $1 is a directory
- process_tree "$1"
+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
diff -r 349ebc02b8e2 -r 00673c03d856 plugins/ufraw/geeqie-ufraw-recursive.desktop.in
--- a/plugins/ufraw/geeqie-ufraw-recursive.desktop.in Sat Jun 20 18:42:23 2009 +0000
+++ b/plugins/ufraw/geeqie-ufraw-recursive.desktop.in Sat Jun 20 23:15:11 2009 +0000
@@ -1,10 +1,13 @@
[Desktop Entry]
Version=1.0
Type=Application
-_Name=Process folder with UFRaw Batch
+_Name=UFRaw Batch recursive
# call the helper script with current directory as an argument
-Exec=geeqie-ufraw .
+Exec=geeqie-ufraw --recursive .
+
+# show only if ufraw is installed
+TryExec=ufraw
# Desktop files that are usable only in Geeqie should be marked like this:
Categories=X-Geeqie;
@@ -16,3 +19,4 @@
# It can be made verbose
# X-Geeqie-Verbose=true
+Icon=ufraw
diff -r 349ebc02b8e2 -r 00673c03d856 plugins/ufraw/geeqie-ufraw.desktop.in
--- a/plugins/ufraw/geeqie-ufraw.desktop.in Sat Jun 20 18:42:23 2009 +0000
+++ b/plugins/ufraw/geeqie-ufraw.desktop.in Sat Jun 20 23:15:11 2009 +0000
@@ -7,6 +7,9 @@
# - this allows a better controll over processing
Exec=geeqie-ufraw %f
+# show only if ufraw is installed
+TryExec=ufraw
+
# Desktop files that are usable only in Geeqie should be marked like this:
Categories=X-Geeqie;
OnlyShowIn=X-Geeqie;
@@ -18,3 +21,5 @@
X-Geeqie-Verbose=true
MimeType=application/x-ufraw;image/x-dcraw;
+
+Icon=ufraw