✨ Basic queue for processing
This commit is contained in:
68
pkg/internal/services/analyzer.go
Normal file
68
pkg/internal/services/analyzer.go
Normal file
@@ -0,0 +1,68 @@
|
||||
package services
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"image"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"git.solsynth.dev/hydrogen/paperclip/pkg/internal/database"
|
||||
"git.solsynth.dev/hydrogen/paperclip/pkg/internal/models"
|
||||
jsoniter "github.com/json-iterator/go"
|
||||
"github.com/spf13/viper"
|
||||
|
||||
_ "image/gif"
|
||||
_ "image/jpeg"
|
||||
_ "image/png"
|
||||
)
|
||||
|
||||
var fileAnalyzeQueue = make(chan models.Attachment, 256)
|
||||
|
||||
func PublishAnalyzeTask(file models.Attachment) {
|
||||
fileAnalyzeQueue <- file
|
||||
}
|
||||
|
||||
func AnalyzeAttachment(file models.Attachment) error {
|
||||
if file.Destination != models.AttachmentDstTemporary {
|
||||
return fmt.Errorf("attachment isn't in temporary storage, unable to analyze")
|
||||
}
|
||||
|
||||
destMap := viper.GetStringMap("destinations.temporary")
|
||||
|
||||
var dest models.LocalDestination
|
||||
rawDest, _ := jsoniter.Marshal(destMap)
|
||||
_ = jsoniter.Unmarshal(rawDest, &dest)
|
||||
|
||||
dst := filepath.Join(dest.Path, file.Uuid)
|
||||
if _, err := os.Stat(dst); !os.IsExist(err) {
|
||||
return fmt.Errorf("attachment doesn't exists in temporary storage")
|
||||
}
|
||||
|
||||
if t := strings.SplitN(file.MimeType, "/", 2)[0]; t == "image" {
|
||||
// Dealing with image
|
||||
reader, err := os.Open(dst)
|
||||
if err != nil {
|
||||
return fmt.Errorf("unable to open file: %v", err)
|
||||
}
|
||||
defer reader.Close()
|
||||
im, _, err := image.Decode(reader)
|
||||
if err != nil {
|
||||
return fmt.Errorf("unable to decode file as an image: %v", err)
|
||||
}
|
||||
width := im.Bounds().Dx()
|
||||
height := im.Bounds().Dy()
|
||||
ratio := width / height
|
||||
file.Metadata = map[string]any{
|
||||
"width": width,
|
||||
"height": height,
|
||||
"ratio": ratio,
|
||||
}
|
||||
}
|
||||
|
||||
if err := database.C.Save(&file).Error; err != nil {
|
||||
return fmt.Errorf("unable to save file record: %v", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
Reference in New Issue
Block a user