improved rotation script
[geeqie.git] / plugins / rotate / geeqie-rotate
index 7abe42b..3aa9673 100755 (executable)
@@ -1,15 +1,59 @@
-#!/bin/sh
+#!/bin/bash -x
 
-# This is a helper script that rotate jpeg files using jpegtran
+# This is a helper script that rotate image files according to the metadata
+# requirements: ImageMagick, exiftran, exiv2
 
-rotation=$1
-shift
+GQ_METADATA_DIR="$HOME/.local/share/geeqie/metadata"
 
+rotate()
+{
+    ext=`echo "${1##*.}" |tr "[:upper:]" "[:lower:]"`
+    [ "x$ext" == "x" ] && return 1 #no extension
+
+    gq_metadata="$GQ_METADATA_DIR/$1.gq.xmp"
+    if [ -f "$gq_metadata" ]; then
+       gq_orientation=`exiv2 -PXkv "$gq_metadata"|grep Xmp.tiff.Orientation|sed -e "s|Xmp.tiff.Orientation *||"`
+    else
+       gq_orientation=
+    fi
+
+    case "$ext" in
+       jpg|jpeg) 
+               [ -n "$gq_orientation" ] && exiv2 -M "set Exif.Image.Orientation $gq_orientation" "$1"
+               if exiftran -aip "$1" ; then
+                   # exiftran ignores xmp, set it manually
+                   exiv2 -M "set Xmp.tiff.Orientation 1" "$1"
+                   #http://dev.exiv2.org/issues/show/639
+                   [ -n "$gq_orientation" ] && exiv2 -M "set Xmp.tiff.Orientation 1" \
+                                                     -M "set Exif.Image.Orientation 1" "$gq_metadata"
+                   return 0
+               fi
+               ;;
+       
+       tif|tiff|png)
+               [ -n "$gq_orientation" ] && exiv2 -M "set Exif.Image.Orientation $gq_orientation" "$1"
+               if mogrify -auto-orient "$1" ; then
+                   # mogrify ignores xmp, set it manually
+                   exiv2 -M "set Xmp.tiff.Orientation 1" "$1"
+                   #http://dev.exiv2.org/issues/show/639
+                   [ -n "$gq_orientation" ] && exiv2 -M "set Xmp.tiff.Orientation 1" \
+                                                     -M "set Exif.Image.Orientation 1" "$gq_metadata"
+                   return 0
+               fi
+               ;;
+       *)      #not supported
+               return 0
+               ;;
+    esac
+}
+
+# iterate over files on commandline
 for file in "$@" ; do
-       tmp="$file".$$
-       if jpegtran -rotate "$rotation" -copy all -outfile "$tmp" "$file"; then
-               mv -f "$tmp" "$file";
-       else
-               rm -f "$tmp";
-       fi
+    # we got only one file for each group, typically the main one
+    # get the sidecars:
+    geeqie -r --get-sidecars:"$file" |while read sidecar ; do
+       # the main file is included in the sidecar file list, no special handling is required
+       rotate "$sidecar"
+    done
 done
+