Indexer now re-indexes existing files

This commit is contained in:
Michael Mayer 2018-09-18 21:15:54 +02:00
parent 4119170587
commit d50e36b213

View file

@ -9,6 +9,12 @@ import (
"path/filepath" "path/filepath"
"sort" "sort"
"strings" "strings"
"time"
)
const (
IndexResultUpdated = "Updated"
IndexResultAdded = "Added"
) )
type Indexer struct { type Indexer struct {
@ -92,7 +98,7 @@ func (i *Indexer) appendTag(tags []*Tag, label string) []*Tag {
return append(tags, tag) return append(tags, tag)
} }
func (i *Indexer) IndexMediaFile(mediaFile *MediaFile) { func (i *Indexer) IndexMediaFile(mediaFile *MediaFile) string {
var photo Photo var photo Photo
var file, primaryFile File var file, primaryFile File
var isPrimary = false var isPrimary = false
@ -101,8 +107,11 @@ func (i *Indexer) IndexMediaFile(mediaFile *MediaFile) {
canonicalName := mediaFile.GetCanonicalNameFromFile() canonicalName := mediaFile.GetCanonicalNameFromFile()
fileHash := mediaFile.GetHash() fileHash := mediaFile.GetHash()
relativeFileName := mediaFile.GetRelativeFilename(i.originalsPath)
if result := i.db.First(&photo, "photo_canonical_name = ?", canonicalName); result.Error != nil { photoQuery := i.db.First(&photo, "photo_canonical_name = ?", canonicalName)
if photoQuery.Error != nil {
if jpeg, err := mediaFile.GetJpeg(); err == nil { if jpeg, err := mediaFile.GetJpeg(); err == nil {
// Perceptual Hash // Perceptual Hash
if perceptualHash, err := jpeg.GetPerceptualHash(); err == nil { if perceptualHash, err := jpeg.GetPerceptualHash(); err == nil {
@ -136,11 +145,11 @@ func (i *Indexer) IndexMediaFile(mediaFile *MediaFile) {
tags = i.appendTag(tags, location.LocName) tags = i.appendTag(tags, location.LocName)
tags = i.appendTag(tags, location.LocType) tags = i.appendTag(tags, location.LocType)
if location.LocName != "" { // TODO: User defined title format if photo.PhotoTitle == "" && location.LocName != "" { // TODO: User defined title format
photo.PhotoTitle = fmt.Sprintf("%s / %s / %s", location.LocName, location.LocCountry, mediaFile.GetDateCreated().Format("2006")) photo.PhotoTitle = fmt.Sprintf("%s / %s / %s", location.LocName, location.LocCountry, mediaFile.GetDateCreated().Format("2006"))
} else if location.LocCity != "" { } else if photo.PhotoTitle == "" && location.LocCity != "" {
photo.PhotoTitle = fmt.Sprintf("%s / %s / %s", location.LocCity, location.LocCountry, mediaFile.GetDateCreated().Format("2006")) photo.PhotoTitle = fmt.Sprintf("%s / %s / %s", location.LocCity, location.LocCountry, mediaFile.GetDateCreated().Format("2006"))
} else if location.LocCounty != "" { } else if photo.PhotoTitle == "" && location.LocCounty != "" {
photo.PhotoTitle = fmt.Sprintf("%s / %s / %s", location.LocCounty, location.LocCountry, mediaFile.GetDateCreated().Format("2006")) photo.PhotoTitle = fmt.Sprintf("%s / %s / %s", location.LocCounty, location.LocCountry, mediaFile.GetDateCreated().Format("2006"))
} }
} }
@ -156,33 +165,57 @@ func (i *Indexer) IndexMediaFile(mediaFile *MediaFile) {
photo.Tags = tags photo.Tags = tags
photo.Camera = NewCamera(mediaFile.GetCameraModel()).FirstOrCreate(i.db) photo.Camera = NewCamera(mediaFile.GetCameraModel()).FirstOrCreate(i.db)
photo.TakenAt = mediaFile.GetDateCreated() photo.TakenAt = mediaFile.GetDateCreated()
photo.PhotoCanonicalName = canonicalName
photo.PhotoCanonicalName = canonicalName
photo.PhotoFavorite = false photo.PhotoFavorite = false
i.db.Create(&photo) i.db.Create(&photo)
} else if time.Now().Sub(photo.UpdatedAt).Minutes() > 10 { // If updated more than 10 minutes ago
if jpeg, err := mediaFile.GetJpeg(); err == nil {
// Perceptual Hash
if photo.PhotoPerceptualHash == "" {
if perceptualHash, err := jpeg.GetPerceptualHash(); err == nil {
photo.PhotoPerceptualHash = perceptualHash
}
}
// PhotoColors
colorNames, photo.PhotoVibrantColor, photo.PhotoMutedColor = jpeg.GetColors()
photo.PhotoColors = strings.Join(colorNames, ", ")
}
i.db.Save(&photo)
} }
if result := i.db.Where("file_type = 'jpg' AND file_primary = 1 AND photo_id = ?", photo.ID).First(&primaryFile); result.Error != nil { if result := i.db.Where("file_type = 'jpg' AND file_primary = 1 AND photo_id = ?", photo.ID).First(&primaryFile); result.Error != nil {
isPrimary = mediaFile.GetType() == FileTypeJpeg isPrimary = mediaFile.GetType() == FileTypeJpeg
} else {
isPrimary = mediaFile.GetType() == FileTypeJpeg && (relativeFileName == primaryFile.FileName || fileHash == primaryFile.FileHash)
} }
if result := i.db.First(&file, "file_hash = ?", fileHash); result.Error != nil { fileQuery := i.db.First(&file, "file_hash = ? OR file_name = ?", fileHash, relativeFileName)
file.PhotoID = photo.ID
file.FilePrimary = isPrimary
file.FileName = mediaFile.GetRelativeFilename(i.originalsPath)
file.FileHash = fileHash
file.FileType = mediaFile.GetType()
file.FileMime = mediaFile.GetMimeType()
file.FileOrientation = mediaFile.GetOrientation()
if mediaFile.GetWidth() > 0 && mediaFile.GetHeight() > 0 { file.PhotoID = photo.ID
file.FileWidth = mediaFile.GetWidth() file.FilePrimary = isPrimary
file.FileHeight = mediaFile.GetHeight() file.FileName = relativeFileName
file.FileAspectRatio = mediaFile.GetAspectRatio() file.FileHash = fileHash
} file.FileType = mediaFile.GetType()
file.FileMime = mediaFile.GetMimeType()
file.FileOrientation = mediaFile.GetOrientation()
if mediaFile.GetWidth() > 0 && mediaFile.GetHeight() > 0 {
file.FileWidth = mediaFile.GetWidth()
file.FileHeight = mediaFile.GetHeight()
file.FileAspectRatio = mediaFile.GetAspectRatio()
}
if fileQuery.Error == nil {
i.db.Save(&file)
return IndexResultUpdated
} else {
i.db.Create(&file) i.db.Create(&file)
return IndexResultAdded
} }
} }
@ -197,22 +230,20 @@ func (i *Indexer) IndexRelated(mediaFile *MediaFile) map[string]bool {
return indexed return indexed
} }
log.Printf("Indexing main %s file \"%s\"", mainFile.GetType(), mainFile.GetRelativeFilename(i.originalsPath)) mainIndexResult := i.IndexMediaFile(mainFile)
i.IndexMediaFile(mainFile)
indexed[mainFile.GetFilename()] = true indexed[mainFile.GetFilename()] = true
log.Printf("%s main %s file \"%s\"", mainIndexResult, mainFile.GetType(), mainFile.GetRelativeFilename(i.originalsPath))
for _, relatedMediaFile := range relatedFiles { for _, relatedMediaFile := range relatedFiles {
if indexed[relatedMediaFile.GetFilename()] { if indexed[relatedMediaFile.GetFilename()] {
continue continue
} }
log.Printf("Indexing related %s file \"%s\"", relatedMediaFile.GetType(), relatedMediaFile.GetRelativeFilename(i.originalsPath)) indexResult := i.IndexMediaFile(relatedMediaFile)
i.IndexMediaFile(relatedMediaFile)
indexed[relatedMediaFile.GetFilename()] = true indexed[relatedMediaFile.GetFilename()] = true
log.Printf("%s related %s file \"%s\"", indexResult, relatedMediaFile.GetType(), relatedMediaFile.GetRelativeFilename(i.originalsPath))
} }
return indexed return indexed