hydra-derivatives 2.0.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +2 -1
- data/History.md +43 -0
- data/README.md +23 -38
- data/VERSION +1 -1
- data/hydra-derivatives.gemspec +0 -1
- data/lib/hydra/derivatives.rb +23 -123
- data/lib/hydra/derivatives/io_decorator.rb +7 -1
- data/lib/hydra/derivatives/processors.rb +19 -0
- data/lib/hydra/derivatives/processors/audio.rb +6 -0
- data/lib/hydra/derivatives/processors/document.rb +28 -0
- data/lib/hydra/derivatives/processors/ffmpeg.rb +22 -0
- data/lib/hydra/derivatives/processors/full_text.rb +60 -0
- data/lib/hydra/derivatives/processors/image.rb +58 -0
- data/lib/hydra/derivatives/processors/jpeg2k_image.rb +129 -0
- data/lib/hydra/derivatives/processors/processor.rb +38 -0
- data/lib/hydra/derivatives/processors/raw_image.rb +37 -0
- data/lib/hydra/derivatives/processors/shell_based_processor.rb +108 -0
- data/lib/hydra/derivatives/{video.rb → processors/video.rb} +1 -1
- data/lib/hydra/derivatives/{video → processors/video}/config.rb +1 -1
- data/lib/hydra/derivatives/{video → processors/video}/processor.rb +2 -8
- data/lib/hydra/derivatives/runners/audio_derivatives.rb +7 -0
- data/lib/hydra/derivatives/runners/document_derivatives.rb +7 -0
- data/lib/hydra/derivatives/runners/full_text_extract.rb +16 -0
- data/lib/hydra/derivatives/runners/image_derivatives.rb +16 -0
- data/lib/hydra/derivatives/runners/jpeg2k_image_derivatives.rb +15 -0
- data/lib/hydra/derivatives/runners/pdf_derivatives.rb +6 -0
- data/lib/hydra/derivatives/runners/runner.rb +52 -0
- data/lib/hydra/derivatives/runners/video_derivatives.rb +7 -0
- data/lib/hydra/derivatives/services/mime_type_service.rb +10 -0
- data/lib/hydra/derivatives/services/persist_basic_contained_output_file_service.rb +23 -8
- data/lib/hydra/derivatives/services/persist_output_file_service.rb +4 -5
- data/lib/hydra/derivatives/services/retrieve_source_file_service.rb +8 -6
- data/spec/processors/full_text.rb +61 -0
- data/spec/{units → processors}/image_spec.rb +7 -17
- data/spec/{units → processors}/jpeg2k_spec.rb +9 -11
- data/spec/processors/processor_spec.rb +36 -0
- data/spec/processors/shell_based_processor_spec.rb +19 -0
- data/spec/processors/video_spec.rb +40 -0
- data/spec/services/audio_derivatives_spec.rb +76 -0
- data/spec/services/persist_basic_contained_output_file_service_spec.rb +4 -3
- data/spec/services/retrieve_source_file_service_spec.rb +16 -12
- data/spec/units/derivatives_spec.rb +18 -26
- data/spec/units/io_decorator_spec.rb +33 -0
- data/spec/units/transcoding_spec.rb +109 -86
- metadata +42 -44
- data/lib/hydra/derivatives/audio.rb +0 -19
- data/lib/hydra/derivatives/document.rb +0 -56
- data/lib/hydra/derivatives/extract_metadata.rb +0 -27
- data/lib/hydra/derivatives/ffmpeg.rb +0 -31
- data/lib/hydra/derivatives/image.rb +0 -73
- data/lib/hydra/derivatives/jpeg2k_image.rb +0 -136
- data/lib/hydra/derivatives/processor.rb +0 -33
- data/lib/hydra/derivatives/railtie.rb +0 -9
- data/lib/hydra/derivatives/raw_image.rb +0 -45
- data/lib/hydra/derivatives/shell_based_processor.rb +0 -81
- data/spec/lib/hydra/derivatives/extract_metadata_spec.rb +0 -39
- data/spec/units/extract_spec.rb +0 -22
- data/spec/units/processor_spec.rb +0 -61
- data/spec/units/shell_based_processor_spec.rb +0 -22
- data/spec/units/video_spec.rb +0 -50
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hydra-derivatives
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Justin Coyne
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-10-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -80,20 +80,6 @@ dependencies:
|
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '9.0'
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: hydra-file_characterization
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - "~>"
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '0.3'
|
90
|
-
type: :runtime
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - "~>"
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '0.3'
|
97
83
|
- !ruby/object:Gem::Dependency
|
98
84
|
name: mini_magick
|
99
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -179,26 +165,35 @@ files:
|
|
179
165
|
- lib/color_profiles/license.txt
|
180
166
|
- lib/color_profiles/sRGB_IEC61966-2-1_no_black_scaling.icc
|
181
167
|
- lib/hydra/derivatives.rb
|
182
|
-
- lib/hydra/derivatives/audio.rb
|
183
168
|
- lib/hydra/derivatives/config.rb
|
184
|
-
- lib/hydra/derivatives/document.rb
|
185
|
-
- lib/hydra/derivatives/extract_metadata.rb
|
186
|
-
- lib/hydra/derivatives/ffmpeg.rb
|
187
|
-
- lib/hydra/derivatives/image.rb
|
188
169
|
- lib/hydra/derivatives/io_decorator.rb
|
189
|
-
- lib/hydra/derivatives/jpeg2k_image.rb
|
190
170
|
- lib/hydra/derivatives/logger.rb
|
191
|
-
- lib/hydra/derivatives/
|
192
|
-
- lib/hydra/derivatives/
|
193
|
-
- lib/hydra/derivatives/
|
171
|
+
- lib/hydra/derivatives/processors.rb
|
172
|
+
- lib/hydra/derivatives/processors/audio.rb
|
173
|
+
- lib/hydra/derivatives/processors/document.rb
|
174
|
+
- lib/hydra/derivatives/processors/ffmpeg.rb
|
175
|
+
- lib/hydra/derivatives/processors/full_text.rb
|
176
|
+
- lib/hydra/derivatives/processors/image.rb
|
177
|
+
- lib/hydra/derivatives/processors/jpeg2k_image.rb
|
178
|
+
- lib/hydra/derivatives/processors/processor.rb
|
179
|
+
- lib/hydra/derivatives/processors/raw_image.rb
|
180
|
+
- lib/hydra/derivatives/processors/shell_based_processor.rb
|
181
|
+
- lib/hydra/derivatives/processors/video.rb
|
182
|
+
- lib/hydra/derivatives/processors/video/config.rb
|
183
|
+
- lib/hydra/derivatives/processors/video/processor.rb
|
184
|
+
- lib/hydra/derivatives/runners/audio_derivatives.rb
|
185
|
+
- lib/hydra/derivatives/runners/document_derivatives.rb
|
186
|
+
- lib/hydra/derivatives/runners/full_text_extract.rb
|
187
|
+
- lib/hydra/derivatives/runners/image_derivatives.rb
|
188
|
+
- lib/hydra/derivatives/runners/jpeg2k_image_derivatives.rb
|
189
|
+
- lib/hydra/derivatives/runners/pdf_derivatives.rb
|
190
|
+
- lib/hydra/derivatives/runners/runner.rb
|
191
|
+
- lib/hydra/derivatives/runners/video_derivatives.rb
|
192
|
+
- lib/hydra/derivatives/services/mime_type_service.rb
|
194
193
|
- lib/hydra/derivatives/services/persist_basic_contained_output_file_service.rb
|
195
194
|
- lib/hydra/derivatives/services/persist_output_file_service.rb
|
196
195
|
- lib/hydra/derivatives/services/retrieve_source_file_service.rb
|
197
196
|
- lib/hydra/derivatives/services/tempfile_service.rb
|
198
|
-
- lib/hydra/derivatives/shell_based_processor.rb
|
199
|
-
- lib/hydra/derivatives/video.rb
|
200
|
-
- lib/hydra/derivatives/video/config.rb
|
201
|
-
- lib/hydra/derivatives/video/processor.rb
|
202
197
|
- spec/fixtures/FlashPix.ppt
|
203
198
|
- spec/fixtures/adobe1998.tif
|
204
199
|
- spec/fixtures/countdown.avi
|
@@ -214,21 +209,22 @@ files:
|
|
214
209
|
- spec/fixtures/test.xls
|
215
210
|
- spec/fixtures/test.xlsx
|
216
211
|
- spec/fixtures/world.png
|
217
|
-
- spec/
|
212
|
+
- spec/processors/full_text.rb
|
213
|
+
- spec/processors/image_spec.rb
|
214
|
+
- spec/processors/jpeg2k_spec.rb
|
215
|
+
- spec/processors/processor_spec.rb
|
216
|
+
- spec/processors/shell_based_processor_spec.rb
|
217
|
+
- spec/processors/video_spec.rb
|
218
|
+
- spec/services/audio_derivatives_spec.rb
|
218
219
|
- spec/services/persist_basic_contained_output_file_service_spec.rb
|
219
220
|
- spec/services/retrieve_source_file_service_spec.rb
|
220
221
|
- spec/services/tempfile_service_spec.rb
|
221
222
|
- spec/spec_helper.rb
|
222
223
|
- spec/units/config_spec.rb
|
223
224
|
- spec/units/derivatives_spec.rb
|
224
|
-
- spec/units/
|
225
|
-
- spec/units/image_spec.rb
|
226
|
-
- spec/units/jpeg2k_spec.rb
|
225
|
+
- spec/units/io_decorator_spec.rb
|
227
226
|
- spec/units/logger_spec.rb
|
228
|
-
- spec/units/processor_spec.rb
|
229
|
-
- spec/units/shell_based_processor_spec.rb
|
230
227
|
- spec/units/transcoding_spec.rb
|
231
|
-
- spec/units/video_spec.rb
|
232
228
|
homepage: https://github.com/projecthydra/hydra-derivatives
|
233
229
|
licenses:
|
234
230
|
- APACHE2
|
@@ -249,7 +245,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
249
245
|
version: '0'
|
250
246
|
requirements: []
|
251
247
|
rubyforge_project:
|
252
|
-
rubygems_version: 2.4.5
|
248
|
+
rubygems_version: 2.4.5.1
|
253
249
|
signing_key:
|
254
250
|
specification_version: 4
|
255
251
|
summary: Derivative generation plugin for hydra
|
@@ -269,18 +265,20 @@ test_files:
|
|
269
265
|
- spec/fixtures/test.xls
|
270
266
|
- spec/fixtures/test.xlsx
|
271
267
|
- spec/fixtures/world.png
|
272
|
-
- spec/
|
268
|
+
- spec/processors/full_text.rb
|
269
|
+
- spec/processors/image_spec.rb
|
270
|
+
- spec/processors/jpeg2k_spec.rb
|
271
|
+
- spec/processors/processor_spec.rb
|
272
|
+
- spec/processors/shell_based_processor_spec.rb
|
273
|
+
- spec/processors/video_spec.rb
|
274
|
+
- spec/services/audio_derivatives_spec.rb
|
273
275
|
- spec/services/persist_basic_contained_output_file_service_spec.rb
|
274
276
|
- spec/services/retrieve_source_file_service_spec.rb
|
275
277
|
- spec/services/tempfile_service_spec.rb
|
276
278
|
- spec/spec_helper.rb
|
277
279
|
- spec/units/config_spec.rb
|
278
280
|
- spec/units/derivatives_spec.rb
|
279
|
-
- spec/units/
|
280
|
-
- spec/units/image_spec.rb
|
281
|
-
- spec/units/jpeg2k_spec.rb
|
281
|
+
- spec/units/io_decorator_spec.rb
|
282
282
|
- spec/units/logger_spec.rb
|
283
|
-
- spec/units/processor_spec.rb
|
284
|
-
- spec/units/shell_based_processor_spec.rb
|
285
283
|
- spec/units/transcoding_spec.rb
|
286
|
-
|
284
|
+
has_rdoc:
|
@@ -1,56 +0,0 @@
|
|
1
|
-
module Hydra
|
2
|
-
module Derivatives
|
3
|
-
class Document < Processor
|
4
|
-
include ShellBasedProcessor
|
5
|
-
|
6
|
-
def self.encode(path, options, output_file)
|
7
|
-
format = File.extname(output_file).sub('.', '')
|
8
|
-
outdir = File.dirname(output_file)
|
9
|
-
execute "#{Hydra::Derivatives.libreoffice_path} --invisible --headless --convert-to #{format} --outdir #{outdir} #{path}"
|
10
|
-
end
|
11
|
-
|
12
|
-
def encode_file(destination_name, file_suffix, mime_type, options = { })
|
13
|
-
new_output = ''
|
14
|
-
Hydra::Derivatives::TempfileService.create(source_file) do |f|
|
15
|
-
if mime_type == 'image/jpeg'
|
16
|
-
temp_file = File.join(Hydra::Derivatives.temp_file_base, [File.basename(f.path).sub(File.extname(f.path), ''), 'pdf'].join('.'))
|
17
|
-
new_output = File.join(Hydra::Derivatives.temp_file_base, [File.basename(temp_file).sub(File.extname(temp_file), ''), file_suffix].join('.'))
|
18
|
-
self.class.encode(f.path, options, temp_file)
|
19
|
-
self.class.encode(temp_file, options, output_file(file_suffix))
|
20
|
-
File.unlink(temp_file)
|
21
|
-
else
|
22
|
-
self.class.encode(f.path, options, output_file(file_suffix))
|
23
|
-
new_output = File.join(Hydra::Derivatives.temp_file_base, [File.basename(f.path).sub(File.extname(f.path), ''), file_suffix].join('.'))
|
24
|
-
end
|
25
|
-
end
|
26
|
-
out_file = Hydra::Derivatives::IoDecorator.new(File.open(new_output, "rb"))
|
27
|
-
out_file.mime_type = mime_type
|
28
|
-
output_file_service.call(object, out_file, destination_name)
|
29
|
-
File.unlink(out_file)
|
30
|
-
end
|
31
|
-
|
32
|
-
def output_file(file_suffix)
|
33
|
-
Dir::Tmpname.create(["#{object.id.gsub('/', '_')}-content.", ".#{file_suffix}"], Hydra::Derivatives.temp_file_base){}
|
34
|
-
end
|
35
|
-
|
36
|
-
def new_mime_type(format)
|
37
|
-
case format
|
38
|
-
when 'pdf'
|
39
|
-
'application/pdf'
|
40
|
-
when 'odf'
|
41
|
-
'application/vnd.oasis.opendocument.text'
|
42
|
-
when 'docx'
|
43
|
-
'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
|
44
|
-
when 'xslx'
|
45
|
-
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
|
46
|
-
when 'pptx'
|
47
|
-
'application/vnd.openxmlformats-officedocument.presentationml.presentation'
|
48
|
-
when 'jpg'
|
49
|
-
'image/jpeg'
|
50
|
-
else
|
51
|
-
raise "I don't know about the format '#{format}'"
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
@@ -1,27 +0,0 @@
|
|
1
|
-
require 'hydra-file_characterization'
|
2
|
-
require 'mime/types'
|
3
|
-
|
4
|
-
module Hydra
|
5
|
-
module Derivatives
|
6
|
-
module ExtractMetadata
|
7
|
-
|
8
|
-
def extract_metadata
|
9
|
-
return unless has_content?
|
10
|
-
Hydra::FileCharacterization.characterize(content, filename_for_characterization.join(""), :fits) do |config|
|
11
|
-
config[:fits] = Hydra::Derivatives.fits_path
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
protected
|
16
|
-
|
17
|
-
def filename_for_characterization
|
18
|
-
registered_mime_type = MIME::Types[mime_type].first
|
19
|
-
Logger.warn "Unable to find a registered mime type for #{mime_type.inspect} on #{uri}" unless registered_mime_type
|
20
|
-
extension = registered_mime_type ? ".#{registered_mime_type.extensions.first}" : ''
|
21
|
-
version_id = 1 # TODO fixme
|
22
|
-
m = /\/([^\/]*)$/.match(uri)
|
23
|
-
["#{m[1]}-#{version_id}", "#{extension}"]
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
@@ -1,31 +0,0 @@
|
|
1
|
-
# An abstract class for asyncronous jobs that transcode files using FFMpeg
|
2
|
-
|
3
|
-
require 'tmpdir'
|
4
|
-
require 'open3'
|
5
|
-
|
6
|
-
module Hydra
|
7
|
-
module Derivatives
|
8
|
-
module Ffmpeg
|
9
|
-
extend ActiveSupport::Concern
|
10
|
-
|
11
|
-
INPUT_OPTIONS=:input_options
|
12
|
-
OUTPUT_OPTIONS=:output_options
|
13
|
-
|
14
|
-
included do
|
15
|
-
include ShellBasedProcessor
|
16
|
-
end
|
17
|
-
|
18
|
-
|
19
|
-
module ClassMethods
|
20
|
-
|
21
|
-
def encode(path, options, output_file)
|
22
|
-
inopts = options[INPUT_OPTIONS] ||= "-y"
|
23
|
-
outopts = options[OUTPUT_OPTIONS] ||= ""
|
24
|
-
execute "#{Hydra::Derivatives.ffmpeg_path} #{inopts} -i \"#{path}\" #{outopts} #{output_file}"
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
@@ -1,73 +0,0 @@
|
|
1
|
-
require 'mini_magick'
|
2
|
-
|
3
|
-
module Hydra
|
4
|
-
module Derivatives
|
5
|
-
class Image < Processor
|
6
|
-
class_attribute :timeout
|
7
|
-
|
8
|
-
def process
|
9
|
-
timeout ? process_with_timeout : process_without_timeout
|
10
|
-
end
|
11
|
-
|
12
|
-
def process_with_timeout
|
13
|
-
status = Timeout::timeout(timeout) do
|
14
|
-
process_without_timeout
|
15
|
-
end
|
16
|
-
rescue Timeout::Error => ex
|
17
|
-
raise Hydra::Derivatives::TimeoutError, "Unable to process image derivative\nThe command took longer than #{timeout} seconds to execute"
|
18
|
-
end
|
19
|
-
|
20
|
-
def process_without_timeout
|
21
|
-
directives.each do |name, args|
|
22
|
-
opts = args.kind_of?(Hash) ? args : {size: args}
|
23
|
-
format = opts.fetch(:format, 'png')
|
24
|
-
destination_name = output_filename_for(name, opts)
|
25
|
-
create_resized_image(destination_name, opts[:size], format)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
def output_filename_for(name, opts = {})
|
30
|
-
if opts.has_key? :datastream
|
31
|
-
Deprecation.warn Hydra::Derivatives::Image, 'The :datastream option is deprecated and will be removed in a future release.'
|
32
|
-
end
|
33
|
-
opts.fetch(:datastream, output_file_id(name))
|
34
|
-
end
|
35
|
-
|
36
|
-
protected
|
37
|
-
|
38
|
-
def new_mime_type(format)
|
39
|
-
MIME::Types.type_for(format).first.to_s
|
40
|
-
end
|
41
|
-
|
42
|
-
def create_resized_image(destination_name, size, format, quality=nil)
|
43
|
-
create_image(destination_name, format, quality) do |xfrm|
|
44
|
-
xfrm.resize(size) if size.present?
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
def create_image(destination_name, format, quality=nil)
|
49
|
-
xfrm = load_image_transformer
|
50
|
-
yield(xfrm) if block_given?
|
51
|
-
xfrm.format(format)
|
52
|
-
xfrm.quality(quality.to_s) if quality
|
53
|
-
write_image(destination_name, format, xfrm)
|
54
|
-
end
|
55
|
-
|
56
|
-
def write_image(destination_name, format, xfrm)
|
57
|
-
output_io = Hydra::Derivatives::IoDecorator.new(StringIO.new)
|
58
|
-
output_io.mime_type = new_mime_type(format)
|
59
|
-
|
60
|
-
xfrm.write(output_io)
|
61
|
-
output_io.rewind
|
62
|
-
|
63
|
-
output_file_service.call(object, output_io, destination_name)
|
64
|
-
end
|
65
|
-
|
66
|
-
# Override this method if you want a different transformer, or need to load the
|
67
|
-
# raw image from a different source (e.g. external file)
|
68
|
-
def load_image_transformer
|
69
|
-
MiniMagick::Image.read(source_file.content)
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
@@ -1,136 +0,0 @@
|
|
1
|
-
require 'mini_magick'
|
2
|
-
require 'nokogiri'
|
3
|
-
|
4
|
-
|
5
|
-
module Hydra
|
6
|
-
module Derivatives
|
7
|
-
class Jpeg2kImage < Processor
|
8
|
-
include ShellBasedProcessor
|
9
|
-
|
10
|
-
def process
|
11
|
-
image = MiniMagick::Image.read(source_file.content)
|
12
|
-
quality = image['%[channels]'] == 'gray' ? 'gray' : 'color'
|
13
|
-
directives.each do |name, args|
|
14
|
-
long_dim = self.class.long_dim(image)
|
15
|
-
file_path = self.class.tmp_file('.tif')
|
16
|
-
to_srgb = args.fetch(:to_srgb, true)
|
17
|
-
if args[:resize] || to_srgb
|
18
|
-
preprocess(image, resize: args[:resize], to_srgb: to_srgb, src_quality: quality)
|
19
|
-
end
|
20
|
-
image.write file_path
|
21
|
-
recipe = self.class.kdu_compress_recipe(args, quality, long_dim)
|
22
|
-
output_file_name = args[:datastream] || output_file_id(name)
|
23
|
-
encode_file(output_file_name, recipe, file_path: file_path)
|
24
|
-
File.unlink(file_path) unless file_path.nil?
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
def encode_file(destination_name, recipe, opts={})
|
29
|
-
output_file = self.class.tmp_file('.jp2')
|
30
|
-
if opts[:file_path]
|
31
|
-
self.class.encode(opts[:file_path], recipe, output_file)
|
32
|
-
else
|
33
|
-
Hydra::Derivatives::TempfileService.create(source_file) do |f|
|
34
|
-
self.class.encode(f.path, recipe, output_file)
|
35
|
-
end
|
36
|
-
end
|
37
|
-
out_file = Hydra::Derivatives::IoDecorator.new(File.open(output_file, "rb"))
|
38
|
-
out_file.mime_type = "image/jp2"
|
39
|
-
output_file_service.call(object, out_file, destination_name)
|
40
|
-
|
41
|
-
File.unlink(output_file)
|
42
|
-
end
|
43
|
-
|
44
|
-
protected
|
45
|
-
def preprocess(image, opts={})
|
46
|
-
# resize: <geometry>, to_srgb: <bool>, src_quality: 'color'|'gray'
|
47
|
-
image.combine_options do |c|
|
48
|
-
c.resize(opts[:resize]) if opts[:resize]
|
49
|
-
c.profile self.class.srgb_profile_path if opts[:src_quality] == 'color' && opts[:to_srgb]
|
50
|
-
end
|
51
|
-
image
|
52
|
-
end
|
53
|
-
|
54
|
-
def self.encode(path, recipe, output_file)
|
55
|
-
kdu_compress = Hydra::Derivatives.kdu_compress_path
|
56
|
-
execute "#{kdu_compress} -i #{path} -o #{output_file} #{recipe}"
|
57
|
-
end
|
58
|
-
|
59
|
-
def self.srgb_profile_path
|
60
|
-
File.join [
|
61
|
-
File.expand_path('../../../', __FILE__),
|
62
|
-
'color_profiles',
|
63
|
-
'sRGB_IEC61966-2-1_no_black_scaling.icc'
|
64
|
-
]
|
65
|
-
end
|
66
|
-
|
67
|
-
def self.tmp_file(ext)
|
68
|
-
Dir::Tmpname.create(['sufia', ext], Hydra::Derivatives.temp_file_base){}
|
69
|
-
end
|
70
|
-
|
71
|
-
def self.long_dim(image)
|
72
|
-
[image[:width], image[:height]].max
|
73
|
-
end
|
74
|
-
|
75
|
-
def self.kdu_compress_recipe(args, quality, long_dim)
|
76
|
-
if args[:recipe].is_a? Symbol
|
77
|
-
recipe = [args[:recipe].to_s, quality].join('_').to_sym
|
78
|
-
if Hydra::Derivatives.kdu_compress_recipes.has_key? recipe
|
79
|
-
return Hydra::Derivatives.kdu_compress_recipes[recipe]
|
80
|
-
else
|
81
|
-
Logger.warn "No JP2 recipe for :#{args[:recipe].to_s} ('#{recipe}') found in configuration. Using best guess."
|
82
|
-
return Hydra::Derivatives::Jpeg2kImage.calculate_recipe(args,quality,long_dim)
|
83
|
-
end
|
84
|
-
elsif args[:recipe].is_a? String
|
85
|
-
return args[:recipe]
|
86
|
-
else
|
87
|
-
return Hydra::Derivatives::Jpeg2kImage.calculate_recipe(args, quality, long_dim)
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
def self.calculate_recipe(args, quality, long_dim)
|
92
|
-
levels_arg = args.fetch(:levels, Hydra::Derivatives::Jpeg2kImage.level_count_for_size(long_dim))
|
93
|
-
rates_arg = Hydra::Derivatives::Jpeg2kImage.layer_rates(args.fetch(:layers, 8), args.fetch(:compression, 10))
|
94
|
-
tile_size = args.fetch(:tile_size, 1024)
|
95
|
-
tiles_arg = "#{tile_size},#{tile_size}"
|
96
|
-
jp2_space_arg = quality == 'gray' ? 'sLUM' : 'sRGB'
|
97
|
-
|
98
|
-
%Q{-rate #{rates_arg}
|
99
|
-
-jp2_space #{jp2_space_arg}
|
100
|
-
-double_buffering 10
|
101
|
-
-num_threads 4
|
102
|
-
-no_weights
|
103
|
-
Clevels=#{levels_arg}
|
104
|
-
"Stiles={#{tiles_arg}}"
|
105
|
-
"Cblk={64,64}"
|
106
|
-
Cuse_sop=yes
|
107
|
-
Cuse_eph=yes
|
108
|
-
Corder=RPCL
|
109
|
-
ORGgen_plt=yes
|
110
|
-
ORGtparts=R }.gsub(/\s+/, " ").strip
|
111
|
-
end
|
112
|
-
|
113
|
-
def self.level_count_for_size(long_dim)
|
114
|
-
levels = 0
|
115
|
-
level_size = long_dim
|
116
|
-
while level_size >= 96
|
117
|
-
level_size = level_size/2
|
118
|
-
levels+=1
|
119
|
-
end
|
120
|
-
levels-1
|
121
|
-
end
|
122
|
-
|
123
|
-
def self.layer_rates(layer_count,compression_numerator)
|
124
|
-
#e.g. if compression_numerator = 10 then compression is 10:1
|
125
|
-
rates = []
|
126
|
-
cmp = 24.0/compression_numerator
|
127
|
-
layer_count.times do
|
128
|
-
rates << cmp
|
129
|
-
cmp = (cmp/1.618).round(8)
|
130
|
-
end
|
131
|
-
rates.map(&:to_s ).join(',')
|
132
|
-
end
|
133
|
-
|
134
|
-
end
|
135
|
-
end
|
136
|
-
end
|