-
Notifications
You must be signed in to change notification settings - Fork 19
/
thumbnail.go
85 lines (66 loc) · 2.09 KB
/
thumbnail.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package thumbnail
import (
"fmt"
"net/http"
"github.com/Chatterino/api/pkg/config"
"github.com/Chatterino/api/pkg/utils"
vips "github.com/davidbyttow/govips/v2/vips"
)
var (
supportedThumbnails = []string{
"image/jpeg",
"image/png",
"image/gif",
"image/webp",
"application/pdf",
}
// Subset of supportedThumbnails that should be treated as animated
animatedThumbnails = []string{
"image/gif",
"image/webp",
}
cfg config.APIConfig
)
func IsSupportedThumbnailType(contentType string) bool {
return utils.Contains(supportedThumbnails, contentType)
}
func IsAnimatedThumbnailType(contentType string) bool {
return utils.Contains(animatedThumbnails, contentType)
}
func InitializeConfig(passedCfg config.APIConfig) {
cfg = passedCfg
vips.Startup(nil)
}
func Shutdown() {
vips.Shutdown()
}
func BuildStaticThumbnail(inputBuf []byte, resp *http.Response) ([]byte, error) {
image, err := vips.NewImageFromBuffer(inputBuf)
// govips has the height & width values in int, which means we're converting uint to int.
maxThumbnailSize := int(cfg.MaxThumbnailSize)
// Only resize if the original image has bigger dimensions than maxThumbnailSize
if image.Width() <= maxThumbnailSize && image.Height() <= maxThumbnailSize {
// We don't need to resize image nor does it need to be passed through govips.
return inputBuf, nil
}
importParams := vips.NewImportParams()
if err != nil {
return []byte{}, fmt.Errorf("could not load image from url: %s", resp.Request.URL)
}
image, err = vips.LoadThumbnailFromBuffer(inputBuf, maxThumbnailSize, maxThumbnailSize, vips.InterestingNone, vips.SizeDown, importParams)
if err != nil {
fmt.Println(err)
return []byte{}, fmt.Errorf("could not transform image from url: %s", resp.Request.URL)
}
var outputBuf []byte
if image.Format() == vips.ImageTypePDF {
// Export thumbnails for PDF as PNG
outputBuf, _, err = image.ExportPng(vips.NewPngExportParams())
} else {
outputBuf, _, err = image.ExportNative()
}
if err != nil {
return []byte{}, fmt.Errorf("could not export image from url: %s", resp.Request.URL)
}
return outputBuf, nil
}