Merge remote-tracking branch 'github/merge-requests/579'
[geeqie.git] / plugins / rotate / geeqie-rotate
1 #!/bin/sh
2
3 # This is a helper script that rotate image files according to the metadata
4 # requirements: ImageMagick, exiftran, exiv2
5
6 GQ_METADATA_DIR="$HOME/.local/share/geeqie/metadata"
7
8 rotate()
9 {
10     ext=`echo "${1##*.}" |tr "[:upper:]" "[:lower:]"`
11     [ "x$ext" = "x" ] && return 1 #no extension
12
13     gq_metadata="$GQ_METADATA_DIR/$1.gq.xmp"
14     if [ -f "$gq_metadata" ] ; then
15                 gq_orientation=`exiv2 -PXkv "$gq_metadata"|grep Xmp.tiff.Orientation|sed -e "s|Xmp.tiff.Orientation *||"`
16                 [ $? != 0 ] && exit 1
17     else
18                 gq_orientation=
19     fi
20
21     case "$ext" in
22         jpg|jpeg) 
23                 if [ -n "$gq_orientaqtion" ] ; then
24                         exiv2 -M "set Exif.Image.Orientation $gq_orientation" "$1"
25                         [ $? != 0 ] && exit 1
26                 fi
27                 if exiftran -aip "$1" ; then
28                     # exiftran ignores xmp, set it manually
29                     exiv2 -M "set Xmp.tiff.Orientation 1" "$1"
30                         [ $? != 0 ] && exit 1
31                     #http://dev.exiv2.org/issues/show/639
32                         if [ -n "$gq_orientation" ] ; then
33                                 exiv2 -M "set Xmp.tiff.Orientation 1" \
34                                                                 -M "set Exif.Image.Orientation 1" "$gq_metadata"
35                                 [ $? != 0 ] && exit 1
36                         fi
37                     return 0
38                 else
39                         exit 1
40                 fi
41                 ;;
42         
43         tif|tiff|png)
44                 if [ -n "$gq_orientation" ] ; then
45                         exiv2 -M "set Exif.Image.Orientation $gq_orientation" "$1"
46                         [ $? != 0 ] && exit 1
47                 fi
48                 if mogrify -auto-orient "$1" ; then
49                     # mogrify ignores xmp, set it manually
50                     exiv2 -M "set Xmp.tiff.Orientation 1" "$1"
51                         [ $? != 0 ] && exit 1
52                     #http://dev.exiv2.org/issues/show/639
53                         if [ -n "$gq_orientation" ] ; then
54                                 exiv2 -M "set Xmp.tiff.Orientation 1" \
55                                                                 -M "set Exif.Image.Orientation 1" "$gq_metadata"
56                                 [ $? != 0 ] && exit 1
57                         fi
58                     return 0
59                 else
60                         exit 1
61                 fi
62                 ;;
63         *)      #not supported
64                 return 4
65                 ;;
66     esac
67 }
68
69 rotate_image_file()
70 {
71         ext=`echo "${3##*.}" |tr "[:upper:]" "[:lower:]"`
72         [ "x$ext" = "x" ] && return 1 #no extension
73
74         case "$ext" in
75         jpg|jpeg)
76                 exiftran -i "$1" "$3"
77                 [ $? != 0 ]  && return 6
78                 return 0;
79                 ;;
80
81         tif|tiff|png)
82                 mogrify $2 "$3"
83                 [ $? != 0 ]  && return 7
84                 return 0;
85                 ;;
86
87         *)      #not supported
88                 return 4
89                 ;;
90         esac
91 }
92
93 get_sidecars=
94 if [ "x$1" = "x-g" ] ; then
95     get_sidecars=yes
96     shift
97 fi
98
99 rotate_image_file=
100 rotation=
101 if [ "x$1" = "x-r" ] ; then
102         rotate_image_file=yes
103         shift
104         rotation="$1"
105         shift
106 fi
107
108 preserve_mtime=
109 if [ "x$1" = "x-t" ] ; then
110         preserve_mtime=yes
111         shift
112 fi
113
114 if [ -n "$rotation" ] ; then
115         if [ "x$rotation" = "x0" ] ; then
116                 exit 0
117         fi
118         if [ "x$rotation" = "x2" ] ; then
119                 mogrify_param="-flop"
120                 exiftran_param="-F"
121         fi
122         if [ "x$rotation" = "x3" ] ; then
123                 mogrify_param="-rotate 180"
124                 exiftran_param="-1"
125         fi
126         if [ "x$rotation" = "x4" ] ; then
127                 mogrify_param="-flip"
128                 exiftran_param="-f"
129         fi
130         if [ "x$rotation" = "x5" ] ; then
131                 mogrify_param="-transpose"
132                 exiftran_param="-t"
133         fi
134         if [ "x$rotation" = "x6" ] ; then
135                 mogrify_param="-rotate 90"
136                 exiftran_param="-9"
137         fi
138         if [ "x$rotation" = "x7" ] ; then
139                 mogrify_param="-transverse"
140                 exiftran_param="-T"
141         fi
142         if [ "x$rotation" = "x8" ] ; then
143                 mogrify_param="-rotate -90"
144                 exiftran_param="-2"
145         fi
146 fi
147
148 # iterate over files on commandline
149 for file in "$@" ; do
150     if [ -n "$get_sidecars" ] ; then
151         # we got only one file for each group, typically the main one
152         # get the sidecars:
153         geeqie -r --get-sidecars:"$file" |while read sidecar ; do
154             # the main file is included in the sidecar file list, no special handling is required
155                         [ ! -w "$sidecar" ] && exit 5
156             rotate "$sidecar"
157                         ret=$?
158         done
159                 # Bourne shell runs DO loops in a sub-shell
160                 ret=$?
161                 [ $ret != 0 ] && exit $ret
162     else
163                 [ ! -w "$file" ] && exit 5
164                 if [ -n "$rotate_image_file" ] ; then
165                         if [ -n "$preserve_mtime" ] ; then
166                                 mtime=`mktemp /tmp/geeqie-rotate.XXXXXXXXXX` || exit 3
167                                 touch --reference="$file" "$mtime"
168                         fi
169
170                         rotate_image_file "$exiftran_param" "$mogrify_param" "$file"
171                         ret=$?
172
173                         if [ -n "$preserve_mtime" ] ; then
174                                 touch --reference="$mtime" "$file"
175                                 rm "$mtime"
176                         fi
177                         [ $ret != 0 ]  && exit $ret
178                 else
179                         rotate "$file"
180                         ret=$?
181                         [ $ret != 0 ] && exit $ret
182                 fi
183     fi
184 done
185
186 exit 0