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")
|
2021-05-06 21:54:31 +02:00
|
|
|
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")
|
|
|
|
}
|
|
|
|
|
2023-01-23 06:19:41 +01:00
|
|
|
tx.Delete(&exif)
|
2021-01-19 16:39:57 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-05-06 21:54:31 +02:00
|
|
|
if globalExifParser == nil {
|
|
|
|
return nil, errors.New("No exif parser initialized")
|
2021-03-23 21:36:03 +01:00
|
|
|
}
|
|
|
|
|
2021-05-06 21:54:31 +02:00
|
|
|
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")
|
|
|
|
}
|
|
|
|
|
2021-02-14 15:45:58 +01:00
|
|
|
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
|
|
|
|
}
|