multi_exiftool 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. data/CHANGELOG +1 -1
  2. data/LICENSE +21 -0
  3. data/Manifest +16 -23
  4. data/README +77 -16
  5. data/Rakefile +17 -38
  6. data/examples/01_simple_reading.rb +13 -0
  7. data/examples/02_simple_writing.rb +19 -0
  8. data/examples/03_reading_using_groups.rb +28 -0
  9. data/lib/multi_exiftool.rb +6 -38
  10. data/lib/multi_exiftool/executable.rb +67 -0
  11. data/lib/multi_exiftool/reader.rb +60 -0
  12. data/lib/multi_exiftool/values.rb +60 -0
  13. data/lib/multi_exiftool/writer.rb +55 -0
  14. data/multi_exiftool.gemspec +25 -16
  15. data/test/helper.rb +27 -0
  16. data/test/test_reader.rb +135 -0
  17. data/test/test_values.rb +75 -0
  18. data/test/test_values_using_groups.rb +61 -0
  19. data/test/test_writer.rb +102 -0
  20. metadata +49 -47
  21. data/COPYING +0 -165
  22. data/data/fixtures/read_non_existing_file.stderr +0 -1
  23. data/data/fixtures/read_non_existing_file.stdout +0 -0
  24. data/data/fixtures/read_one_file.stderr +0 -0
  25. data/data/fixtures/read_one_file.stdout +0 -92
  26. data/data/fixtures/read_two_files.stderr +0 -0
  27. data/data/fixtures/read_two_files.stdout +0 -212
  28. data/data/regression/read_command.rb +0 -12
  29. data/data/regression/read_command.rb.out +0 -16
  30. data/data/regression/write_command.rb +0 -16
  31. data/data/regression/write_command.rb.out +0 -40
  32. data/lib/multi_exiftool/command_generator.rb +0 -68
  33. data/lib/multi_exiftool/parser.rb +0 -43
  34. data/lib/multi_exiftool/read_object.rb +0 -57
  35. data/script/colorize.rb +0 -6
  36. data/script/generate_fixture.rb +0 -27
  37. data/test/test_command_generator.rb +0 -89
  38. data/test/test_helper.rb +0 -44
  39. data/test/test_parser.rb +0 -51
  40. data/test/test_read_object.rb +0 -36
