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