imgproxy 2.0.1 → 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/.yardopts +8 -0
- data/CHANGELOG.md +74 -0
- data/README.md +176 -133
- data/UPGRADE.md +136 -0
- data/docs/info_options.md +223 -0
- data/docs/processing_options.md +724 -0
- data/docs/yard/fix_pictures.rb +25 -0
- data/docs/yard/github_alerts.rb +16 -0
- data/docs/yard/relative_markdown_links.rb +31 -0
- data/lib/imgproxy/config.rb +96 -41
- data/lib/imgproxy/extensions/active_storage.rb +6 -4
- data/lib/imgproxy/extensions/shrine.rb +6 -4
- data/lib/imgproxy/option_aliases/info.rb +33 -0
- data/lib/imgproxy/option_aliases/processing.rb +74 -0
- data/lib/imgproxy/options_builders/base.rb +54 -0
- data/lib/imgproxy/options_builders/info.rb +52 -0
- data/lib/imgproxy/options_builders/processing.rb +150 -0
- data/lib/imgproxy/options_casters/adjust.rb +3 -1
- data/lib/imgproxy/options_casters/alpha.rb +27 -0
- data/lib/imgproxy/options_casters/array.rb +3 -1
- data/lib/imgproxy/options_casters/autoquality.rb +28 -0
- data/lib/imgproxy/options_casters/average.rb +27 -0
- data/lib/imgproxy/options_casters/background.rb +27 -0
- data/lib/imgproxy/options_casters/base64.rb +2 -0
- data/lib/imgproxy/options_casters/blur_detections.rb +28 -0
- data/lib/imgproxy/options_casters/blurhash.rb +21 -0
- data/lib/imgproxy/options_casters/bool.rb +3 -1
- data/lib/imgproxy/options_casters/crop.rb +3 -1
- data/lib/imgproxy/options_casters/dominant_colors.rb +27 -0
- data/lib/imgproxy/options_casters/draw_detections.rb +28 -0
- data/lib/imgproxy/options_casters/extend.rb +3 -1
- data/lib/imgproxy/options_casters/filename.rb +31 -0
- data/lib/imgproxy/options_casters/float.rb +4 -2
- data/lib/imgproxy/options_casters/format_quality.rb +19 -0
- data/lib/imgproxy/options_casters/gradient.rb +31 -0
- data/lib/imgproxy/options_casters/gravity.rb +20 -6
- data/lib/imgproxy/options_casters/group.rb +2 -0
- data/lib/imgproxy/options_casters/hashsum.rb +24 -0
- data/lib/imgproxy/options_casters/integer.rb +2 -0
- data/lib/imgproxy/options_casters/jpeg_options.rb +3 -1
- data/lib/imgproxy/options_casters/padding.rb +41 -0
- data/lib/imgproxy/options_casters/png_options.rb +3 -1
- data/lib/imgproxy/options_casters/resize.rb +3 -1
- data/lib/imgproxy/options_casters/size.rb +3 -1
- data/lib/imgproxy/options_casters/string.rb +2 -0
- data/lib/imgproxy/options_casters/trim.rb +3 -1
- data/lib/imgproxy/options_casters/unsharp_masking.rb +25 -0
- data/lib/imgproxy/options_casters/video_thumbnail_tile.rb +34 -0
- data/lib/imgproxy/options_casters/watermark.rb +5 -4
- data/lib/imgproxy/options_casters/watermark_size.rb +21 -0
- data/lib/imgproxy/options_casters/{gif_options.rb → webp_options.rb} +6 -5
- data/lib/imgproxy/options_casters/zoom.rb +27 -0
- data/lib/imgproxy/service_config.rb +111 -0
- data/lib/imgproxy/trim_array.rb +2 -0
- data/lib/imgproxy/url_adapters/active_storage.rb +15 -3
- data/lib/imgproxy/url_adapters/shrine.rb +9 -3
- data/lib/imgproxy/url_adapters.rb +3 -0
- data/lib/imgproxy/url_builders/base.rb +184 -0
- data/lib/imgproxy/url_builders/info.rb +44 -0
- data/lib/imgproxy/url_builders/processing.rb +59 -0
- data/lib/imgproxy/version.rb +3 -1
- data/lib/imgproxy.rb +19 -55
- data/logo/logo-dark.svg +22 -0
- data/logo/logo-light.svg +31 -0
- metadata +74 -35
- data/lib/imgproxy/builder.rb +0 -140
- data/lib/imgproxy/options.rb +0 -115
- data/lib/imgproxy/options_aliases.rb +0 -43
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "uri"
|
4
|
+
require "yard"
|
5
|
+
|
6
|
+
module YARD
|
7
|
+
# Add some formatting to the GitHub alert tags since they are not supported
|
8
|
+
# by YARD
|
9
|
+
module GithubAlerts
|
10
|
+
def html_markup_markdown(text)
|
11
|
+
super(text.gsub(/\[!(IMPORTANT|TIP|NOTE)\]/) { "**#{Regexp.last_match(1)}:**" })
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
Templates::Template.extra_includes << GithubAlerts
|
16
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "yard"
|
4
|
+
|
5
|
+
module YARD
|
6
|
+
# Fixes relative links in markdown files.
|
7
|
+
module RelativeMarkdownLinks
|
8
|
+
def resolve_links(text)
|
9
|
+
return super unless options.files
|
10
|
+
|
11
|
+
filenames = options.files.each_with_object({}) do |file, fns|
|
12
|
+
fn = file.filename
|
13
|
+
fns[fn] = fn
|
14
|
+
fns["#{fn.tr(".", "_")}.html"] = fn
|
15
|
+
end
|
16
|
+
|
17
|
+
# puts text
|
18
|
+
|
19
|
+
super(text.gsub(%r{<a href="([^"]+)"[^>]*>([^<]*)</a>}) do |str|
|
20
|
+
href = Regexp.last_match(1)
|
21
|
+
link_text = Regexp.last_match(2)
|
22
|
+
|
23
|
+
next str unless filenames.key?(href)
|
24
|
+
|
25
|
+
"{file:#{filenames[href]} #{link_text}}"
|
26
|
+
end)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
Templates::Template.extra_includes << RelativeMarkdownLinks
|
31
|
+
end
|
data/lib/imgproxy/config.rb
CHANGED
@@ -1,28 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "anyway_config"
|
2
4
|
|
5
|
+
require "imgproxy/service_config"
|
3
6
|
require "imgproxy/url_adapters"
|
4
7
|
|
5
8
|
module Imgproxy
|
6
9
|
# Imgproxy config
|
7
10
|
#
|
8
|
-
# @!attribute endpoint
|
9
|
-
# imgproxy endpoint
|
10
|
-
# @return [String]
|
11
|
-
# @!attribute key
|
12
|
-
# imgproxy hex-encoded signature key
|
13
|
-
# @return [String]
|
14
|
-
# @!attribute salt
|
15
|
-
# imgproxy hex-encoded signature salt
|
16
|
-
# @return [String]
|
17
|
-
# @!attribute raw_key
|
18
|
-
# Decoded signature key
|
19
|
-
# @return [String]
|
20
|
-
# @!attribute raw_salt
|
21
|
-
# Decoded signature salt
|
22
|
-
# @return [String]
|
23
|
-
# @!attribute signature_size
|
24
|
-
# imgproxy signature size. Defaults to 32
|
25
|
-
# @return [String]
|
26
11
|
# @!attribute use_short_options
|
27
12
|
# Use short processing option names (+rs+ for +resize+, +g+ for +gravity+, etc).
|
28
13
|
# Defaults to true
|
@@ -50,12 +35,6 @@ module Imgproxy
|
|
50
35
|
# @see https://github.com/palkan/anyway_config anyway_config
|
51
36
|
class Config < Anyway::Config
|
52
37
|
attr_config(
|
53
|
-
:endpoint,
|
54
|
-
:key,
|
55
|
-
:salt,
|
56
|
-
:raw_key,
|
57
|
-
:raw_salt,
|
58
|
-
signature_size: 32,
|
59
38
|
use_short_options: true,
|
60
39
|
base64_encode_urls: false,
|
61
40
|
always_escape_plain_urls: false,
|
@@ -63,36 +42,112 @@ module Imgproxy
|
|
63
42
|
use_gcs_urls: false,
|
64
43
|
gcs_bucket: nil,
|
65
44
|
shrine_host: nil,
|
45
|
+
services: {},
|
46
|
+
)
|
47
|
+
|
48
|
+
coerce_types(
|
49
|
+
use_short_options: :boolean,
|
50
|
+
base64_encode_urls: :boolean,
|
51
|
+
always_escape_plain_urls: :boolean,
|
52
|
+
use_s3_urls: :boolean,
|
53
|
+
use_gcs_urls: :boolean,
|
54
|
+
gcs_bucket: :string,
|
55
|
+
shrine_host: :string,
|
66
56
|
)
|
67
57
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
58
|
+
def endpoint
|
59
|
+
service(:default).endpoint
|
60
|
+
end
|
61
|
+
|
62
|
+
def endpoint=(value)
|
63
|
+
service(:default).endpoint = value
|
64
|
+
end
|
65
|
+
|
66
|
+
def key
|
67
|
+
service(:default).key
|
68
|
+
end
|
73
69
|
|
74
70
|
def key=(value)
|
75
|
-
|
76
|
-
|
77
|
-
|
71
|
+
service(:default).key = value
|
72
|
+
end
|
73
|
+
|
74
|
+
def raw_key
|
75
|
+
service(:default).raw_key
|
78
76
|
end
|
79
77
|
|
80
78
|
def raw_key=(value)
|
81
|
-
|
82
|
-
|
83
|
-
|
79
|
+
service(:default).raw_key = value
|
80
|
+
end
|
81
|
+
|
82
|
+
def salt
|
83
|
+
service(:default).salt
|
84
84
|
end
|
85
85
|
|
86
86
|
def salt=(value)
|
87
|
-
|
88
|
-
|
89
|
-
|
87
|
+
service(:default).salt = value
|
88
|
+
end
|
89
|
+
|
90
|
+
def raw_salt
|
91
|
+
service(:default).raw_salt
|
90
92
|
end
|
91
93
|
|
92
94
|
def raw_salt=(value)
|
93
|
-
|
94
|
-
|
95
|
-
|
95
|
+
service(:default).raw_salt = value
|
96
|
+
end
|
97
|
+
|
98
|
+
def signature_size
|
99
|
+
service(:default).signature_size
|
100
|
+
end
|
101
|
+
|
102
|
+
def signature_size=(value)
|
103
|
+
service(:default).signature_size = value
|
104
|
+
end
|
105
|
+
|
106
|
+
def source_url_encryption_key
|
107
|
+
service(:default).source_url_encryption_key
|
108
|
+
end
|
109
|
+
|
110
|
+
def source_url_encryption_key=(value)
|
111
|
+
service(:default).source_url_encryption_key = value
|
112
|
+
end
|
113
|
+
|
114
|
+
def raw_source_url_encryption_key
|
115
|
+
service(:default).raw_source_url_encryption_key
|
116
|
+
end
|
117
|
+
|
118
|
+
def raw_source_url_encryption_key=(value)
|
119
|
+
service(:default).raw_source_url_encryption_key = value
|
120
|
+
end
|
121
|
+
|
122
|
+
def always_encrypt_source_urls
|
123
|
+
service(:default).always_encrypt_source_urls
|
124
|
+
end
|
125
|
+
|
126
|
+
def always_encrypt_source_urls=(value)
|
127
|
+
service(:default).always_encrypt_source_urls = value
|
128
|
+
end
|
129
|
+
|
130
|
+
def service(name)
|
131
|
+
services[name.to_sym] ||= services[:default].dup
|
132
|
+
|
133
|
+
yield services[name.to_sym] if block_given?
|
134
|
+
|
135
|
+
services[name.to_sym]
|
136
|
+
end
|
137
|
+
|
138
|
+
def services
|
139
|
+
@services ||= {}.tap do |s|
|
140
|
+
s[:default] = ServiceConfig.new
|
141
|
+
|
142
|
+
super.each do |name, data|
|
143
|
+
config = s[name.to_sym] = s[:default].dup
|
144
|
+
|
145
|
+
data.symbolize_keys.slice(*config.class.config_attributes).each do |key, value|
|
146
|
+
value = config.class.type_caster.coerce(key, value)
|
147
|
+
config.public_send("#{key}=", value)
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
96
151
|
end
|
97
152
|
|
98
153
|
# @deprecated Please use {#key} instead
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Imgproxy
|
2
4
|
module Extensions
|
3
5
|
# Extension for ActiveStorage
|
@@ -6,20 +8,20 @@ module Imgproxy
|
|
6
8
|
# Returns imgproxy URL for an attachment
|
7
9
|
#
|
8
10
|
# @return [String]
|
9
|
-
# @param options [Hash, Imgproxy::
|
11
|
+
# @param options [Hash, Imgproxy::UrlBuilders::Processing]
|
10
12
|
# @see Imgproxy.url_for
|
11
13
|
def imgproxy_url(options = {})
|
12
|
-
return options.url_for(self) if options.is_a?(Imgproxy::
|
14
|
+
return options.url_for(self) if options.is_a?(Imgproxy::UrlBuilders::Processing)
|
13
15
|
Imgproxy.url_for(self, options)
|
14
16
|
end
|
15
17
|
|
16
18
|
# Returns imgproxy info URL for an attachment
|
17
19
|
#
|
18
20
|
# @return [String]
|
19
|
-
# @param options [Hash, Imgproxy::
|
21
|
+
# @param options [Hash, Imgproxy::UrlBuilders::Info]
|
20
22
|
# @see Imgproxy.info_url_for
|
21
23
|
def imgproxy_info_url(options = {})
|
22
|
-
return options.info_url_for(self) if options.is_a?(Imgproxy::
|
24
|
+
return options.info_url_for(self) if options.is_a?(Imgproxy::UrlBuilders::Info)
|
23
25
|
Imgproxy.info_url_for(self, options)
|
24
26
|
end
|
25
27
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Imgproxy
|
2
4
|
module Extensions
|
3
5
|
# Extension for Shrine::UploadedFile
|
@@ -6,20 +8,20 @@ module Imgproxy
|
|
6
8
|
# Returns imgproxy URL for a Shrine::UploadedFile instance
|
7
9
|
#
|
8
10
|
# @return [String]
|
9
|
-
# @param options [Hash, Imgproxy::
|
11
|
+
# @param options [Hash, Imgproxy::UrlBuilders::Processing]
|
10
12
|
# @see Imgproxy.url_for
|
11
13
|
def imgproxy_url(options = {})
|
12
|
-
return options.url_for(self) if options.is_a?(Imgproxy::
|
14
|
+
return options.url_for(self) if options.is_a?(Imgproxy::UrlBuilders::Processing)
|
13
15
|
Imgproxy.url_for(self, options)
|
14
16
|
end
|
15
17
|
|
16
18
|
# Returns imgproxy info URL for a Shrine::UploadedFile instance
|
17
19
|
#
|
18
20
|
# @return [String]
|
19
|
-
# @param options [Hash, Imgproxy::
|
21
|
+
# @param options [Hash, Imgproxy::UrlBuilders::Info]
|
20
22
|
# @see Imgproxy.info_url_for
|
21
23
|
def imgproxy_info_url(options = {})
|
22
|
-
return options.info_url_for(self) if options.is_a?(Imgproxy::
|
24
|
+
return options.info_url_for(self) if options.is_a?(Imgproxy::UrlBuilders::Info)
|
23
25
|
Imgproxy.info_url_for(self, options)
|
24
26
|
end
|
25
27
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Imgproxy
|
4
|
+
module OptionAliases
|
5
|
+
INFO = {
|
6
|
+
size: :s,
|
7
|
+
format: :f,
|
8
|
+
dimensions: :d,
|
9
|
+
video_meta: :vm,
|
10
|
+
detect_objects: :do,
|
11
|
+
colorspace: :cs,
|
12
|
+
bands: :b,
|
13
|
+
sample_format: :sf,
|
14
|
+
pages_number: :pn,
|
15
|
+
alpha: :a,
|
16
|
+
crop: :c,
|
17
|
+
palette: :p,
|
18
|
+
average: :avg,
|
19
|
+
dominant_colors: :dc,
|
20
|
+
blurhash: :bh,
|
21
|
+
calc_hashsum: :chs,
|
22
|
+
page: :pg,
|
23
|
+
video_thumbnail_second: :vts,
|
24
|
+
video_thumbnail_keyframes: :vtk,
|
25
|
+
cachebuster: :cb,
|
26
|
+
expires: :exp,
|
27
|
+
preset: :pr,
|
28
|
+
hashsum: :hs,
|
29
|
+
max_src_resolution: :msr,
|
30
|
+
max_src_file_size: :msfs,
|
31
|
+
}.freeze
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Imgproxy
|
4
|
+
module OptionAliases
|
5
|
+
PROCESSING = {
|
6
|
+
resize: :rs,
|
7
|
+
size: :s,
|
8
|
+
resizing_type: :rt,
|
9
|
+
resizing_algorithm: :ra,
|
10
|
+
width: :w,
|
11
|
+
height: :h,
|
12
|
+
"min-width": :mw,
|
13
|
+
"min-height": :mh,
|
14
|
+
zoom: :z,
|
15
|
+
enlarge: :el,
|
16
|
+
extend: :ex,
|
17
|
+
extend_aspect_ratio: :exar,
|
18
|
+
gravity: :g,
|
19
|
+
crop: :c,
|
20
|
+
trim: :t,
|
21
|
+
padding: :pd,
|
22
|
+
auto_rotate: :ar,
|
23
|
+
rotate: :rot,
|
24
|
+
background: :bg,
|
25
|
+
background_alpha: :bga,
|
26
|
+
adjust: :a,
|
27
|
+
brightness: :br,
|
28
|
+
contrast: :co,
|
29
|
+
saturation: :sa,
|
30
|
+
blur: :bl,
|
31
|
+
sharpen: :sh,
|
32
|
+
pixelate: :pix,
|
33
|
+
unsharp_masking: :ush,
|
34
|
+
blur_detections: :bd,
|
35
|
+
draw_detections: :dd,
|
36
|
+
gradient: :gr,
|
37
|
+
watermark: :wm,
|
38
|
+
watermark_url: :wmu,
|
39
|
+
watermark_text: :wmt,
|
40
|
+
watermark_size: :wms,
|
41
|
+
watermark_shadow: :wmsh,
|
42
|
+
style: :st,
|
43
|
+
strip_metadata: :sm,
|
44
|
+
keep_copyright: :kcr,
|
45
|
+
strip_color_profile: :scp,
|
46
|
+
enforce_thumbnail: :eth,
|
47
|
+
quality: :q,
|
48
|
+
format_quality: :fq,
|
49
|
+
autoquality: :aq,
|
50
|
+
max_bytes: :mb,
|
51
|
+
jpeg_options: :jpego,
|
52
|
+
png_options: :pngo,
|
53
|
+
webp_options: :webpo,
|
54
|
+
page: :pg,
|
55
|
+
pages: :pgs,
|
56
|
+
disable_animation: :da,
|
57
|
+
video_thumbnail_second: :vts,
|
58
|
+
video_thumbnail_keyframes: :vtk,
|
59
|
+
video_thumbnail_tile: :vtt,
|
60
|
+
fallback_image_url: :fiu,
|
61
|
+
skip_processing: :skp,
|
62
|
+
cachebuster: :cb,
|
63
|
+
expires: :exp,
|
64
|
+
filename: :fn,
|
65
|
+
return_attachment: :att,
|
66
|
+
preset: :pr,
|
67
|
+
hashsum: :hs,
|
68
|
+
max_src_resolution: :msr,
|
69
|
+
max_src_file_size: :msfs,
|
70
|
+
max_animation_frames: :maf,
|
71
|
+
max_animation_frame_resolution: :mafr,
|
72
|
+
}.freeze
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "imgproxy/trim_array"
|
4
|
+
|
5
|
+
module Imgproxy
|
6
|
+
module OptionsBuilders
|
7
|
+
# Formats and regroups URL options
|
8
|
+
class Base < Hash
|
9
|
+
using TrimArray
|
10
|
+
|
11
|
+
# Hash of options casters. Redefine this in subclases
|
12
|
+
CASTERS = {}.freeze
|
13
|
+
# Array of meta-options names. Redefine this in subclases
|
14
|
+
META = [].freeze
|
15
|
+
|
16
|
+
# @param options [Hash] raw options
|
17
|
+
def initialize(options)
|
18
|
+
super()
|
19
|
+
|
20
|
+
# Options order hack: initialize known and meta options with nil value to preserve order
|
21
|
+
self.class::CASTERS.each_key do |n|
|
22
|
+
self[n] = nil if options.key?(n) || self.class::META.include?(n)
|
23
|
+
end
|
24
|
+
|
25
|
+
options.each do |name, value|
|
26
|
+
caster = self.class::CASTERS[name]
|
27
|
+
self[name] = caster ? caster.cast(value) : unwrap_hash(value)
|
28
|
+
end
|
29
|
+
|
30
|
+
group_opts
|
31
|
+
|
32
|
+
compact!
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def unwrap_hash(raw)
|
38
|
+
return raw unless raw.is_a?(Hash)
|
39
|
+
|
40
|
+
raw.flat_map do |_key, val|
|
41
|
+
unwrap_hash(val)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def group_opts
|
46
|
+
# Do nothing in the base class. Can be redefined in subclasses
|
47
|
+
end
|
48
|
+
|
49
|
+
def extract_and_trim_nils(*keys)
|
50
|
+
keys.map { |k| delete(k) }.trim!
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "imgproxy/options_builders/base"
|
4
|
+
|
5
|
+
require "imgproxy/options_casters/string"
|
6
|
+
require "imgproxy/options_casters/integer"
|
7
|
+
require "imgproxy/options_casters/float"
|
8
|
+
require "imgproxy/options_casters/bool"
|
9
|
+
require "imgproxy/options_casters/array"
|
10
|
+
require "imgproxy/options_casters/alpha"
|
11
|
+
require "imgproxy/options_casters/crop"
|
12
|
+
require "imgproxy/options_casters/average"
|
13
|
+
require "imgproxy/options_casters/dominant_colors"
|
14
|
+
require "imgproxy/options_casters/blurhash"
|
15
|
+
require "imgproxy/options_casters/hashsum"
|
16
|
+
|
17
|
+
module Imgproxy
|
18
|
+
module OptionsBuilders
|
19
|
+
# Formats and regroups info options
|
20
|
+
class Info < Base
|
21
|
+
CASTERS = {
|
22
|
+
size: Imgproxy::OptionsCasters::Bool,
|
23
|
+
format: Imgproxy::OptionsCasters::Bool,
|
24
|
+
dimensions: Imgproxy::OptionsCasters::Bool,
|
25
|
+
exif: Imgproxy::OptionsCasters::Bool,
|
26
|
+
iptc: Imgproxy::OptionsCasters::Bool,
|
27
|
+
video_meta: Imgproxy::OptionsCasters::Bool,
|
28
|
+
detect_objects: Imgproxy::OptionsCasters::Bool,
|
29
|
+
colorspace: Imgproxy::OptionsCasters::Bool,
|
30
|
+
bands: Imgproxy::OptionsCasters::Bool,
|
31
|
+
sample_format: Imgproxy::OptionsCasters::Bool,
|
32
|
+
pages_number: Imgproxy::OptionsCasters::Bool,
|
33
|
+
alpha: Imgproxy::OptionsCasters::Alpha,
|
34
|
+
crop: Imgproxy::OptionsCasters::Crop,
|
35
|
+
palette: Imgproxy::OptionsCasters::Integer,
|
36
|
+
average: Imgproxy::OptionsCasters::Average,
|
37
|
+
dominant_colors: Imgproxy::OptionsCasters::DominantColors,
|
38
|
+
blurhash: Imgproxy::OptionsCasters::Blurhash,
|
39
|
+
calc_hashsum: Imgproxy::OptionsCasters::Array,
|
40
|
+
page: Imgproxy::OptionsCasters::Integer,
|
41
|
+
video_thumbnail_second: Imgproxy::OptionsCasters::Integer,
|
42
|
+
video_thumbnail_keyframes: Imgproxy::OptionsCasters::Bool,
|
43
|
+
cachebuster: Imgproxy::OptionsCasters::String,
|
44
|
+
expires: Imgproxy::OptionsCasters::Integer,
|
45
|
+
preset: Imgproxy::OptionsCasters::Array,
|
46
|
+
hashsum: Imgproxy::OptionsCasters::Hashsum,
|
47
|
+
max_src_resolution: Imgproxy::OptionsCasters::Float,
|
48
|
+
max_src_file_size: Imgproxy::OptionsCasters::Integer,
|
49
|
+
}.freeze
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,150 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "imgproxy/options_builders/base"
|
4
|
+
|
5
|
+
require "imgproxy/options_casters/string"
|
6
|
+
require "imgproxy/options_casters/integer"
|
7
|
+
require "imgproxy/options_casters/float"
|
8
|
+
require "imgproxy/options_casters/bool"
|
9
|
+
require "imgproxy/options_casters/array"
|
10
|
+
require "imgproxy/options_casters/base64"
|
11
|
+
require "imgproxy/options_casters/resize"
|
12
|
+
require "imgproxy/options_casters/size"
|
13
|
+
require "imgproxy/options_casters/zoom"
|
14
|
+
require "imgproxy/options_casters/extend"
|
15
|
+
require "imgproxy/options_casters/gravity"
|
16
|
+
require "imgproxy/options_casters/crop"
|
17
|
+
require "imgproxy/options_casters/trim"
|
18
|
+
require "imgproxy/options_casters/padding"
|
19
|
+
require "imgproxy/options_casters/background"
|
20
|
+
require "imgproxy/options_casters/adjust"
|
21
|
+
require "imgproxy/options_casters/unsharp_masking"
|
22
|
+
require "imgproxy/options_casters/blur_detections"
|
23
|
+
require "imgproxy/options_casters/draw_detections"
|
24
|
+
require "imgproxy/options_casters/gradient"
|
25
|
+
require "imgproxy/options_casters/watermark"
|
26
|
+
require "imgproxy/options_casters/watermark_size"
|
27
|
+
require "imgproxy/options_casters/format_quality"
|
28
|
+
require "imgproxy/options_casters/autoquality"
|
29
|
+
require "imgproxy/options_casters/jpeg_options"
|
30
|
+
require "imgproxy/options_casters/png_options"
|
31
|
+
require "imgproxy/options_casters/webp_options"
|
32
|
+
require "imgproxy/options_casters/video_thumbnail_tile"
|
33
|
+
require "imgproxy/options_casters/filename"
|
34
|
+
require "imgproxy/options_casters/hashsum"
|
35
|
+
|
36
|
+
module Imgproxy
|
37
|
+
module OptionsBuilders
|
38
|
+
# Formats and regroups processing options
|
39
|
+
class Processing < Base
|
40
|
+
CASTERS = {
|
41
|
+
resize: Imgproxy::OptionsCasters::Resize,
|
42
|
+
size: Imgproxy::OptionsCasters::Size,
|
43
|
+
resizing_type: Imgproxy::OptionsCasters::String,
|
44
|
+
resizing_algorithm: Imgproxy::OptionsCasters::String,
|
45
|
+
width: Imgproxy::OptionsCasters::Integer,
|
46
|
+
height: Imgproxy::OptionsCasters::Integer,
|
47
|
+
"min-width": Imgproxy::OptionsCasters::Integer,
|
48
|
+
"min-height": Imgproxy::OptionsCasters::Integer,
|
49
|
+
zoom: Imgproxy::OptionsCasters::Zoom,
|
50
|
+
dpr: Imgproxy::OptionsCasters::Float,
|
51
|
+
enlarge: Imgproxy::OptionsCasters::Bool,
|
52
|
+
extend: Imgproxy::OptionsCasters::Extend,
|
53
|
+
extend_aspect_ratio: Imgproxy::OptionsCasters::Extend,
|
54
|
+
gravity: Imgproxy::OptionsCasters::Gravity,
|
55
|
+
crop: Imgproxy::OptionsCasters::Crop,
|
56
|
+
trim: Imgproxy::OptionsCasters::Trim,
|
57
|
+
padding: Imgproxy::OptionsCasters::Padding,
|
58
|
+
auto_rotate: Imgproxy::OptionsCasters::Bool,
|
59
|
+
rotate: Imgproxy::OptionsCasters::Integer,
|
60
|
+
background: Imgproxy::OptionsCasters::Background,
|
61
|
+
background_alpha: Imgproxy::OptionsCasters::Float,
|
62
|
+
adjust: Imgproxy::OptionsCasters::Adjust,
|
63
|
+
brightness: Imgproxy::OptionsCasters::Integer,
|
64
|
+
contrast: Imgproxy::OptionsCasters::Float,
|
65
|
+
saturation: Imgproxy::OptionsCasters::Float,
|
66
|
+
blur: Imgproxy::OptionsCasters::Float,
|
67
|
+
sharpen: Imgproxy::OptionsCasters::Float,
|
68
|
+
pixelate: Imgproxy::OptionsCasters::Integer,
|
69
|
+
unsharp_masking: Imgproxy::OptionsCasters::UnsharpMasking,
|
70
|
+
blur_detections: Imgproxy::OptionsCasters::BlurDetections,
|
71
|
+
draw_detections: Imgproxy::OptionsCasters::DrawDetections,
|
72
|
+
gradient: Imgproxy::OptionsCasters::Gradient,
|
73
|
+
watermark: Imgproxy::OptionsCasters::Watermark,
|
74
|
+
watermark_url: Imgproxy::OptionsCasters::Base64,
|
75
|
+
watermark_text: Imgproxy::OptionsCasters::Base64,
|
76
|
+
watermark_size: Imgproxy::OptionsCasters::WatermarkSize,
|
77
|
+
watermark_shadow: Imgproxy::OptionsCasters::Float,
|
78
|
+
style: Imgproxy::OptionsCasters::Base64,
|
79
|
+
strip_metadata: Imgproxy::OptionsCasters::Bool,
|
80
|
+
keep_copyright: Imgproxy::OptionsCasters::Bool,
|
81
|
+
dpi: Imgproxy::OptionsCasters::Float,
|
82
|
+
strip_color_profile: Imgproxy::OptionsCasters::Bool,
|
83
|
+
enforce_thumbnail: Imgproxy::OptionsCasters::Bool,
|
84
|
+
quality: Imgproxy::OptionsCasters::Integer,
|
85
|
+
format_quality: Imgproxy::OptionsCasters::FormatQuality,
|
86
|
+
autoquality: Imgproxy::OptionsCasters::Autoquality,
|
87
|
+
max_bytes: Imgproxy::OptionsCasters::Integer,
|
88
|
+
jpeg_options: Imgproxy::OptionsCasters::JpegOptions,
|
89
|
+
png_options: Imgproxy::OptionsCasters::PngOptions,
|
90
|
+
webp_options: Imgproxy::OptionsCasters::WebpOptions,
|
91
|
+
format: Imgproxy::OptionsCasters::String,
|
92
|
+
page: Imgproxy::OptionsCasters::Integer,
|
93
|
+
pages: Imgproxy::OptionsCasters::Integer,
|
94
|
+
disable_animation: Imgproxy::OptionsCasters::Bool,
|
95
|
+
video_thumbnail_second: Imgproxy::OptionsCasters::Integer,
|
96
|
+
video_thumbnail_keyframes: Imgproxy::OptionsCasters::Bool,
|
97
|
+
video_thumbnail_tile: Imgproxy::OptionsCasters::VideoThumbnailTile,
|
98
|
+
fallback_image_url: Imgproxy::OptionsCasters::Base64,
|
99
|
+
skip_processing: Imgproxy::OptionsCasters::Array,
|
100
|
+
raw: Imgproxy::OptionsCasters::Bool,
|
101
|
+
cachebuster: Imgproxy::OptionsCasters::String,
|
102
|
+
expires: Imgproxy::OptionsCasters::Integer,
|
103
|
+
filename: Imgproxy::OptionsCasters::Filename,
|
104
|
+
return_attachment: Imgproxy::OptionsCasters::Bool,
|
105
|
+
preset: Imgproxy::OptionsCasters::Array,
|
106
|
+
hashsum: Imgproxy::OptionsCasters::Hashsum,
|
107
|
+
max_src_resolution: Imgproxy::OptionsCasters::Float,
|
108
|
+
max_src_file_size: Imgproxy::OptionsCasters::Integer,
|
109
|
+
max_animation_frames: Imgproxy::OptionsCasters::Integer,
|
110
|
+
max_animation_frame_resolution: Imgproxy::OptionsCasters::Float,
|
111
|
+
}.freeze
|
112
|
+
|
113
|
+
META = %i[size resize adjust].freeze
|
114
|
+
|
115
|
+
def initialize(options)
|
116
|
+
super
|
117
|
+
|
118
|
+
# Legacy name for unsharp_masking
|
119
|
+
if options.key?(:unsharpening)
|
120
|
+
warn "[DEPRECATION] `unsharpening` option is deprecated. Please use `unsharp_masking` instead."
|
121
|
+
delete(:unsharpening)
|
122
|
+
unless key?(:unsharp_masking)
|
123
|
+
self[:unsharp_masking] = CASTERS[:unsharp_masking].cast(options[:unsharpening])
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
private
|
129
|
+
|
130
|
+
def group_opts
|
131
|
+
group_resizing_opts
|
132
|
+
group_adjust_opts
|
133
|
+
end
|
134
|
+
|
135
|
+
def group_resizing_opts
|
136
|
+
return unless self[:width] && self[:height] && !self[:size] && !self[:resize]
|
137
|
+
|
138
|
+
self[:size] = extract_and_trim_nils(:width, :height, :enlarge, :extend)
|
139
|
+
self[:resize] = [delete(:resizing_type), *delete(:size)] if self[:resizing_type]
|
140
|
+
end
|
141
|
+
|
142
|
+
def group_adjust_opts
|
143
|
+
return if self[:adjust]
|
144
|
+
return unless values_at(:brightness, :contrast, :saturation).count { |o| o } > 1
|
145
|
+
|
146
|
+
self[:adjust] = extract_and_trim_nils(:brightness, :contrast, :saturation)
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
@@ -1,10 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "imgproxy/options_casters/group"
|
2
4
|
require "imgproxy/options_casters/integer"
|
3
5
|
require "imgproxy/options_casters/float"
|
4
6
|
|
5
7
|
module Imgproxy
|
6
8
|
module OptionsCasters
|
7
|
-
# Casts
|
9
|
+
# Casts `adjust` processing option
|
8
10
|
module Adjust
|
9
11
|
CASTER = Imgproxy::OptionsCasters::Group.new(
|
10
12
|
brightness: Imgproxy::OptionsCasters::Integer,
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "imgproxy/options_casters/group"
|
4
|
+
require "imgproxy/options_casters/bool"
|
5
|
+
|
6
|
+
module Imgproxy
|
7
|
+
module OptionsCasters
|
8
|
+
# Casts `alpha` info option
|
9
|
+
module Alpha
|
10
|
+
CASTER = Imgproxy::OptionsCasters::Group.new(
|
11
|
+
alpha: Imgproxy::OptionsCasters::Bool,
|
12
|
+
check_transparency: Imgproxy::OptionsCasters::Bool,
|
13
|
+
).freeze
|
14
|
+
|
15
|
+
def self.cast(raw)
|
16
|
+
# Allow alpha to be just a boolean
|
17
|
+
return Imgproxy::OptionsCasters::Bool.cast(raw) if [true, false].include?(raw)
|
18
|
+
|
19
|
+
return raw unless raw.is_a?(Hash)
|
20
|
+
return if raw[:alpha].nil?
|
21
|
+
|
22
|
+
values = CASTER.cast(raw)
|
23
|
+
values[0].zero? ? 0 : values
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|