hydra-derivatives 4.0.0 → 4.1.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/.circleci/config.yml +1 -1
- data/.rubocop_todo.yml +1 -0
- data/Dockerfile +8 -4
- data/README.md +10 -2
- data/VERSION +1 -1
- data/hydra-derivatives.gemspec +3 -2
- data/lib/hydra/derivatives/processors/image.rb +57 -6
- data/lib/hydra/derivatives/services/image_service.rb +4 -1
- metadata +21 -7
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: d57cbceda9c0d06164a39a9d02c08f87d3595d2c7e4b651c45febd2b1f170304
|
|
4
|
+
data.tar.gz: 335f28d6f50ca793f9209cc0d178333958fe0900885dd60db887ee1d7967da39
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 6f9a349b34da727f960c055363c6c49d82d1606e2f5679bf75c6c5d476493cc966f6257e74c171736e0ecacf28a8d997e20381b098844380d7a6deed24db54e9
|
|
7
|
+
data.tar.gz: 54834ba67208b3345c030b068ebe67c6b831e3541d9632973c91930c5b27a6e9025ca009fca5abec3313692062c0928131bcfbf1f924afd0345f20cbec739767
|
data/.circleci/config.yml
CHANGED
|
@@ -29,7 +29,7 @@ jobs:
|
|
|
29
29
|
command: |
|
|
30
30
|
wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
|
|
31
31
|
sudo apt-get update
|
|
32
|
-
sudo apt-get install ghostscript libpng-dev imagemagick graphicsmagick ffmpeg libreoffice dcraw
|
|
32
|
+
sudo apt-get install ghostscript libpng-dev imagemagick graphicsmagick libvips libvips-dev libvips-tools ffmpeg libreoffice dcraw
|
|
33
33
|
- restore_cache:
|
|
34
34
|
name: Restore Kakadu Cache
|
|
35
35
|
keys:
|
data/.rubocop_todo.yml
CHANGED
data/Dockerfile
CHANGED
|
@@ -7,6 +7,9 @@ RUN apt update && apt -y install \
|
|
|
7
7
|
zip \
|
|
8
8
|
ghostscript \
|
|
9
9
|
libpng-dev \
|
|
10
|
+
libvips \
|
|
11
|
+
libvips-dev \
|
|
12
|
+
libvips-tools \
|
|
10
13
|
graphicsmagick \
|
|
11
14
|
ffmpeg \
|
|
12
15
|
libreoffice \
|
|
@@ -14,10 +17,11 @@ RUN apt update && apt -y install \
|
|
|
14
17
|
dcraw \
|
|
15
18
|
libyaml-dev
|
|
16
19
|
|
|
17
|
-
|
|
18
|
-
RUN
|
|
19
|
-
|
|
20
|
-
|
|
20
|
+
ARG KAKADU_ZIP
|
|
21
|
+
RUN mkdir -p /opt/kakadu
|
|
22
|
+
COPY $KAKADU_ZIP.zip /opt/kakadu/downloads/kakadu.zip
|
|
23
|
+
RUN unzip /opt/kakadu/downloads/kakadu.zip \
|
|
24
|
+
&& mv $KAKADU_ZIP kakadu \
|
|
21
25
|
&& cp kakadu/*.so /usr/lib \
|
|
22
26
|
&& cp kakadu/* /usr/bin
|
|
23
27
|
|
data/README.md
CHANGED
|
@@ -257,10 +257,18 @@ If you don't want to run the whole suite all at once like CI, do the following:
|
|
|
257
257
|
|
|
258
258
|
First, make sure you have installed [Docker](https://www.docker.com/).
|
|
259
259
|
|
|
260
|
-
|
|
260
|
+
Download the most recent version of the Linux Kakadu demo from [the downloads page](https://kakadusoftware.com/documentation-downloads/downloads/)
|
|
261
|
+
and place it in your cloned repository. (This requires signing up with an email address.)
|
|
262
|
+
|
|
263
|
+
Note the name of the zip file without the .zip extension. We will pass this name as an argument when building
|
|
264
|
+
the docker container. For example, if the name of the zip file is `KDU841_Demo_Apps_for_Linux-x86-64_231117.zip`,
|
|
265
|
+
we will pass `KDU841_Demo_Apps_for_Linux-x86-64_231117` to `docker compose build`.
|
|
266
|
+
|
|
267
|
+
Within your cloned repository, tell Docker to get started installing your development environment, replacing
|
|
268
|
+
`<name of zip file>` with the name of your downloaded file above.
|
|
261
269
|
|
|
262
270
|
```sh
|
|
263
|
-
docker compose build
|
|
271
|
+
docker compose build --build-arg KAKADU_ZIP=<name of zip file>
|
|
264
272
|
docker compose up
|
|
265
273
|
```
|
|
266
274
|
|
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
4.
|
|
1
|
+
4.1.0
|
data/hydra-derivatives.gemspec
CHANGED
|
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
|
|
|
18
18
|
spec.add_development_dependency 'bundler', '~> 2.1'
|
|
19
19
|
spec.add_development_dependency 'fcrepo_wrapper', '~> 0.2'
|
|
20
20
|
spec.add_development_dependency 'pry-byebug'
|
|
21
|
-
spec.add_development_dependency 'rails', '> 5.1', '<
|
|
21
|
+
spec.add_development_dependency 'rails', '> 5.1', '< 9.0'
|
|
22
22
|
spec.add_development_dependency 'rake'
|
|
23
23
|
spec.add_development_dependency 'rspec', '~> 3.1'
|
|
24
24
|
spec.add_development_dependency "solr_wrapper"
|
|
@@ -26,9 +26,10 @@ Gem::Specification.new do |spec|
|
|
|
26
26
|
spec.add_dependency 'active_encode', '~> 1.2'
|
|
27
27
|
spec.add_dependency 'active-fedora', '>= 14.0'
|
|
28
28
|
spec.add_dependency 'active-triples', '>= 1.2'
|
|
29
|
-
spec.add_dependency 'activesupport', '>= 4.0', '<
|
|
29
|
+
spec.add_dependency 'activesupport', '>= 4.0', '< 9.0'
|
|
30
30
|
spec.add_dependency 'addressable', '~> 2.5'
|
|
31
31
|
spec.add_dependency 'deprecation'
|
|
32
32
|
spec.add_dependency 'mime-types', '> 2.0', '< 4.0'
|
|
33
33
|
spec.add_dependency 'mini_magick', '>= 3.2', '< 5'
|
|
34
|
+
spec.add_dependency 'ruby-vips'
|
|
34
35
|
end
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
require 'mini_magick'
|
|
3
|
+
require 'ruby-vips'
|
|
3
4
|
|
|
4
5
|
module Hydra::Derivatives::Processors
|
|
5
6
|
class Image < Processor
|
|
@@ -22,6 +23,8 @@ module Hydra::Derivatives::Processors
|
|
|
22
23
|
def create_resized_image
|
|
23
24
|
if Hydra::Derivatives::ImageService.processor == :graphicsmagick
|
|
24
25
|
create_resized_image_with_graphicsmagick
|
|
26
|
+
elsif Hydra::Derivatives::ImageService.processor == :libvips
|
|
27
|
+
create_resized_image_with_libvips
|
|
25
28
|
else
|
|
26
29
|
create_resized_image_with_imagemagick
|
|
27
30
|
end
|
|
@@ -52,12 +55,38 @@ module Hydra::Derivatives::Processors
|
|
|
52
55
|
end
|
|
53
56
|
end
|
|
54
57
|
|
|
58
|
+
# rubocop:disable Metrics/MethodLength
|
|
59
|
+
def create_resized_image_with_libvips
|
|
60
|
+
Hydra::Derivatives::Logger.debug('[ImageProcessor] Using libvips resize method')
|
|
61
|
+
create_image do |temp_file|
|
|
62
|
+
if size
|
|
63
|
+
width, height, option = size.match(/(\d+)x(\d+)(.)?/).captures
|
|
64
|
+
# Translate imagemagick resize syntax into ruby-vips
|
|
65
|
+
size_option = case option
|
|
66
|
+
when '>'
|
|
67
|
+
:down
|
|
68
|
+
when '<'
|
|
69
|
+
:up
|
|
70
|
+
when '!'
|
|
71
|
+
:force
|
|
72
|
+
end
|
|
73
|
+
temp_file.thumbnail_image(width.to_i, height: height.to_i, size: size_option)
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
# rubocop:enable Metrics/MethodLength
|
|
78
|
+
|
|
55
79
|
def create_image
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
80
|
+
if Hydra::Derivatives::ImageService.processor == :libvips
|
|
81
|
+
image = block_given? ? yield(load_image_transformer) : load_image_transformer
|
|
82
|
+
write_image_with_vips(image, directives)
|
|
83
|
+
else
|
|
84
|
+
xfrm = selected_layers(load_image_transformer)
|
|
85
|
+
yield(xfrm) if block_given?
|
|
86
|
+
xfrm.format(directives.fetch(:format))
|
|
87
|
+
xfrm.quality(quality.to_s) if quality
|
|
88
|
+
write_image(xfrm)
|
|
89
|
+
end
|
|
61
90
|
end
|
|
62
91
|
|
|
63
92
|
def write_image(xfrm)
|
|
@@ -67,10 +96,24 @@ module Hydra::Derivatives::Processors
|
|
|
67
96
|
output_file_service.call(output_io, directives)
|
|
68
97
|
end
|
|
69
98
|
|
|
99
|
+
def write_image_with_vips(image, directives)
|
|
100
|
+
output_io = StringIO.new
|
|
101
|
+
format = directives.fetch(:format, "jpg")
|
|
102
|
+
format_string = ".#{format}#{"[Q=#{quality}]" if quality}"
|
|
103
|
+
output_io.write(image.write_to_buffer(format_string))
|
|
104
|
+
output_io.rewind
|
|
105
|
+
output_file_service.call(output_io, directives)
|
|
106
|
+
end
|
|
107
|
+
|
|
70
108
|
# Override this method if you want a different transformer, or need to load the
|
|
71
109
|
# raw image from a different source (e.g. external file)
|
|
72
110
|
def load_image_transformer
|
|
73
|
-
|
|
111
|
+
if Hydra::Derivatives::ImageService.processor == :libvips
|
|
112
|
+
# Vips specifies pdf layers at load time
|
|
113
|
+
selected_vips_layers(source_path)
|
|
114
|
+
else
|
|
115
|
+
MiniMagick::Image.open(source_path)
|
|
116
|
+
end
|
|
74
117
|
end
|
|
75
118
|
|
|
76
119
|
private
|
|
@@ -92,5 +135,13 @@ module Hydra::Derivatives::Processors
|
|
|
92
135
|
image
|
|
93
136
|
end
|
|
94
137
|
end
|
|
138
|
+
|
|
139
|
+
def selected_vips_layers(source_path)
|
|
140
|
+
if `vipsheader #{Shellwords.escape(source_path)}` =~ /pdfload/i && directives.fetch(:layer, false)
|
|
141
|
+
Vips::Image.new_from_file(source_path, page: directives.fetch(:layer))
|
|
142
|
+
else
|
|
143
|
+
Vips::Image.new_from_file(source_path)
|
|
144
|
+
end
|
|
145
|
+
end
|
|
95
146
|
end
|
|
96
147
|
end
|
|
@@ -13,8 +13,11 @@ module Hydra::Derivatives
|
|
|
13
13
|
when 'graphicsmagick'
|
|
14
14
|
Hydra::Derivatives::Logger.debug('[ImageProcessor] Using GraphicsMagick as image processor')
|
|
15
15
|
:graphicsmagick
|
|
16
|
+
when 'libvips'
|
|
17
|
+
Hydra::Derivatives::Logger.debug('[ImageProcessor] Using libvips as image processor')
|
|
18
|
+
:libvips
|
|
16
19
|
else
|
|
17
|
-
Hydra::Derivatives::Logger.debug("[ImageProcessor] The environment variable IMAGE_PROCESSOR should be set to
|
|
20
|
+
Hydra::Derivatives::Logger.debug("[ImageProcessor] The environment variable IMAGE_PROCESSOR should be set to 'imagemagick','graphicsmagick' or 'libvips'. It is currently set to: #{ENV['IMAGE_PROCESSOR']}. Defaulting to using #{default_processor}")
|
|
18
21
|
default_processor
|
|
19
22
|
end
|
|
20
23
|
end
|
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.
|
|
4
|
+
version: 4.1.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:
|
|
11
|
+
date: 2025-12-01 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
@@ -61,7 +61,7 @@ dependencies:
|
|
|
61
61
|
version: '5.1'
|
|
62
62
|
- - "<"
|
|
63
63
|
- !ruby/object:Gem::Version
|
|
64
|
-
version: '
|
|
64
|
+
version: '9.0'
|
|
65
65
|
type: :development
|
|
66
66
|
prerelease: false
|
|
67
67
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -71,7 +71,7 @@ dependencies:
|
|
|
71
71
|
version: '5.1'
|
|
72
72
|
- - "<"
|
|
73
73
|
- !ruby/object:Gem::Version
|
|
74
|
-
version: '
|
|
74
|
+
version: '9.0'
|
|
75
75
|
- !ruby/object:Gem::Dependency
|
|
76
76
|
name: rake
|
|
77
77
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -165,7 +165,7 @@ dependencies:
|
|
|
165
165
|
version: '4.0'
|
|
166
166
|
- - "<"
|
|
167
167
|
- !ruby/object:Gem::Version
|
|
168
|
-
version: '
|
|
168
|
+
version: '9.0'
|
|
169
169
|
type: :runtime
|
|
170
170
|
prerelease: false
|
|
171
171
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -175,7 +175,7 @@ dependencies:
|
|
|
175
175
|
version: '4.0'
|
|
176
176
|
- - "<"
|
|
177
177
|
- !ruby/object:Gem::Version
|
|
178
|
-
version: '
|
|
178
|
+
version: '9.0'
|
|
179
179
|
- !ruby/object:Gem::Dependency
|
|
180
180
|
name: addressable
|
|
181
181
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -244,6 +244,20 @@ dependencies:
|
|
|
244
244
|
- - "<"
|
|
245
245
|
- !ruby/object:Gem::Version
|
|
246
246
|
version: '5'
|
|
247
|
+
- !ruby/object:Gem::Dependency
|
|
248
|
+
name: ruby-vips
|
|
249
|
+
requirement: !ruby/object:Gem::Requirement
|
|
250
|
+
requirements:
|
|
251
|
+
- - ">="
|
|
252
|
+
- !ruby/object:Gem::Version
|
|
253
|
+
version: '0'
|
|
254
|
+
type: :runtime
|
|
255
|
+
prerelease: false
|
|
256
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
257
|
+
requirements:
|
|
258
|
+
- - ">="
|
|
259
|
+
- !ruby/object:Gem::Version
|
|
260
|
+
version: '0'
|
|
247
261
|
description: Derivative generation plugin for hydra
|
|
248
262
|
email:
|
|
249
263
|
- jenlindner@gmail.com
|
|
@@ -352,7 +366,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
352
366
|
- !ruby/object:Gem::Version
|
|
353
367
|
version: '0'
|
|
354
368
|
requirements: []
|
|
355
|
-
rubygems_version: 3.5.
|
|
369
|
+
rubygems_version: 3.5.22
|
|
356
370
|
signing_key:
|
|
357
371
|
specification_version: 4
|
|
358
372
|
summary: Derivative generation plugin for hydra
|