ires 1.0.0 → 1.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/ext/ires/image.go +64 -44
- data/ext/ires/ires.go +32 -19
- data/ext/ires/uri.go +20 -12
- data/ext/main.go +10 -3
- data/lib/ires/version.rb +1 -1
- data/shared/darwin/ires.so +0 -0
- data/shared/linux/ires.so +0 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 33c82f6045075a2fdb97d1ad5dc19194b899792d
|
4
|
+
data.tar.gz: 3152843aadd1e7fff8882e64b62f9f9a730bcc29
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8581fcad0dab4c6a373104b5eb06eb017b8dad2bd8e6f420cbfb045e4c611fe148412fdb583df0d534d0f16e05ceebda06eeb758c6021228695f2dd313f3590d
|
7
|
+
data.tar.gz: 377f504cbe190e9f5df79e6dfc7ffc6b1f29d02060afd3df70e6596cea9be3d8f013ad6928cdd9abad17d4f825825a814e9d6966d59d30ccd24c2d3695feddd9
|
data/ext/ires/image.go
CHANGED
@@ -19,21 +19,30 @@ import (
|
|
19
19
|
)
|
20
20
|
|
21
21
|
// Check expiration date
|
22
|
-
func (i *Ires) DeleteExpireImage() {
|
22
|
+
func (i *Ires) DeleteExpireImage() error {
|
23
23
|
today := time.Now().Format("20060102")
|
24
|
-
dir := i.readImageDir()
|
24
|
+
dir, err := i.readImageDir()
|
25
|
+
if err != nil {
|
26
|
+
return err
|
27
|
+
}
|
25
28
|
files, err := ioutil.ReadDir(dir)
|
26
29
|
if err != nil {
|
27
|
-
return
|
30
|
+
return err
|
28
31
|
}
|
29
32
|
|
30
33
|
for _, file := range files {
|
31
34
|
findName := file.Name()
|
32
|
-
matched,
|
35
|
+
matched, err := path.Match(today+"_*", findName)
|
36
|
+
if err != nil {
|
37
|
+
return err
|
38
|
+
}
|
33
39
|
if matched {
|
34
|
-
deleteImage(path.Join(dir, findName))
|
40
|
+
if err := deleteImage(path.Join(dir, findName)); err != nil {
|
41
|
+
return err
|
42
|
+
}
|
35
43
|
}
|
36
44
|
}
|
45
|
+
return nil
|
37
46
|
}
|
38
47
|
|
39
48
|
// Input image type is Local or HTTP
|
@@ -46,7 +55,7 @@ func (i *Ires) CheckLocal() {
|
|
46
55
|
}
|
47
56
|
|
48
57
|
// Input image
|
49
|
-
func (i *Ires) inputImage()
|
58
|
+
func (i *Ires) inputImage() error {
|
50
59
|
if i.IsLocal {
|
51
60
|
img, format := localImage(i.URI)
|
52
61
|
i.InputImage = &InputImage{
|
@@ -55,45 +64,53 @@ func (i *Ires) inputImage() bool {
|
|
55
64
|
URI: i.URI,
|
56
65
|
}
|
57
66
|
i.setConfig()
|
58
|
-
return
|
67
|
+
return nil
|
59
68
|
}
|
60
69
|
return i.downloadImage()
|
61
70
|
}
|
62
71
|
|
63
72
|
// Save http image
|
64
|
-
func (i *Ires) downloadImage()
|
73
|
+
func (i *Ires) downloadImage() error {
|
65
74
|
res, err := http.Get(i.URI)
|
66
75
|
if err != nil {
|
67
|
-
return
|
76
|
+
return err
|
68
77
|
}
|
69
78
|
defer res.Body.Close()
|
70
79
|
|
71
|
-
|
72
|
-
|
80
|
+
buf := new(bytes.Buffer)
|
81
|
+
io.Copy(buf, res.Body)
|
82
|
+
format := formatSearch(res.Body)
|
73
83
|
|
74
|
-
img, _, err := image.Decode(
|
84
|
+
img, _, err := image.Decode(buf)
|
75
85
|
if err != nil {
|
76
|
-
return
|
86
|
+
return err
|
87
|
+
}
|
88
|
+
|
89
|
+
var distURI string
|
90
|
+
if distURI, err = i.imageURI(true); err != nil {
|
91
|
+
return err
|
77
92
|
}
|
78
93
|
|
79
|
-
distURI := i.imageURI(true)
|
80
94
|
i.InputImage = &InputImage{
|
81
95
|
Image: img,
|
82
96
|
Format: format,
|
83
97
|
URI: distURI,
|
84
98
|
}
|
85
99
|
|
86
|
-
if createImage(img, distURI, format) {
|
87
|
-
|
88
|
-
|
100
|
+
if createImage(img, distURI, format) != nil {
|
101
|
+
return err
|
102
|
+
} else {
|
103
|
+
if err := i.setConfig(); err != nil {
|
104
|
+
return err
|
105
|
+
}
|
89
106
|
}
|
90
|
-
return
|
107
|
+
return nil
|
91
108
|
}
|
92
109
|
|
93
|
-
func createImage(img image.Image, path, format string)
|
110
|
+
func createImage(img image.Image, path, format string) error {
|
94
111
|
file, err := os.Create(path)
|
95
112
|
if err != nil {
|
96
|
-
return
|
113
|
+
return err
|
97
114
|
}
|
98
115
|
defer file.Close()
|
99
116
|
|
@@ -107,7 +124,7 @@ func createImage(img image.Image, path, format string) bool {
|
|
107
124
|
default:
|
108
125
|
jpeg.Encode(file, img, nil)
|
109
126
|
}
|
110
|
-
return
|
127
|
+
return nil
|
111
128
|
}
|
112
129
|
|
113
130
|
// Load image
|
@@ -118,11 +135,11 @@ func localImage(uri string) (image.Image, string) {
|
|
118
135
|
}
|
119
136
|
defer file.Close()
|
120
137
|
|
121
|
-
|
122
|
-
|
123
|
-
format := formatSearch(
|
138
|
+
buf := new(bytes.Buffer)
|
139
|
+
io.Copy(buf, file)
|
140
|
+
format := formatSearch(file)
|
124
141
|
|
125
|
-
img, _, err := image.Decode(
|
142
|
+
img, _, err := image.Decode(buf)
|
126
143
|
if err != nil {
|
127
144
|
return nil, ""
|
128
145
|
}
|
@@ -130,22 +147,26 @@ func localImage(uri string) (image.Image, string) {
|
|
130
147
|
}
|
131
148
|
|
132
149
|
// Set image config
|
133
|
-
func (i *Ires) setConfig() {
|
150
|
+
func (i *Ires) setConfig() error {
|
134
151
|
file, err := os.Open(i.InputImage.URI)
|
135
152
|
if err != nil {
|
136
|
-
|
153
|
+
return err
|
137
154
|
}
|
138
155
|
defer file.Close()
|
139
156
|
|
140
|
-
|
157
|
+
buf := new(bytes.Buffer)
|
158
|
+
io.Copy(buf, file)
|
159
|
+
|
160
|
+
conf, _, err := image.DecodeConfig(buf)
|
141
161
|
if err != nil {
|
142
|
-
|
162
|
+
return err
|
143
163
|
}
|
144
164
|
i.InputImage.Config = conf
|
165
|
+
return nil
|
145
166
|
}
|
146
167
|
|
147
168
|
// Resizing & Cropping
|
148
|
-
func (i *Ires) resizeToCrop() image.Image {
|
169
|
+
func (i *Ires) resizeToCrop() (image.Image, error) {
|
149
170
|
inputImg := i.InputImage.Image
|
150
171
|
var outputImg image.Image
|
151
172
|
isAsp, conf := i.isValidAspectRatio()
|
@@ -170,30 +191,36 @@ func (i *Ires) resizeToCrop() image.Image {
|
|
170
191
|
}
|
171
192
|
|
172
193
|
// Cropping
|
173
|
-
|
194
|
+
var err error
|
195
|
+
if outputImg, err = cutter.Crop(resizeImg, cutter.Config{
|
174
196
|
Width: width,
|
175
197
|
Height: height,
|
176
198
|
Mode: cutter.Centered,
|
177
199
|
Options: cutter.Copy,
|
178
|
-
})
|
200
|
+
}); err != nil {
|
201
|
+
return nil, err
|
202
|
+
}
|
179
203
|
}
|
180
|
-
return outputImg
|
204
|
+
return outputImg, nil
|
181
205
|
}
|
182
206
|
|
183
207
|
// Delete image
|
184
|
-
func deleteImage(path string) {
|
185
|
-
_, err := os.Stat(path)
|
186
|
-
|
208
|
+
func deleteImage(path string) error {
|
209
|
+
if _, err := os.Stat(path); err != nil {
|
210
|
+
return err
|
211
|
+
} else {
|
187
212
|
if err := os.Remove(path); err != nil {
|
188
|
-
|
213
|
+
return err
|
189
214
|
}
|
190
215
|
}
|
216
|
+
return nil
|
191
217
|
}
|
192
218
|
|
193
219
|
// Verify aspect ratio
|
194
220
|
func (i *Ires) isValidAspectRatio() (bool, image.Config) {
|
195
221
|
conf := i.InputImage.Config
|
196
222
|
s := i.Size
|
223
|
+
println("\n")
|
197
224
|
aspH := (conf.Height * s.Width) / conf.Width
|
198
225
|
if aspH == s.Height {
|
199
226
|
return true, conf
|
@@ -228,13 +255,6 @@ func formatSearch(r io.Reader) string {
|
|
228
255
|
return format
|
229
256
|
}
|
230
257
|
|
231
|
-
// Copy Reader
|
232
|
-
func copyReader(body io.Reader) (io.Reader, io.Reader) {
|
233
|
-
header := bytes.NewBuffer(nil)
|
234
|
-
r := io.TeeReader(body, header)
|
235
|
-
return header, r
|
236
|
-
}
|
237
|
-
|
238
258
|
// Valid resize type
|
239
259
|
func (i *Ires) validResizeType() bool {
|
240
260
|
config := i.InputImage.Config
|
data/ext/ires/ires.go
CHANGED
@@ -51,16 +51,19 @@ type (
|
|
51
51
|
)
|
52
52
|
|
53
53
|
// Resize is ...
|
54
|
-
func (i *Ires) Resize() string {
|
54
|
+
func (i *Ires) Resize() (string, error) {
|
55
55
|
i.Mode = Resize
|
56
|
-
distURI := i.imageURI(false)
|
56
|
+
distURI, err := i.imageURI(false)
|
57
|
+
if err != nil {
|
58
|
+
return "", err
|
59
|
+
}
|
57
60
|
// When the image exists, return the image path
|
58
61
|
if isExistsImage(distURI) {
|
59
|
-
return i.targetImageURI(distURI)
|
62
|
+
return i.targetImageURI(distURI), nil
|
60
63
|
}
|
61
64
|
|
62
|
-
if
|
63
|
-
return
|
65
|
+
if err := i.inputImage(); err != nil {
|
66
|
+
return "", err
|
64
67
|
}
|
65
68
|
|
66
69
|
var outputImg image.Image
|
@@ -70,20 +73,23 @@ func (i *Ires) Resize() string {
|
|
70
73
|
outputImg = i.InputImage.Image
|
71
74
|
}
|
72
75
|
createImage(outputImg, distURI, i.InputImage.Format)
|
73
|
-
return i.targetImageURI(distURI)
|
76
|
+
return i.targetImageURI(distURI), nil
|
74
77
|
}
|
75
78
|
|
76
79
|
// Crop is Crop ...
|
77
|
-
func (i *Ires) Crop() string {
|
80
|
+
func (i *Ires) Crop() (string, error) {
|
78
81
|
i.Mode = Crop
|
79
|
-
distURI := i.imageURI(false)
|
82
|
+
distURI, err := i.imageURI(false)
|
83
|
+
if err != nil {
|
84
|
+
return "", err
|
85
|
+
}
|
80
86
|
// When the image exists, return the image path
|
81
87
|
if isExistsImage(distURI) {
|
82
|
-
return i.targetImageURI(distURI)
|
88
|
+
return i.targetImageURI(distURI), nil
|
83
89
|
}
|
84
90
|
|
85
|
-
if
|
86
|
-
return
|
91
|
+
if err := i.inputImage(); err != nil {
|
92
|
+
return "", err
|
87
93
|
}
|
88
94
|
|
89
95
|
var outputImg image.Image
|
@@ -98,28 +104,35 @@ func (i *Ires) Crop() string {
|
|
98
104
|
outputImg = i.InputImage.Image
|
99
105
|
}
|
100
106
|
createImage(outputImg, distURI, i.InputImage.Format)
|
101
|
-
return i.targetImageURI(distURI)
|
107
|
+
return i.targetImageURI(distURI), nil
|
102
108
|
}
|
103
109
|
|
104
110
|
// ResizeToCrop is ...
|
105
|
-
func (i *Ires) ResizeToCrop() string {
|
111
|
+
func (i *Ires) ResizeToCrop() (string, error) {
|
106
112
|
i.Mode = ResizeToCrop
|
107
|
-
distURI := i.imageURI(false)
|
113
|
+
distURI, err := i.imageURI(false)
|
114
|
+
if err != nil {
|
115
|
+
return "", err
|
116
|
+
}
|
108
117
|
// When the image exists, return the image path
|
109
118
|
if isExistsImage(distURI) {
|
110
|
-
return i.targetImageURI(distURI)
|
119
|
+
return i.targetImageURI(distURI), nil
|
111
120
|
}
|
112
121
|
|
113
|
-
if
|
114
|
-
return
|
122
|
+
if err := i.inputImage(); err != nil {
|
123
|
+
return "", err
|
115
124
|
}
|
116
125
|
|
117
126
|
var outputImg image.Image
|
118
127
|
if i.validResizeType() {
|
119
|
-
|
128
|
+
if img, err := i.resizeToCrop(); err != nil {
|
129
|
+
return "", err
|
130
|
+
} else {
|
131
|
+
outputImg = img
|
132
|
+
}
|
120
133
|
} else {
|
121
134
|
outputImg = i.InputImage.Image
|
122
135
|
}
|
123
136
|
createImage(outputImg, distURI, i.InputImage.Format)
|
124
|
-
return i.targetImageURI(distURI)
|
137
|
+
return i.targetImageURI(distURI), nil
|
125
138
|
}
|
data/ext/ires/uri.go
CHANGED
@@ -10,7 +10,7 @@ import (
|
|
10
10
|
)
|
11
11
|
|
12
12
|
// Generate image path
|
13
|
-
func (i *Ires) imageURI(original bool) string {
|
13
|
+
func (i *Ires) imageURI(original bool) (string, error) {
|
14
14
|
paths := []rune(i.Dir)
|
15
15
|
pathsLastIndex := len(paths) - 1
|
16
16
|
lastChar := string(paths[pathsLastIndex])
|
@@ -23,19 +23,23 @@ func (i *Ires) imageURI(original bool) string {
|
|
23
23
|
if i.IsLocal {
|
24
24
|
oDir = localPath(i.Mode)
|
25
25
|
} else {
|
26
|
-
|
26
|
+
if d, err := remotePath(i.URI); err != nil {
|
27
|
+
return "", nil
|
28
|
+
} else {
|
29
|
+
oDir = d
|
30
|
+
}
|
27
31
|
}
|
28
32
|
|
29
33
|
// Create directory
|
30
34
|
oPath := filepath.Join(dir, oDir)
|
31
35
|
if _, err := os.Stat(oPath); err != nil {
|
32
36
|
if err := os.MkdirAll(oPath, 0777); err != nil {
|
33
|
-
|
37
|
+
return "", err
|
34
38
|
}
|
35
39
|
}
|
36
40
|
|
37
41
|
name := i.imageName(original)
|
38
|
-
return filepath.Join(oPath, name)
|
42
|
+
return filepath.Join(oPath, name), nil
|
39
43
|
}
|
40
44
|
|
41
45
|
// Generate image name
|
@@ -88,14 +92,18 @@ func isExistsImage(path string) bool {
|
|
88
92
|
}
|
89
93
|
|
90
94
|
// Read directory
|
91
|
-
func (i *Ires) readImageDir() string {
|
95
|
+
func (i *Ires) readImageDir() (string, error) {
|
92
96
|
var dir string
|
93
97
|
if i.IsLocal {
|
94
98
|
dir = localPath(i.Mode)
|
95
99
|
} else {
|
96
|
-
|
100
|
+
if d, err := remotePath(i.URI); err != nil {
|
101
|
+
return "", err
|
102
|
+
} else {
|
103
|
+
dir = d
|
104
|
+
}
|
97
105
|
}
|
98
|
-
return filepath.Join(i.Dir, dir)
|
106
|
+
return filepath.Join(i.Dir, dir), nil
|
99
107
|
}
|
100
108
|
|
101
109
|
// if local image, create ires directory
|
@@ -112,19 +120,19 @@ func localPath(mode Mode) string {
|
|
112
120
|
return dir
|
113
121
|
}
|
114
122
|
|
115
|
-
// if http image, parse
|
116
|
-
func remotePath(uri string) string {
|
123
|
+
// if http image, parse URI & make directory
|
124
|
+
func remotePath(uri string) (string, error) {
|
117
125
|
u, err := urlx.Parse(uri)
|
118
|
-
dir := []string{"ires"}
|
119
126
|
if err != nil {
|
120
|
-
|
127
|
+
return "", err
|
121
128
|
}
|
129
|
+
dir := []string{"ires"}
|
122
130
|
|
123
131
|
dir = append(dir, u.Host)
|
124
132
|
path := strings.Split(u.Path, "/")
|
125
133
|
dir = append(dir, path[1:len(path)-1]...)
|
126
134
|
|
127
|
-
return strings.Join(dir, "/")
|
135
|
+
return strings.Join(dir, "/"), nil
|
128
136
|
}
|
129
137
|
|
130
138
|
// Optimize image path
|
data/ext/main.go
CHANGED
@@ -2,6 +2,7 @@ package main
|
|
2
2
|
|
3
3
|
import (
|
4
4
|
"C"
|
5
|
+
"log"
|
5
6
|
|
6
7
|
"github.com/endotakuya/ires/ext/ires"
|
7
8
|
)
|
@@ -32,13 +33,19 @@ func iresImagePath(URI *C.char, width, height, rType, mode int, Dir, Expire *C.c
|
|
32
33
|
r.DeleteExpireImage()
|
33
34
|
|
34
35
|
var distURI string
|
36
|
+
var err error
|
35
37
|
switch ires.Mode(mode) {
|
36
38
|
case ires.Resize:
|
37
|
-
distURI = r.Resize()
|
39
|
+
distURI, err = r.Resize()
|
38
40
|
case ires.Crop:
|
39
|
-
distURI = r.Crop()
|
41
|
+
distURI, err = r.Crop()
|
40
42
|
case ires.ResizeToCrop:
|
41
|
-
distURI = r.ResizeToCrop()
|
43
|
+
distURI, err = r.ResizeToCrop()
|
44
|
+
}
|
45
|
+
|
46
|
+
if err != nil {
|
47
|
+
log.Print(err)
|
48
|
+
return C.CString(r.URI)
|
42
49
|
}
|
43
50
|
return C.CString(distURI)
|
44
51
|
}
|
data/lib/ires/version.rb
CHANGED
data/shared/darwin/ires.so
CHANGED
Binary file
|
data/shared/linux/ires.so
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ires
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- enta0701
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-12-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|