File without changes
@@ -1,212 +0,0 @@
1
- ======== /home/janfri/test_photos/2008-02-16_0013.jpe
2
- ExifToolVersion 7.03
3
- FileName 2008-02-16_0013.jpe
4
- Directory /home/janfri/test_photos
5
- FileSize 2 MB
6
- FileModifyDate 2008:02:16 16:10:54
7
- FileType JPEG
8
- MIMEType image/jpeg
9
- ExifByteOrder Big-endian (Motorola)
10
- ImageDescription KONICA MINOLTA DIGITAL CAMERA
11
- Make KONICA MINOLTA
12
- Model DYNAX 7D
13
- Orientation Horizontal (normal)
14
- XResolution 72
15
- YResolution 72
16
- ResolutionUnit inches
17
- Software DYNAX 7D v1.10
18
- ModifyDate 2008:02:16 16:10:52
19
- YCbCrPositioning Centered
20
- ExposureTime 1/250
21
- FNumber 6.7
22
- ExposureProgram Aperture-priority AE
23
- ISO 100
24
- ExifVersion 0221
25
- DateTimeOriginal 2008:02:16 16:10:52
26
- CreateDate 2008:02:16 16:10:52
27
- ComponentsConfiguration YCbCr
28
- BrightnessValue 8.5
29
- ExposureCompensation 0
30
- MaxApertureValue 6.7
31
- MeteringMode Center-weighted average
32
- LightSource Unknown (0)
33
- Flash Off
34
- FocalLength 300.0mm
35
- SubjectLocation 1504 1000 256 304
36
- MakerNoteVersion MLT0
37
- MinoltaImageSize Large
38
- WhiteBalance Auto
39
- FocusMode Single-shot AF
40
- AFPoints Center
41
- ISOSetting Auto
42
- FreeMemoryCardImages 49
43
- Rotation Horizontal (normal)
44
- ImageNumber 6
45
- NoiseReduction Unknown (2)
46
- ImageNumber2 304
47
- ZoneMatchingOn Off
48
- CompressedImageSize 2322879
49
- PreviewImageStart 2372611
50
- PreviewImageLength 46166
51
- SceneMode Standard
52
- ColorMode Adobe RGB
53
- MinoltaQuality Fine
54
- FlashExposureComp 0
55
- ImageStabilization On
56
- ZoneMatching ISO Setting Used
57
- ColorTemperature 0
58
- LensID Tamron 18-200, 28-300 or 80-300mm F3.5-6.3
59
- UserComment
60
- FlashpixVersion 0100
61
- ColorSpace Uncalibrated
62
- ExifImageWidth 3008
63
- ExifImageLength 2000
64
- InteropIndex R98 - DCF basic file (sRGB)
65
- InteropVersion 0100
66
- CustomRendered Normal
67
- ExposureMode Auto
68
- DigitalZoomRatio 0
69
- FocalLengthIn35mmFormat 450mm
70
- SceneCaptureType Standard
71
- GainControl None
72
- Contrast Normal
73
- Saturation Normal
74
- Sharpness Normal
75
- Compression JPEG (old-style)
76
- ThumbnailOffset 40306
77
- ThumbnailLength 3729
78
- ProfileCMMType Win
79
- ProfileVersion 2.2.0
80
- ProfileClass Display Device Profile
81
- ColorSpaceData RGB
82
- ProfileConnectionSpace XYZ
83
- ProfileDateTime 2002:05:09 20:45:47
84
- ProfileFileSignature acsp
85
- PrimaryPlatform Microsoft Corporation
86
- CMMFlags Not Embedded, Independent
87
- DeviceManufacturer KMHD
88
- DeviceModel
89
- DeviceAttributes Reflective, Glossy, Positive, Color
90
- RenderingIntent Perceptual
91
- ConnectionSpaceIlluminant 0.96419 1 0.82487
92
- ProfileCreator KMHD
93
- ProfileID 0
94
- ProfileCopyright Copyright 2002 Minolta Co.,Ltd.
95
- ProfileDescription AdobeRGB1998 ((KONICA MINOLTA CAM
96
- GreenTRC (Binary data 1036 bytes, use -b option to extract)
97
- RedTRC (Binary data 1036 bytes, use -b option to extract)
98
- BlueTRC (Binary data 1036 bytes, use -b option to extract)
99
- RedMatrixColumn 0.6097 0.3111 0.01949
100
- GreenMatrixColumn 0.20529 0.62569 0.0609
101
- BlueMatrixColumn 0.14919 0.06319 0.7446
102
- MediaWhitePoint 0.95045 1 1.08905
103
- ImageWidth 3008
104
- ImageHeight 2000
105
- EncodingProcess Baseline DCT, Huffman coding
106
- BitsPerSample 8
107
- ColorComponents 3
108
- YCbCrSubSampling YCbCr4:2:2 (2 1)
109
- Aperture 6.7
110
- ImageSize 3008x2000
111
- PreviewImage (Binary data 46166 bytes, use -b option to extract)
112
- ScaleFactor35efl 1.5
113
- ShutterSpeed 1/250
114
- ThumbnailImage (Binary data 3729 bytes, use -b option to extract)
115
- CircleOfConfusion 0.020 mm
116
- FocalLength35efl 300.0mm (35mm equivalent: 450.0mm)
117
- HyperfocalDistance 670.61 m
118
- LightValue 13.5
119
- ======== /home/janfri/test_photos/2008-03-01_0004.jpg
120
- ExifToolVersion 7.03
121
- FileName 2008-03-01_0004.jpg
122
- Directory /home/janfri/test_photos
123
- FileSize 2 MB
124
- FileModifyDate 2008:03:13 17:47:05
125
- FileType JPEG
126
- MIMEType image/jpeg
127
- ExifByteOrder Big-endian (Motorola)
128
- ImageDescription KONICA MINOLTA DIGITAL CAMERA
129
- Make KONICA MINOLTA
130
- Model DYNAX 7D
131
- Orientation Horizontal (normal)
132
- XResolution 72
133
- YResolution 72
134
- ResolutionUnit inches
135
- Software DYNAX 7D v1.10
136
- ModifyDate 2008:03:01 13:23:22
137
- YCbCrPositioning Centered
138
- ExposureTime 1/60
139
- FNumber 4.5
140
- ExposureProgram Program AE
141
- ISO 400
142
- ExifVersion 0221
143
- DateTimeOriginal 2008:03:01 13:23:22
144
- CreateDate 2008:03:01 13:23:22
145
- ComponentsConfiguration YCbCr
146
- BrightnessValue 3.5
147
- ExposureCompensation 0
148
- MaxApertureValue 4.5
149
- MeteringMode Center-weighted average
150
- LightSource Unknown (0)
151
- Flash On
152
- FocalLength 75.0mm
153
- SubjectLocation 1504 1000 256 304
154
- MakerNoteVersion MLT0
155
- MinoltaImageSize Large
156
- WhiteBalance Auto
157
- FocusMode Single-shot AF
158
- AFPoints Center
159
- ISOSetting Auto
160
- FreeMemoryCardImages 15
161
- Rotation Rotate 270 CW
162
- ImageNumber 6
163
- NoiseReduction Unknown (2)
164
- ImageNumber2 304
165
- ZoneMatchingOn Off
166
- CompressedImageSize 2191918
167
- PreviewImageStart 2241539
168
- PreviewImageLength 35524
169
- SceneMode Standard
170
- ColorMode Natural sRGB
171
- MinoltaQuality Fine
172
- FlashExposureComp 0
173
- ImageStabilization On
174
- ZoneMatching ISO Setting Used
175
- ColorTemperature 0
176
- LensID Tamron 18-200, 28-300 or 80-300mm F3.5-6.3
177
- UserComment
178
- FlashpixVersion 0100
179
- ColorSpace sRGB
180
- ExifImageWidth 3008
181
- ExifImageLength 2000
182
- InteropIndex R98 - DCF basic file (sRGB)
183
- InteropVersion 0100
184
- CustomRendered Normal
185
- ExposureMode Auto
186
- DigitalZoomRatio 0
187
- FocalLengthIn35mmFormat 112mm
188
- SceneCaptureType Standard
189
- GainControl Low gain up
190
- Contrast Normal
191
- Saturation Normal
192
- Sharpness Normal
193
- Compression JPEG (old-style)
194
- ThumbnailOffset 40306
195
- ThumbnailLength 3420
196
- ImageWidth 3008
197
- ImageHeight 2000
198
- EncodingProcess Baseline DCT, Huffman coding
199
- BitsPerSample 8
200
- ColorComponents 3
201
- YCbCrSubSampling YCbCr4:2:2 (2 1)
202
- Aperture 4.5
203
- ImageSize 3008x2000
204
- PreviewImage (Binary data 35524 bytes, use -b option to extract)
205
- ScaleFactor35efl 1.5
206
- ShutterSpeed 1/60
207
- ThumbnailImage (Binary data 3420 bytes, use -b option to extract)
208
- CircleOfConfusion 0.020 mm
209
- FocalLength35efl 75.0mm (35mm equivalent: 112.0mm)
210
- HyperfocalDistance 62.13 m
211
- LightValue 8.2
212
- 2 image files read
@@ -1,12 +0,0 @@
1
- $:.unshift File.join(File.dirname(__FILE__), %w(.. .. lib))
2
- require 'multi_exiftool'
3
-
4
- read_opts = [{}, {:numerical => true}, {:only => [:filename, :rotation, :orientation]}, {:numerical => true, :only => [:filename, :rotation, :orientation]}]
5
-
6
- filenames = [['a.jpg', 'b.jpg', 'c.jpg'], ['hello world.tif'], ['a.jpg', 'b.jpg', 'c.jpg', 'hello world.tif'], ['a.jpg', 'b.jpg', 'c.jpg', 'hello world.tif', 'd.jpg']]
7
-
8
- read_opts.each do |opts|
9
- filenames.each do |fnames|
10
- puts MultiExiftool::CommandGenerator.read_command(fnames, opts)
11
- end
12
- end
@@ -1,16 +0,0 @@
1
- exiftool -s -t a.jpg b.jpg c.jpg
2
- exiftool -s -t "hello world.tif"
3
- exiftool -s -t a.jpg b.jpg c.jpg "hello world.tif"
4
- exiftool -s -t a.jpg b.jpg c.jpg "hello world.tif" d.jpg
5
- exiftool -s -t -n a.jpg b.jpg c.jpg
6
- exiftool -s -t -n "hello world.tif"
7
- exiftool -s -t -n a.jpg b.jpg c.jpg "hello world.tif"
8
- exiftool -s -t -n a.jpg b.jpg c.jpg "hello world.tif" d.jpg
9
- exiftool -s -t -filename -rotation -orientation a.jpg b.jpg c.jpg
10
- exiftool -s -t -filename -rotation -orientation "hello world.tif"
11
- exiftool -s -t -filename -rotation -orientation a.jpg b.jpg c.jpg "hello world.tif"
12
- exiftool -s -t -filename -rotation -orientation a.jpg b.jpg c.jpg "hello world.tif" d.jpg
13
- exiftool -s -t -n -filename -rotation -orientation a.jpg b.jpg c.jpg
14
- exiftool -s -t -n -filename -rotation -orientation "hello world.tif"
15
- exiftool -s -t -n -filename -rotation -orientation a.jpg b.jpg c.jpg "hello world.tif"
16
- exiftool -s -t -n -filename -rotation -orientation a.jpg b.jpg c.jpg "hello world.tif" d.jpg
@@ -1,16 +0,0 @@
1
- $:.unshift File.join(File.dirname(__FILE__), %w(.. .. lib))
2
- require 'multi_exiftool'
3
-
4
- write_opts = [{}, {:numerical => true}]
5
-
6
- changesets = [{}, {:author => 'janfri'}, {:author => 'janfri', :comment => 'some comment'}, {:author => 'janfri', :comment => 'some comment', :keywords => [:a, :b, :c]}, {:orientation => 1}]
7
-
8
- filenames = [['a.jpg', 'b.jpg', 'c.jpg'], ['hello world.tif'], ['a.jpg', 'b.jpg', 'c.jpg', 'hello world.tif'], ['a.jpg', 'b.jpg', 'c.jpg', 'hello world.tif', 'd.jpg']]
9
-
10
- write_opts.each do |opts|
11
- changesets.each do |cs|
12
- filenames.each do |fnames|
13
- puts MultiExiftool::CommandGenerator.write_command(cs, fnames, opts)
14
- end
15
- end
16
- end
@@ -1,40 +0,0 @@
1
- exiftool -overwrite_original a.jpg b.jpg c.jpg
2
- exiftool -overwrite_original "hello world.tif"
3
- exiftool -overwrite_original a.jpg b.jpg c.jpg "hello world.tif"
4
- exiftool -overwrite_original a.jpg b.jpg c.jpg "hello world.tif" d.jpg
5
- exiftool -overwrite_original -author=janfri a.jpg b.jpg c.jpg
6
- exiftool -overwrite_original -author=janfri "hello world.tif"
7
- exiftool -overwrite_original -author=janfri a.jpg b.jpg c.jpg "hello world.tif"
8
- exiftool -overwrite_original -author=janfri a.jpg b.jpg c.jpg "hello world.tif" d.jpg
9
- exiftool -overwrite_original -author=janfri -comment="some comment" a.jpg b.jpg c.jpg
10
- exiftool -overwrite_original -author=janfri -comment="some comment" "hello world.tif"
11
- exiftool -overwrite_original -author=janfri -comment="some comment" a.jpg b.jpg c.jpg "hello world.tif"
12
- exiftool -overwrite_original -author=janfri -comment="some comment" a.jpg b.jpg c.jpg "hello world.tif" d.jpg
13
- exiftool -overwrite_original -author=janfri -comment="some comment" -keywords=a -keywords=b -keywords=c a.jpg b.jpg c.jpg
14
- exiftool -overwrite_original -author=janfri -comment="some comment" -keywords=a -keywords=b -keywords=c "hello world.tif"
15
- exiftool -overwrite_original -author=janfri -comment="some comment" -keywords=a -keywords=b -keywords=c a.jpg b.jpg c.jpg "hello world.tif"
16
- exiftool -overwrite_original -author=janfri -comment="some comment" -keywords=a -keywords=b -keywords=c a.jpg b.jpg c.jpg "hello world.tif" d.jpg
17
- exiftool -overwrite_original -orientation=1 a.jpg b.jpg c.jpg
18
- exiftool -overwrite_original -orientation=1 "hello world.tif"
19
- exiftool -overwrite_original -orientation=1 a.jpg b.jpg c.jpg "hello world.tif"
20
- exiftool -overwrite_original -orientation=1 a.jpg b.jpg c.jpg "hello world.tif" d.jpg
21
- exiftool -overwrite_original -n a.jpg b.jpg c.jpg
22
- exiftool -overwrite_original -n "hello world.tif"
23
- exiftool -overwrite_original -n a.jpg b.jpg c.jpg "hello world.tif"
24
- exiftool -overwrite_original -n a.jpg b.jpg c.jpg "hello world.tif" d.jpg
25
- exiftool -overwrite_original -n -author=janfri a.jpg b.jpg c.jpg
26
- exiftool -overwrite_original -n -author=janfri "hello world.tif"
27
- exiftool -overwrite_original -n -author=janfri a.jpg b.jpg c.jpg "hello world.tif"
28
- exiftool -overwrite_original -n -author=janfri a.jpg b.jpg c.jpg "hello world.tif" d.jpg
29
- exiftool -overwrite_original -n -author=janfri -comment="some comment" a.jpg b.jpg c.jpg
30
- exiftool -overwrite_original -n -author=janfri -comment="some comment" "hello world.tif"
31
- exiftool -overwrite_original -n -author=janfri -comment="some comment" a.jpg b.jpg c.jpg "hello world.tif"
32
- exiftool -overwrite_original -n -author=janfri -comment="some comment" a.jpg b.jpg c.jpg "hello world.tif" d.jpg
33
- exiftool -overwrite_original -n -author=janfri -comment="some comment" -keywords=a -keywords=b -keywords=c a.jpg b.jpg c.jpg
34
- exiftool -overwrite_original -n -author=janfri -comment="some comment" -keywords=a -keywords=b -keywords=c "hello world.tif"
35
- exiftool -overwrite_original -n -author=janfri -comment="some comment" -keywords=a -keywords=b -keywords=c a.jpg b.jpg c.jpg "hello world.tif"
36
- exiftool -overwrite_original -n -author=janfri -comment="some comment" -keywords=a -keywords=b -keywords=c a.jpg b.jpg c.jpg "hello world.tif" d.jpg
37
- exiftool -overwrite_original -n -orientation=1 a.jpg b.jpg c.jpg
38
- exiftool -overwrite_original -n -orientation=1 "hello world.tif"
39
- exiftool -overwrite_original -n -orientation=1 a.jpg b.jpg c.jpg "hello world.tif"
40
- exiftool -overwrite_original -n -orientation=1 a.jpg b.jpg c.jpg "hello world.tif" d.jpg
@@ -1,68 +0,0 @@
1
- module MultiExiftool
2
-
3
- module CommandGenerator
4
-
5
- @command = 'exiftool'
6
- @std_opts_read = '-s -t'
7
- @std_opts_write = '-overwrite_original'
8
-
9
- class << self
10
-
11
- attr_reader :std_opts_read, :std_opts_write
12
- attr_accessor :command
13
-
14
- def options_array opts={}
15
- arr = []
16
- arr << '-n' if opts[:numerical]
17
- arr
18
- end
19
-
20
- def write_tag_array change_set
21
- arr = []
22
- change_set.to_hash.each do |tag, val|
23
- val_array = val.kind_of?(Array) ? val : [val]
24
- val_array.each do |v|
25
- arr << "-#{tag}=#{escape(v)}"
26
- end
27
- end
28
- arr
29
- end
30
-
31
- def read_tag_array tags
32
- arr = []
33
- tags.each do |tag|
34
- arr << "-#{tag}"
35
- end
36
- arr
37
- end
38
-
39
- def filenames_array filenames
40
- filenames.flatten.map {|fn| escape(fn) }
41
- end
42
-
43
- def read_command *args
44
- files, opts = parse_args(args)
45
- only = opts[:only] || []
46
- [command, std_opts_read, options_array(opts), read_tag_array(only), filenames_array(files)].flatten.join(' ')
47
- end
48
-
49
- def write_command change_set, *args
50
- files, opts = parse_args(args)
51
- [command, std_opts_write, options_array(opts), write_tag_array(change_set), filenames_array(files)].flatten.join(' ')
52
- end
53
-
54
- def parse_args(args)
55
- opts = args.last.kind_of?(Hash) ? args.pop : {}
56
- [args, opts]
57
- end
58
-
59
- def escape string
60
- return string unless string =~ /[ \\]/
61
- '"' << string.gsub("\\") { "\\\\" } << '"'
62
- end
63
-
64
- end
65
-
66
- end
67
-
68
- end
@@ -1,43 +0,0 @@
1
- module MultiExiftool
2
-
3
- module Parser
4
-
5
- # :stopdoc:
6
- REGEXP_TAGLINE = /^(\w+)\t(.*)$/.freeze
7
- REGEXP_STRIPLINE = /^={8} /.freeze
8
- # :startdoc:
9
-
10
- def self.parse stdout, stderr
11
- result = []
12
- image_info = {}
13
- while !stdout.eof
14
- line = stdout.readline.chomp
15
- case line
16
- when REGEXP_TAGLINE
17
- image_info[$1] = $2
18
- when REGEXP_STRIPLINE
19
- unless image_info.empty?
20
- result << Result.new(image_info, {})
21
- end
22
- image_info = {}
23
- end
24
- end
25
- unless image_info.empty?
26
- result << Result.new(image_info, {})
27
- end
28
- result
29
- end
30
-
31
- class Result
32
-
33
- attr_reader :data, :errors
34
-
35
- def initialize data, errors
36
- @data, @errors = data.freeze, errors.freeze
37
- end
38
-
39
- end
40
-
41
- end
42
-
43
- end
@@ -1,57 +0,0 @@
1
- module MultiExiftool
2
-
3
- class ReadObject
4
-
5
- def initialize values={}
6
- @values = {}
7
- values.each do |tag, val|
8
- @values[unify(tag)] = val
9
- end
10
- @values.freeze
11
- end
12
-
13
- def each
14
- @values.each do |tag, val|
15
- yield tag, convert(val)
16
- end
17
- end
18
-
19
- def [] tag
20
- convert(@values[unify(tag)])
21
- end
22
-
23
- class << self
24
- attr_accessor :converting_rules
25
- end
26
-
27
- private
28
-
29
- def unify tag
30
- tag.gsub(/[\-_]/, '').downcase
31
- end
32
-
33
- def convert val
34
- result = val
35
- ReadObject.converting_rules.each do |test, proc|
36
- if test === val
37
- result = proc.call(val)
38
- break
39
- end
40
- end
41
- result
42
- end
43
-
44
- def method_missing sym, *args
45
- name = unify(sym.id2name)
46
- self[name]
47
- end
48
-
49
- @converting_rules = []
50
-
51
- @converting_rules << [/^0+\d+$/, lambda {|val| val}]
52
- @converting_rules << [/^[+\-]?\d+$/, lambda {|val| val.to_i}]
53
- @converting_rules << [/^[+\-]?\d+\.\d+$/, lambda {|val| val.to_f}]
54
-
55
- end
56
-
57
- end