Skip to content

Commit 0ce5170

Browse files
Use vips thumbnail resizing and disable vips cache (#920)
1 parent b5e2718 commit 0ce5170

File tree

8 files changed

+43
-25
lines changed

8 files changed

+43
-25
lines changed

pkg/api/routes_image.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,17 @@ func (rs imageRoutes) image(w http.ResponseWriter, r *http.Request) {
3333
imageRepo := getRepo(r.Context()).Image()
3434

3535
databaseImage, err := imageRepo.Find(uuid)
36-
if err != nil || databaseImage == nil {
37-
http.Error(w, err.Error(), http.StatusNotFound)
36+
if err != nil {
37+
http.Error(w, err.Error(), http.StatusInternalServerError)
38+
return
39+
}
40+
if databaseImage == nil {
41+
http.NotFound(w, r)
3842
return
3943
}
4044

4145
service := image.GetService(imageRepo)
42-
reader, err := service.Read(*databaseImage)
46+
reader, size, err := service.Read(*databaseImage)
4347
if err != nil {
4448
http.Error(w, err.Error(), http.StatusNotFound)
4549
return
@@ -69,7 +73,7 @@ func (rs imageRoutes) image(w http.ResponseWriter, r *http.Request) {
6973

7074
if maxSize != 0 {
7175
if databaseImage.Width > int64(maxSize) || databaseImage.Height > int64(maxSize) {
72-
data, err := image.Resize(reader, maxSize)
76+
data, err := image.Resize(reader, maxSize, databaseImage, size)
7377
if err != nil {
7478
http.Error(w, err.Error(), http.StatusInternalServerError)
7579
return

pkg/image/file.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,14 @@ func (s *FileBackend) DestroyFile(image *models.Image) error {
3939
return os.Remove(GetImagePath(config.GetImageLocation(), image.Checksum))
4040
}
4141

42-
func (s *FileBackend) ReadFile(image models.Image) (io.ReadCloser, error) {
42+
func (s *FileBackend) ReadFile(image models.Image) (io.ReadCloser, int64, error) {
4343
fileDir := config.GetImageLocation()
4444
path := GetImagePath(fileDir, image.Checksum)
45-
return os.Open(path)
45+
stat, err := os.Stat(path)
46+
if err != nil {
47+
return nil, 0, err
48+
}
49+
50+
file, err := os.Open(path)
51+
return file, stat.Size(), err
4652
}

pkg/image/image_backend.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,5 @@ import (
99
type Backend interface {
1010
WriteFile(file []byte, image *models.Image) error
1111
DestroyFile(image *models.Image) error
12-
ReadFile(image models.Image) (io.ReadCloser, error)
12+
ReadFile(image models.Image) (io.ReadCloser, int64, error)
1313
}

pkg/image/image_service.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ type BackendService interface {
1313
Destroy(input models.ImageDestroyInput) error
1414
DestroyUnusedImages() error
1515
DestroyUnusedImage(imageID uuid.UUID) error
16-
Read(image models.Image) (io.ReadCloser, error)
16+
Read(image models.Image) (io.ReadCloser, int64, error)
1717
}
1818

1919
func GetService(repo models.ImageRepo) BackendService {

pkg/image/resize_unix.go

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,27 +4,23 @@ package image
44

55
import (
66
"io"
7-
"math"
87

98
"github.com/davidbyttow/govips/v2/vips"
109
"github.com/stashapp/stash-box/pkg/manager/config"
10+
"github.com/stashapp/stash-box/pkg/models"
1111
)
1212

13-
func Resize(reader io.Reader, maxSize int) ([]byte, error) {
13+
func Resize(reader io.Reader, maxSize int, dbimage *models.Image, fileSize int64) ([]byte, error) {
1414
defer vips.ShutdownThread()
1515

16-
image, err := vips.NewImageFromReader(reader)
17-
if err != nil {
16+
buffer := make([]byte, fileSize)
17+
if _, err := io.ReadFull(reader, buffer); err != nil {
1818
return nil, err
1919
}
2020

21-
h := image.Height()
22-
w := image.Width()
23-
scale := float64(maxSize) / math.Max(float64(h), float64(w))
24-
if scale < 1 {
25-
if err := image.Resize(scale, vips.KernelCubic); err != nil {
26-
return nil, err
27-
}
21+
image, err := vips.NewThumbnailFromBuffer(buffer, maxSize, maxSize, vips.InterestingNone)
22+
if err != nil {
23+
return nil, err
2824
}
2925

3026
format := image.Format()
@@ -51,5 +47,5 @@ func Resize(reader io.Reader, maxSize int) ([]byte, error) {
5147

5248
func InitResizer() {
5349
vips.LoggingSettings(nil, vips.LogLevelWarning)
54-
vips.Startup(nil)
50+
vips.Startup(&vips.Config{MaxCacheSize: 0, MaxCacheMem: 0})
5551
}

pkg/image/resize_windows.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@ package image
44

55
import (
66
"io"
7+
8+
"github.com/stashapp/stash-box/pkg/models"
79
)
810

9-
func Resize(reader io.Reader, max int) ([]byte, error) {
11+
func Resize(reader io.Reader, max int, dbimage *models.Image, fileSize int64) ([]byte, error) {
1012
return resizeImage(reader, int64(max))
1113
}
1214

pkg/image/s3.go

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ func uploadS3File(client minio.Client, file []byte, bucket string, id string, he
8080
return err
8181
}
8282

83-
func (s *S3Backend) ReadFile(image models.Image) (io.ReadCloser, error) {
83+
func (s *S3Backend) ReadFile(image models.Image) (io.ReadCloser, int64, error) {
8484
ctx := context.TODO()
8585

8686
s3config := config.GetS3Config()
@@ -89,16 +89,26 @@ func (s *S3Backend) ReadFile(image models.Image) (io.ReadCloser, error) {
8989
Secure: true,
9090
})
9191
if err != nil {
92-
return nil, err
92+
return nil, 0, err
9393
}
9494

9595
id := image.ID.String()
9696
path := id[0:2] + "/" + id[2:4] + "/" + id
9797

98-
return minioClient.GetObject(
98+
object, err := minioClient.GetObject(
9999
ctx,
100100
s3config.Bucket,
101101
path,
102102
minio.GetObjectOptions{},
103103
)
104+
if err != nil {
105+
return nil, 0, err
106+
}
107+
108+
stat, err := object.Stat()
109+
if err != nil {
110+
return nil, 0, err
111+
}
112+
113+
return object, stat.Size, err
104114
}

pkg/image/service.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,6 @@ func (s *Service) DestroyUnusedImage(imageID uuid.UUID) error {
166166
return nil
167167
}
168168

169-
func (s *Service) Read(image models.Image) (io.ReadCloser, error) {
169+
func (s *Service) Read(image models.Image) (io.ReadCloser, int64, error) {
170170
return s.Backend.ReadFile(image)
171171
}

0 commit comments

Comments
 (0)