/usr/lib/geeqie/geeqie-ufraw is in geeqie-common 1:1.2-3.
This file is owned by root:root, with mode 0o755.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 | #!/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 "<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
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
|