photoprism/mediafile_exif.go

74 lines
1.3 KiB
Go
Raw Normal View History

2018-02-04 16:34:07 +00:00
package photoprism
import (
2018-02-28 09:08:49 +00:00
"errors"
2018-02-04 16:34:07 +00:00
"github.com/rwcarlsen/goexif/exif"
"github.com/rwcarlsen/goexif/mknote"
"strings"
2018-02-28 09:08:49 +00:00
"time"
2018-02-04 16:34:07 +00:00
)
type ExifData struct {
DateTime time.Time
CameraModel string
UniqueID string
2018-02-04 16:34:07 +00:00
Lat float64
Long float64
Thumbnail []byte
2018-02-04 16:34:07 +00:00
}
func (m *MediaFile) GetExifData() (*ExifData, error) {
if m == nil {
return nil, errors.New("media file is null")
2018-02-04 16:34:07 +00:00
}
if m.exifData != nil {
return m.exifData, nil
}
2018-02-04 16:34:07 +00:00
if !m.IsPhoto() {
return nil, errors.New("not a JPEG or Raw file")
2018-02-04 16:34:07 +00:00
}
m.exifData = &ExifData{}
2018-02-04 16:34:07 +00:00
file, err := m.openFile()
2018-02-04 16:34:07 +00:00
if err != nil {
return m.exifData, err
2018-02-04 16:34:07 +00:00
}
defer file.Close()
exif.RegisterParsers(mknote.All...)
x, err := exif.Decode(file)
if err != nil {
return m.exifData, err
}
if camModel, err := x.Get(exif.Model); err == nil {
m.exifData.CameraModel = strings.Replace(camModel.String(), "\"", "", -1)
}
if tm, err := x.DateTime(); err == nil {
m.exifData.DateTime = tm
2018-02-04 16:34:07 +00:00
}
if lat, long, err := x.LatLong(); err == nil {
m.exifData.Lat = lat
m.exifData.Long = long
}
2018-02-04 16:34:07 +00:00
if thumbnail, err := x.JpegThumbnail(); err == nil {
m.exifData.Thumbnail = thumbnail
}
2018-02-04 16:34:07 +00:00
if uniqueId, err := x.Get(exif.ImageUniqueID); err == nil {
m.exifData.UniqueID = uniqueId.String()
}
2018-02-04 16:34:07 +00:00
return m.exifData, nil
2018-02-28 09:08:49 +00:00
}