photoprism/internal/entity/markers.go

77 lines
1.5 KiB
Go
Raw Normal View History

2021-05-26 14:41:59 +02:00
package entity
import (
2021-09-20 22:19:54 +02:00
"github.com/photoprism/photoprism/internal/face"
"github.com/photoprism/photoprism/pkg/txt"
)
2021-05-26 14:41:59 +02:00
type Markers []Marker
// Save stores the markers in the database.
func (m Markers) Save(fileUID string) error {
2021-05-26 14:41:59 +02:00
for _, marker := range m {
if fileUID != "" {
marker.FileUID = fileUID
}
2021-05-26 14:41:59 +02:00
if _, err := UpdateOrCreateMarker(&marker); err != nil {
return err
}
}
return nil
}
// Contains returns true if a marker at the same position already exists.
func (m Markers) Contains(other Marker) bool {
for _, marker := range m {
2021-09-20 22:19:54 +02:00
if marker.OverlapPercent(other) > face.OverlapThreshold {
return true
}
}
return false
}
// FaceCount returns the number of valid face markers.
func (m Markers) FaceCount() (faces int) {
for _, marker := range m {
if !marker.MarkerInvalid && marker.MarkerType == MarkerFace {
faces++
}
}
return faces
}
// SubjectNames returns known subject names.
func (m Markers) SubjectNames() (names []string) {
for _, marker := range m {
if marker.MarkerInvalid || marker.MarkerType != MarkerFace {
continue
} else if n := marker.SubjectName(); n != "" {
names = append(names, n)
}
}
return txt.UniqueNames(names)
}
// Append adds a marker.
func (m *Markers) Append(marker Marker) {
*m = append(*m, marker)
}
// FindMarkers returns up to 1000 markers for a given file uid.
func FindMarkers(fileUID string) (Markers, error) {
m := Markers{}
err := Db().
Where(`file_uid = ?`, fileUID).
Order("x").
Offset(0).Limit(1000).
Find(&m).Error
return m, err
}