notify.moe/arn/UserCover.go

106 lines
2.3 KiB
Go

package arn
import (
"bytes"
"image"
"path"
"time"
"github.com/akyoto/imageserver"
)
const (
// CoverMaxWidth is the maximum size for covers.
CoverMaxWidth = 1920
// CoverMaxHeight is the maximum height for covers.
CoverMaxHeight = 450
// CoverSmallWidth is the width used for mobile phones.
CoverSmallWidth = 640
// CoverSmallHeight is the height used for mobile phones.
CoverSmallHeight = 640
// CoverWebPQuality is the WebP quality of cover images.
CoverWebPQuality = AvatarWebPQuality
// CoverJPEGQuality is the JPEG quality of cover images.
CoverJPEGQuality = CoverWebPQuality
)
// Define the cover image outputs
var coverImageOutputs = []imageserver.Output{
// JPEG - Large
&imageserver.JPEGFile{
Directory: path.Join(Root, "images/covers/large/"),
Width: CoverMaxWidth,
Height: CoverMaxHeight,
Quality: CoverJPEGQuality,
},
// JPEG - Small
&imageserver.JPEGFile{
Directory: path.Join(Root, "images/covers/small/"),
Width: CoverSmallWidth,
Height: CoverSmallHeight,
Quality: CoverJPEGQuality,
},
// WebP - Large
&imageserver.WebPFile{
Directory: path.Join(Root, "images/covers/large/"),
Width: CoverMaxWidth,
Height: CoverMaxHeight,
Quality: CoverWebPQuality,
},
// WebP - Small
&imageserver.WebPFile{
Directory: path.Join(Root, "images/covers/small/"),
Width: CoverSmallWidth,
Height: CoverSmallHeight,
Quality: CoverWebPQuality,
},
}
// UserCover ...
type UserCover struct {
Extension string `json:"extension"`
LastModified int64 `json:"lastModified"`
}
// SetCoverBytes accepts a byte buffer that represents an image file and updates the cover image.
func (user *User) SetCoverBytes(data []byte) error {
// Decode
img, format, err := image.Decode(bytes.NewReader(data))
if err != nil {
return err
}
return user.SetCover(&imageserver.MetaImage{
Image: img,
Format: format,
Data: data,
})
}
// SetCover sets the cover image to the given MetaImage.
func (user *User) SetCover(cover *imageserver.MetaImage) error {
var lastError error
// Save the different image formats and sizes
for _, output := range coverImageOutputs {
err := output.Save(cover, user.ID)
if err != nil {
lastError = err
}
}
user.Cover.Extension = ".jpg"
user.Cover.LastModified = time.Now().Unix()
return lastError
}