1
Fork 0
photoview/api/scanner/exif/exif.go

74 lines
1.7 KiB
Go
Raw Normal View History

2021-01-19 16:39:57 +01:00
package exif
import (
"log"
"github.com/pkg/errors"
"gorm.io/gorm"
"github.com/photoview/photoview/api/graphql/models"
)
2021-11-06 13:01:01 +01:00
type ExifParser interface {
2021-04-22 21:37:59 +02:00
ParseExif(media_path string) (*models.MediaEXIF, error)
2021-01-19 16:39:57 +01:00
}
2021-11-06 13:01:01 +01:00
var globalExifParser ExifParser
2021-04-03 21:39:32 +02:00
func InitializeEXIFParser() {
// Decide between internal or external Exif parser
2021-11-06 13:01:01 +01:00
exiftoolParser, err := NewExiftoolParser()
2021-04-03 21:39:32 +02:00
if err != nil {
log.Printf("Failed to get exiftool, using internal exif parser instead: %v\n", err)
2021-11-06 13:01:01 +01:00
globalExifParser = NewInternalExifParser()
2021-04-03 21:39:32 +02:00
} else {
log.Println("Found exiftool")
globalExifParser = exiftoolParser
2021-04-03 21:39:32 +02:00
}
}
2021-01-19 16:39:57 +01:00
// SaveEXIF scans the media file for exif metadata and saves it in the database if found
func SaveEXIF(tx *gorm.DB, media *models.Media) (*models.MediaEXIF, error) {
{
// Check if EXIF data already exists
if media.ExifID != nil {
var exif models.MediaEXIF
if err := tx.First(&exif, media.ExifID).Error; err != nil {
return nil, errors.Wrap(err, "get EXIF for media from database")
}
return &exif, nil
}
}
if globalExifParser == nil {
return nil, errors.New("No exif parser initialized")
}
exif, err := globalExifParser.ParseExif(media.Path)
2021-01-19 16:39:57 +01:00
if err != nil {
return nil, errors.Wrap(err, "failed to parse exif data")
}
if exif == nil {
return nil, nil
}
// Add EXIF to database and link to media
if err := tx.Model(&media).Association("Exif").Replace(exif); err != nil {
return nil, errors.Wrap(err, "save media exif to database")
}
if exif.DateShot != nil && !exif.DateShot.Equal(media.DateShot) {
2021-02-13 17:21:15 +01:00
media.DateShot = *exif.DateShot
if err := tx.Save(media).Error; err != nil {
return nil, errors.Wrap(err, "update media date_shot")
}
}
2021-01-19 16:39:57 +01:00
return exif, nil
}