2021-03-20 00:26:05 +01:00
|
|
|
package exif
|
|
|
|
|
|
|
|
import (
|
|
|
|
"log"
|
|
|
|
"time"
|
|
|
|
|
2021-03-31 23:35:14 +02:00
|
|
|
"github.com/barasher/go-exiftool"
|
2021-03-20 00:26:05 +01:00
|
|
|
"github.com/photoview/photoview/api/graphql/models"
|
|
|
|
)
|
|
|
|
|
|
|
|
type externalExifParser struct{}
|
|
|
|
|
2021-04-22 21:37:59 +02:00
|
|
|
func (p *externalExifParser) ParseExif(media_path string) (returnExif *models.MediaEXIF, returnErr error) {
|
2021-03-31 23:35:14 +02:00
|
|
|
// ExifTool - No print conversion mode
|
|
|
|
et, err := exiftool.NewExiftool(exiftool.NoPrintConversion())
|
2021-03-20 00:26:05 +01:00
|
|
|
if err != nil {
|
|
|
|
log.Printf("Error initializing ExifTool: %s\n", err)
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
defer et.Close()
|
|
|
|
|
2021-04-22 21:37:59 +02:00
|
|
|
fileInfos := et.ExtractMetadata(media_path)
|
2021-03-20 00:26:05 +01:00
|
|
|
newExif := models.MediaEXIF{}
|
2021-04-22 22:46:52 +02:00
|
|
|
found_exif := false
|
2021-03-20 00:26:05 +01:00
|
|
|
|
|
|
|
for _, fileInfo := range fileInfos {
|
|
|
|
if fileInfo.Err != nil {
|
2021-04-11 22:55:44 +02:00
|
|
|
log.Printf("Fileinfo error: %v\n", fileInfo.Err)
|
2021-03-20 00:26:05 +01:00
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get camera model
|
|
|
|
model, err := fileInfo.GetString("Model")
|
|
|
|
if err == nil {
|
2021-04-22 22:46:52 +02:00
|
|
|
found_exif = true
|
2021-03-20 00:26:05 +01:00
|
|
|
newExif.Camera = &model
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get Camera make
|
|
|
|
make, err := fileInfo.GetString("Make")
|
|
|
|
if err == nil {
|
2021-04-22 22:46:52 +02:00
|
|
|
found_exif = true
|
2021-03-20 00:26:05 +01:00
|
|
|
newExif.Maker = &make
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get lens
|
|
|
|
lens, err := fileInfo.GetString("LensModel")
|
|
|
|
if err == nil {
|
2021-04-22 22:46:52 +02:00
|
|
|
found_exif = true
|
2021-03-20 00:26:05 +01:00
|
|
|
newExif.Lens = &lens
|
|
|
|
}
|
|
|
|
|
|
|
|
//Get time of photo
|
|
|
|
date, err := fileInfo.GetString("DateTimeOriginal")
|
|
|
|
if err == nil {
|
|
|
|
layout := "2006:01:02 15:04:05"
|
|
|
|
dateTime, err := time.Parse(layout, date)
|
|
|
|
if err == nil {
|
2021-04-22 22:46:52 +02:00
|
|
|
found_exif = true
|
2021-03-20 00:26:05 +01:00
|
|
|
newExif.DateShot = &dateTime
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get exposure time
|
2021-03-31 23:35:14 +02:00
|
|
|
exposureTime, err := fileInfo.GetFloat("ExposureTime")
|
2021-03-20 00:26:05 +01:00
|
|
|
if err == nil {
|
2021-04-22 22:46:52 +02:00
|
|
|
found_exif = true
|
2021-03-20 00:26:05 +01:00
|
|
|
newExif.Exposure = &exposureTime
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get aperture
|
|
|
|
aperture, err := fileInfo.GetFloat("Aperture")
|
|
|
|
if err == nil {
|
2021-04-22 22:46:52 +02:00
|
|
|
found_exif = true
|
2021-03-20 00:26:05 +01:00
|
|
|
newExif.Aperture = &aperture
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get ISO
|
|
|
|
iso, err := fileInfo.GetInt("ISO")
|
|
|
|
if err == nil {
|
2021-04-22 22:46:52 +02:00
|
|
|
found_exif = true
|
2021-03-20 00:26:05 +01:00
|
|
|
newExif.Iso = &iso
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get focal length
|
2021-04-11 22:55:44 +02:00
|
|
|
focalLen, err := fileInfo.GetFloat("FocalLength")
|
2021-03-20 00:26:05 +01:00
|
|
|
if err == nil {
|
2021-04-22 22:46:52 +02:00
|
|
|
found_exif = true
|
2021-04-11 22:55:44 +02:00
|
|
|
newExif.FocalLength = &focalLen
|
2021-03-20 00:26:05 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// Get flash info
|
2021-03-28 23:52:51 +02:00
|
|
|
flash, err := fileInfo.GetInt("Flash")
|
2021-03-20 00:26:05 +01:00
|
|
|
if err == nil {
|
2021-04-22 22:46:52 +02:00
|
|
|
found_exif = true
|
2021-03-20 00:26:05 +01:00
|
|
|
newExif.Flash = &flash
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get orientation
|
2021-03-23 21:36:03 +01:00
|
|
|
orientation, err := fileInfo.GetInt("Orientation")
|
2021-03-20 00:26:05 +01:00
|
|
|
if err == nil {
|
2021-04-22 22:46:52 +02:00
|
|
|
found_exif = true
|
2021-03-23 21:36:03 +01:00
|
|
|
newExif.Orientation = &orientation
|
2021-03-20 00:26:05 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// Get exposure program
|
2021-03-28 23:52:51 +02:00
|
|
|
expProgram, err := fileInfo.GetInt("ExposureProgram")
|
2021-03-20 00:26:05 +01:00
|
|
|
if err == nil {
|
2021-04-22 22:46:52 +02:00
|
|
|
found_exif = true
|
2021-03-28 23:52:51 +02:00
|
|
|
newExif.ExposureProgram = &expProgram
|
2021-03-20 00:26:05 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// GPS coordinates - longitude
|
2021-03-28 23:52:51 +02:00
|
|
|
longitudeRaw, err := fileInfo.GetFloat("GPSLongitude")
|
2021-03-20 00:26:05 +01:00
|
|
|
if err == nil {
|
2021-04-22 22:46:52 +02:00
|
|
|
found_exif = true
|
2021-03-28 23:52:51 +02:00
|
|
|
newExif.GPSLongitude = &longitudeRaw
|
2021-03-20 00:26:05 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// GPS coordinates - latitude
|
2021-03-28 23:52:51 +02:00
|
|
|
latitudeRaw, err := fileInfo.GetFloat("GPSLatitude")
|
2021-03-20 00:26:05 +01:00
|
|
|
if err == nil {
|
2021-04-22 22:46:52 +02:00
|
|
|
found_exif = true
|
2021-03-28 23:52:51 +02:00
|
|
|
newExif.GPSLatitude = &latitudeRaw
|
2021-03-20 00:26:05 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-04-22 22:46:52 +02:00
|
|
|
if !found_exif {
|
|
|
|
return nil, nil
|
|
|
|
}
|
|
|
|
|
2021-03-20 00:26:05 +01:00
|
|
|
returnExif = &newExif
|
|
|
|
return
|
|
|
|
}
|