Select Git revision
image.go 13.02 KiB
package store
import (
"bytes"
"crypto/sha256"
"encoding/json"
"fmt"
"github.com/nfnt/resize"
log "github.com/sirupsen/logrus"
"image"
_ "image/gif"
"image/jpeg"
_ "image/png"
"os"
)
const ImageRootPageVariant = "root"
// Image represents metadata of an image.
type Image struct {
Snowflake string `json:"snowflake"`
Hash string `json:"hash"`
Type string `json:"type"`
User string `json:"user"`
Source string `json:"source"`
Parent string `json:"parent"`
Child string `json:"child"`
Commentary string `json:"commentary"`
CommentaryTranslation string `json:"commentary_translation"`
}
// Images returns a slice of image hashes.
func (s *Store) Images() []string {
var images []string
if entries, err := os.ReadDir(s.ImagesDir()); err != nil {
s.fatalClose(fmt.Sprintf("Error reading first level image directory, %s", err))
} else {
for _, entry := range entries {
if entry.IsDir() {
var subEntries []os.DirEntry
if subEntries, err = os.ReadDir(s.ImagesDir() + "/" + entry.Name()); err != nil {
s.fatalClose(fmt.Sprintf("Error reading second level image directory %s, %s", entry.Name(), err))
} else {
for _, subEntry := range subEntries {
images = append(images, entry.Name()+subEntry.Name())
}
}
}
}
}
return images
}
// Image returns an image with specific hash.
func (s *Store) Image(hash string) Image {
if !sha256Regex.MatchString(hash) || !s.file(s.ImageMetadataPath(hash)) {
return Image{}
}
s.getLock(hash).RLock()
defer s.getLock(hash).RUnlock()
return s.ImageMetadataRead(s.ImageMetadataPath(hash))
}
// ImageMetadataRead reads an image metadata file.
func (s *Store) ImageMetadataRead(path string) Image {
var metadata Image
if payload, err := os.ReadFile(path); err != nil {
if os.IsNotExist(err) {
return Image{}