Files
photoprism/internal/thumb/viewer.go
2025-02-25 11:21:38 +01:00

62 lines
1.7 KiB
Go

package thumb
import (
"reflect"
)
// Viewer represents thumbnail URLs for the photo/video viewer.
type Viewer struct {
Fit720 *Thumb `json:"fit_720"`
Fit1280 *Thumb `json:"fit_1280"`
Fit1920 *Thumb `json:"fit_1920"`
Fit2560 *Thumb `json:"fit_2560"`
Fit4096 *Thumb `json:"fit_4096"`
Fit5120 *Thumb `json:"fit_5120"`
Fit7680 *Thumb `json:"fit_7680"`
}
// ViewerThumbs creates and returns a Viewer struct pointer with the required thumbnail URLs for the photo/video viewer.
func ViewerThumbs(fileWidth, fileHeight int, fileHash, contentUri, previewToken string) *Viewer {
thumbs := &Viewer{}
// Get Viewer struct fields.
fields := reflect.ValueOf(thumbs).Elem()
// Remember the maximum allowed size and the maximum actual size.
var maxSize = MaxSize()
var largestSize Size
// Iterate through all Viewer struct fields and set the best matching thumb size.
for i := 0; i < fields.NumField(); i++ {
thumb := fields.Field(i)
// For simplicity, JSON value name is the same as the thumbnail size name.
size := Name(fields.Type().Field(i).Tag.Get("json"))
if size == "" {
continue
}
s := Sizes[size]
// Make sure not to process an invalid size.
if s.Name == "" {
continue
}
// Remember this as the largest size needed if the original size is smaller than the thumb size.
if largestSize.Name == "" && (s.Width >= fileWidth && s.Height >= fileHeight || s.Width >= maxSize) {
largestSize = s
}
// Set the field value to the current size or the maximum size, if any.
if largestSize.Name != "" {
thumb.Set(reflect.ValueOf(New(fileWidth, fileHeight, fileHash, largestSize, contentUri, previewToken)))
} else {
thumb.Set(reflect.ValueOf(New(fileWidth, fileHeight, fileHash, s, contentUri, previewToken)))
}
}
return thumbs
}