From 9497b017d9c1626156f5e54218e6c8de416a12e8 Mon Sep 17 00:00:00 2001 From: Fco Javier Felix Date: Sun, 23 Apr 2023 15:33:59 +0200 Subject: [PATCH 01/18] initial support for get date form GPS --- pkg/gopro/gopro.go | 9 +-- pkg/media/dates.go | 148 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 153 insertions(+), 4 deletions(-) create mode 100644 pkg/media/dates.go diff --git a/pkg/gopro/gopro.go b/pkg/gopro/gopro.go index a9a1ed8..27628c5 100644 --- a/pkg/gopro/gopro.go +++ b/pkg/gopro/gopro.go @@ -18,6 +18,7 @@ import ( "github.com/fatih/color" "github.com/karrick/godirwalk" mErrors "github.com/konradit/mmt/pkg/errors" + "github.com/konradit/mmt/pkg/media" "github.com/konradit/mmt/pkg/utils" "github.com/maja42/goval" "github.com/minio/minio/pkg/disk" @@ -159,8 +160,8 @@ folderLoop: continue fileTypeLoop } - d := getFileTime(osPathname, true) - mediaDate := getMediaDate(getFileTime(osPathname, true), params.DateFormat) + d := GetFileTime(osPathname, true) + mediaDate := GetMediaDate(getFileTime(osPathname, true), params.DateFormat) if d.Before(params.DateRange[0]) || d.After(params.DateRange[1]) { return godirwalk.SkipThis @@ -336,8 +337,8 @@ func importFromGoProV1(params utils.ImportParams) utils.Result { continue } - d := getFileTime(osPathname, true) - mediaDate := getMediaDate(d, params.DateFormat) + d := GetFileTime(osPathname, true) + mediaDate := GetMediaDate(d, params.DateFormat) if d.Before(params.DateRange[0]) || d.After(params.DateRange[1]) { return godirwalk.SkipThis diff --git a/pkg/media/dates.go b/pkg/media/dates.go new file mode 100644 index 0000000..97f0903 --- /dev/null +++ b/pkg/media/dates.go @@ -0,0 +1,148 @@ +package media + +import ( + "bytes" + "io" + "log" + "os" + "path/filepath" + "strings" + "time" + + "github.com/dsoprea/go-exif/v3" + "github.com/konradit/gopro-utils/telemetry" + mErrors "github.com/konradit/mmt/pkg/errors" + "github.com/konradit/mmt/pkg/utils" + "github.com/konradit/mmt/pkg/videomanipulation" + "github.com/rwcarlsen/goexif/exif" + "gopkg.in/djherbis/times.v1" +) + +func GetFileTimeExif(osPathname string) time.Time { + var date time.Time + + if strings.Contains(osPathname, ".WAV") { + osPathname = osPathname[:len(osPathname)-len(filepath.Ext(osPathname))] + ".MP4" + } + + t, err := times.Stat(osPathname) + if err != nil { + log.Fatal(err.Error()) + } + + d := t.ModTime() + + f, err := os.Open(osPathname) + if err != nil { + return d + } + defer f.Close() + x, err := exif.Decode(f) + if err != nil { + return d + } + + // First search in gps track + if strings.Contains(osPathname, ".MP4") { + err := GetTimeFromMP4(osPathname, &date) + if err == nil { + return date + } + } + + gpsDateTime := x.Get(FieldName("GPSDateStamp")) + " " + x.Get(FieldName("GPSTimeStamp")) + date, err = time.Parse("2006:01:02 15:04:05", gpsDateTime) + if err == nil { + return date + } + + // define the list of possible tags to extract date from + dateTags := []string{"DateTimeOriginal", "DateTime", "DateTimeDigitized"} + + // loop through the tags until a valid date is found + for _, tag := range dateTags { + if x.tagMap[tag] != nil && x.tagMap[tag] != "" { + date, err := time.Parse("2006:01:02 15:04:05", x.tagMap[tag]) + if err != nil { + continue + } + return date + } + } + + return d +} + +func GetFreeDiskSpace(path string) (uint64, error) { + var stat syscall.Statfs_t + err := syscall.Statfs(path, &stat) + if err != nil { + return 0, err + } + return stat.Bavail * uint64(stat.Bsize), nil +} + +func GetTimeFromMP4(videoPath string, date *time.Time) error { + vman := videomanipulation.New() + data, err := vman.ExtractGPMF(videoPath) + if err != nil { + return err + } + + reader := bytes.NewReader(*data) + + lastEvent := &telemetry.TELEM{} + + for { + event, err := telemetry.Read(reader) + if err != nil && err != io.EOF { + return err + } else if err == io.EOF || event == nil { + break + } + + if lastEvent.IsZero() { + *lastEvent = *event + event.Clear() + continue + } + + err = lastEvent.FillTimes(event.Time.Time) + if err != nil { + return err + } + + telems := lastEvent.ShitJson() + for _, telem := range telems { + if telem.Latitude != 0 && telem.Longitude != 0 { + *date = time.Unix(0, telem.TS) + + return nil + } + } + *lastEvent = *event + } + + return mErrors.ErrNoGPS +} + +func GetFileTime(osPathname string, utcFix bool) time.Time { + t := GetFileTimeExif(osPathname) + + if utcFix { + zoneName, _ := t.Zone() + newTime := strings.Replace(t.Format(time.UnixDate), zoneName, "UTC", -1) + t, _ = time.Parse(time.UnixDate, newTime) + } + + return t +} + +func GetMediaDate(d time.Time, dateFormat string) string { + mediaDate := d.Format("02-01-2006") + if strings.Contains(dateFormat, "yyyy") && strings.Contains(dateFormat, "mm") && strings.Contains(dateFormat, "dd") { + mediaDate = d.Format(utils.DateFormatReplacer.Replace(dateFormat)) + } + + return mediaDate +} From 315f05d88b765096d481632d1d6b2d420979cb99 Mon Sep 17 00:00:00 2001 From: Fco Javier Felix Date: Sun, 23 Apr 2023 16:27:07 +0200 Subject: [PATCH 02/18] resolve some bugs --- pkg/gopro/gopro.go | 8 ++++---- pkg/media/dates.go | 30 +++++++++++++++++------------- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/pkg/gopro/gopro.go b/pkg/gopro/gopro.go index 27628c5..439b820 100644 --- a/pkg/gopro/gopro.go +++ b/pkg/gopro/gopro.go @@ -160,8 +160,8 @@ folderLoop: continue fileTypeLoop } - d := GetFileTime(osPathname, true) - mediaDate := GetMediaDate(getFileTime(osPathname, true), params.DateFormat) + d := media.GetFileTime(osPathname, true) + mediaDate := media.GetMediaDate(getFileTime(osPathname, true), params.DateFormat) if d.Before(params.DateRange[0]) || d.After(params.DateRange[1]) { return godirwalk.SkipThis @@ -337,8 +337,8 @@ func importFromGoProV1(params utils.ImportParams) utils.Result { continue } - d := GetFileTime(osPathname, true) - mediaDate := GetMediaDate(d, params.DateFormat) + d := media.GetFileTime(osPathname, true) + mediaDate := media.GetMediaDate(d, params.DateFormat) if d.Before(params.DateRange[0]) || d.After(params.DateRange[1]) { return godirwalk.SkipThis diff --git a/pkg/media/dates.go b/pkg/media/dates.go index 97f0903..96281aa 100644 --- a/pkg/media/dates.go +++ b/pkg/media/dates.go @@ -50,7 +50,16 @@ func GetFileTimeExif(osPathname string) time.Time { } } - gpsDateTime := x.Get(FieldName("GPSDateStamp")) + " " + x.Get(FieldName("GPSTimeStamp")) + var gpsDateTime string + gpsDateStamp, _ := x.Get(exif.GPSDateStamp) + gpsTimeStamp, _ := x.Get(exif.GPSTimeStamp) + + gpsT, _ := gpsTimeStamp.StringVal() + gpsD, _ := gpsDateStamp.StringVal() + + gpsDateTime = gpsD + " " + gpsT + + // parse the string into time date, err = time.Parse("2006:01:02 15:04:05", gpsDateTime) if err == nil { return date @@ -59,10 +68,14 @@ func GetFileTimeExif(osPathname string) time.Time { // define the list of possible tags to extract date from dateTags := []string{"DateTimeOriginal", "DateTime", "DateTimeDigitized"} - // loop through the tags until a valid date is found + // loop for each tag and return the first valid date for _, tag := range dateTags { - if x.tagMap[tag] != nil && x.tagMap[tag] != "" { - date, err := time.Parse("2006:01:02 15:04:05", x.tagMap[tag]) + // get value of tag from exif + tt, err := x.Get(exif.FieldName(tag)) + + if err != nil { + tts, _ := tt.StringVal() + date, err = time.Parse("2006:01:02 15:04:05", tts) if err != nil { continue } @@ -73,15 +86,6 @@ func GetFileTimeExif(osPathname string) time.Time { return d } -func GetFreeDiskSpace(path string) (uint64, error) { - var stat syscall.Statfs_t - err := syscall.Statfs(path, &stat) - if err != nil { - return 0, err - } - return stat.Bavail * uint64(stat.Bsize), nil -} - func GetTimeFromMP4(videoPath string, date *time.Time) error { vman := videomanipulation.New() data, err := vman.ExtractGPMF(videoPath) From 5b2a0da481a3f47cfea68498639c2b12f4f1e39f Mon Sep 17 00:00:00 2001 From: Fco Javier Felix Date: Sun, 23 Apr 2023 17:56:04 +0200 Subject: [PATCH 03/18] Remove unused functions --- pkg/gopro/gopro.go | 26 +------------------------- pkg/media/dates.go | 2 -- 2 files changed, 1 insertion(+), 27 deletions(-) diff --git a/pkg/gopro/gopro.go b/pkg/gopro/gopro.go index 439b820..b8f3740 100644 --- a/pkg/gopro/gopro.go +++ b/pkg/gopro/gopro.go @@ -23,7 +23,6 @@ import ( "github.com/maja42/goval" "github.com/minio/minio/pkg/disk" "github.com/vbauerster/mpb/v8" - "gopkg.in/djherbis/times.v1" ) /* @@ -161,7 +160,7 @@ folderLoop: } d := media.GetFileTime(osPathname, true) - mediaDate := media.GetMediaDate(getFileTime(osPathname, true), params.DateFormat) + mediaDate := media.GetMediaDate(media.GetFileTime(osPathname, true), params.DateFormat) if d.Before(params.DateRange[0]) || d.After(params.DateRange[1]) { return godirwalk.SkipThis @@ -551,29 +550,6 @@ func readInfo(inBytes []byte) (*Info, error) { return &gpVersion, nil } -func getFileTime(osPathname string, utcFix bool) time.Time { - var d time.Time - t, err := times.Stat(osPathname) - if err != nil { - log.Fatal(err.Error()) - } - d = t.ModTime() - if utcFix { - zoneName, _ := d.Zone() - newTime := strings.Replace(d.Format(time.UnixDate), zoneName, "UTC", -1) - d, _ = time.Parse(time.UnixDate, newTime) - } - return d -} - -func getMediaDate(d time.Time, dateFormat string) string { - mediaDate := d.Format("02-01-2006") - if strings.Contains(dateFormat, "yyyy") && strings.Contains(dateFormat, "mm") && strings.Contains(dateFormat, "dd") { - mediaDate = d.Format(utils.DateFormatReplacer.Replace(dateFormat)) - } - return mediaDate -} - func parse(folder string, name string, osPathname string, bufferSize int, bar *mpb.Bar) error { if _, err := os.Stat(folder); os.IsNotExist(err) { mkdirerr := os.MkdirAll(folder, 0o755) diff --git a/pkg/media/dates.go b/pkg/media/dates.go index 96281aa..d9dc4d3 100644 --- a/pkg/media/dates.go +++ b/pkg/media/dates.go @@ -9,7 +9,6 @@ import ( "strings" "time" - "github.com/dsoprea/go-exif/v3" "github.com/konradit/gopro-utils/telemetry" mErrors "github.com/konradit/mmt/pkg/errors" "github.com/konradit/mmt/pkg/utils" @@ -72,7 +71,6 @@ func GetFileTimeExif(osPathname string) time.Time { for _, tag := range dateTags { // get value of tag from exif tt, err := x.Get(exif.FieldName(tag)) - if err != nil { tts, _ := tt.StringVal() date, err = time.Parse("2006:01:02 15:04:05", tts) From b98d36d64bfd9af207eb0cbcd11ca6f03807e6b5 Mon Sep 17 00:00:00 2001 From: Fco Javier Felix Date: Mon, 24 Apr 2023 18:50:03 +0200 Subject: [PATCH 04/18] continue work --- pkg/media/dates.go | 85 +++++++++++++++++++++++++++++++--------------- 1 file changed, 58 insertions(+), 27 deletions(-) diff --git a/pkg/media/dates.go b/pkg/media/dates.go index d9dc4d3..4a7a0ac 100644 --- a/pkg/media/dates.go +++ b/pkg/media/dates.go @@ -2,6 +2,7 @@ package media import ( "bytes" + "fmt" "io" "log" "os" @@ -10,13 +11,47 @@ import ( "time" "github.com/konradit/gopro-utils/telemetry" - mErrors "github.com/konradit/mmt/pkg/errors" "github.com/konradit/mmt/pkg/utils" "github.com/konradit/mmt/pkg/videomanipulation" "github.com/rwcarlsen/goexif/exif" "gopkg.in/djherbis/times.v1" ) +func GetGPSTime(x *exif.Exif, date *time.Time) bool { + var gpsDateTime string + + gpsDateStamp, err := x.Get(exif.GPSDateStamp) + if err != nil { + return false + } + gpsTimeStamp, err := x.Get(exif.GPSTimeStamp) + if err != nil { + return false + } + + gpsD, err := gpsDateStamp.StringVal() + if err != nil { + return false + } + gpsT, err := gpsTimeStamp.StringVal() + if err != nil { + return false + } + + gpsDateTime = gpsD + " " + gpsT + + fmt.Printf("gpsDateTime: %s", gpsDateTime) + + // parse the string into time + d, err := time.Parse("2006:01:02 15:04:05", gpsDateTime) + if err == nil { + *date = d + return true + } + + return false +} + func GetFileTimeExif(osPathname string) time.Time { var date time.Time @@ -31,6 +66,15 @@ func GetFileTimeExif(osPathname string) time.Time { d := t.ModTime() + // First search in gps track + if strings.Contains(osPathname, ".MP4") { + if GetTimeFromMP4(osPathname, &date) { + fmt.Fprintf(os.Stderr, fmt.Sprintf("mp4 gpsDateTime: %s \n", date)) + + return date + } + } + f, err := os.Open(osPathname) if err != nil { return d @@ -41,26 +85,8 @@ func GetFileTimeExif(osPathname string) time.Time { return d } - // First search in gps track - if strings.Contains(osPathname, ".MP4") { - err := GetTimeFromMP4(osPathname, &date) - if err == nil { - return date - } - } - - var gpsDateTime string - gpsDateStamp, _ := x.Get(exif.GPSDateStamp) - gpsTimeStamp, _ := x.Get(exif.GPSTimeStamp) - - gpsT, _ := gpsTimeStamp.StringVal() - gpsD, _ := gpsDateStamp.StringVal() - - gpsDateTime = gpsD + " " + gpsT - - // parse the string into time - date, err = time.Parse("2006:01:02 15:04:05", gpsDateTime) - if err == nil { + if GetGPSTime(x, &date) { + fmt.Fprintf(os.Stderr, fmt.Sprintf("gpstime gpsDateTime: %s \n", date)) return date } @@ -77,18 +103,21 @@ func GetFileTimeExif(osPathname string) time.Time { if err != nil { continue } + fmt.Fprintf(os.Stderr, fmt.Sprintf("exitf gpsDateTime: %s \n", date)) return date } } + fmt.Fprintf(os.Stderr, fmt.Sprintf("sin valor obtenido: %s \n", d)) + return d } -func GetTimeFromMP4(videoPath string, date *time.Time) error { +func GetTimeFromMP4(videoPath string, date *time.Time) bool { vman := videomanipulation.New() data, err := vman.ExtractGPMF(videoPath) if err != nil { - return err + return false } reader := bytes.NewReader(*data) @@ -98,7 +127,7 @@ func GetTimeFromMP4(videoPath string, date *time.Time) error { for { event, err := telemetry.Read(reader) if err != nil && err != io.EOF { - return err + return false } else if err == io.EOF || event == nil { break } @@ -111,21 +140,23 @@ func GetTimeFromMP4(videoPath string, date *time.Time) error { err = lastEvent.FillTimes(event.Time.Time) if err != nil { - return err + return false } telems := lastEvent.ShitJson() for _, telem := range telems { + fmt.Fprintf(os.Stderr, fmt.Sprintf("location: %f - %f \n", telem.Latitude, telem.Longitude)) + if telem.Latitude != 0 && telem.Longitude != 0 { *date = time.Unix(0, telem.TS) - return nil + return true } } *lastEvent = *event } - return mErrors.ErrNoGPS + return false } func GetFileTime(osPathname string, utcFix bool) time.Time { From d3005de73c932e1ddc652d6e95964df1ab294f25 Mon Sep 17 00:00:00 2001 From: Fco Javier Felix Date: Mon, 24 Apr 2023 20:26:19 +0200 Subject: [PATCH 05/18] fix time conversions --- pkg/media/dates.go | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/pkg/media/dates.go b/pkg/media/dates.go index 4a7a0ac..dc3ef22 100644 --- a/pkg/media/dates.go +++ b/pkg/media/dates.go @@ -33,14 +33,22 @@ func GetGPSTime(x *exif.Exif, date *time.Time) bool { if err != nil { return false } - gpsT, err := gpsTimeStamp.StringVal() + + // convert rational to string + gpsH, _, err := gpsTimeStamp.Rat2(0) + if err != nil { + return false + } + gpsM, _, err := gpsTimeStamp.Rat2(1) + if err != nil { + return false + } + gpsS, _, err := gpsTimeStamp.Rat2(2) if err != nil { return false } - gpsDateTime = gpsD + " " + gpsT - - fmt.Printf("gpsDateTime: %s", gpsDateTime) + gpsDateTime = fmt.Sprintf("%s %02d:%02d:%02d", gpsD, gpsH, gpsM, gpsS) // parse the string into time d, err := time.Parse("2006:01:02 15:04:05", gpsDateTime) @@ -69,8 +77,6 @@ func GetFileTimeExif(osPathname string) time.Time { // First search in gps track if strings.Contains(osPathname, ".MP4") { if GetTimeFromMP4(osPathname, &date) { - fmt.Fprintf(os.Stderr, fmt.Sprintf("mp4 gpsDateTime: %s \n", date)) - return date } } @@ -86,7 +92,6 @@ func GetFileTimeExif(osPathname string) time.Time { } if GetGPSTime(x, &date) { - fmt.Fprintf(os.Stderr, fmt.Sprintf("gpstime gpsDateTime: %s \n", date)) return date } @@ -103,13 +108,10 @@ func GetFileTimeExif(osPathname string) time.Time { if err != nil { continue } - fmt.Fprintf(os.Stderr, fmt.Sprintf("exitf gpsDateTime: %s \n", date)) return date } } - fmt.Fprintf(os.Stderr, fmt.Sprintf("sin valor obtenido: %s \n", d)) - return d } @@ -145,10 +147,8 @@ func GetTimeFromMP4(videoPath string, date *time.Time) bool { telems := lastEvent.ShitJson() for _, telem := range telems { - fmt.Fprintf(os.Stderr, fmt.Sprintf("location: %f - %f \n", telem.Latitude, telem.Longitude)) - if telem.Latitude != 0 && telem.Longitude != 0 { - *date = time.Unix(0, telem.TS) + *date = time.UnixMicro(telem.TS) return true } From b3fa66047e3e003211a8eed3fe8326e1d7ab1415 Mon Sep 17 00:00:00 2001 From: Fco Javier Felix Date: Sun, 23 Apr 2023 15:33:59 +0200 Subject: [PATCH 06/18] initial support for get date form GPS --- pkg/gopro/gopro.go | 9 +-- pkg/media/dates.go | 148 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 153 insertions(+), 4 deletions(-) create mode 100644 pkg/media/dates.go diff --git a/pkg/gopro/gopro.go b/pkg/gopro/gopro.go index ca1e535..c80baf0 100644 --- a/pkg/gopro/gopro.go +++ b/pkg/gopro/gopro.go @@ -18,6 +18,7 @@ import ( "github.com/fatih/color" "github.com/karrick/godirwalk" mErrors "github.com/konradit/mmt/pkg/errors" + "github.com/konradit/mmt/pkg/media" "github.com/konradit/mmt/pkg/utils" "github.com/maja42/goval" "github.com/minio/minio/pkg/disk" @@ -159,8 +160,8 @@ folderLoop: continue fileTypeLoop } - d := getFileTime(osPathname, true) - mediaDate := getMediaDate(getFileTime(osPathname, true), params.DateFormat) + d := GetFileTime(osPathname, true) + mediaDate := GetMediaDate(getFileTime(osPathname, true), params.DateFormat) if d.Before(params.DateRange[0]) || d.After(params.DateRange[1]) { return godirwalk.SkipThis @@ -336,8 +337,8 @@ func importFromGoProV1(params utils.ImportParams) utils.Result { continue } - d := getFileTime(osPathname, true) - mediaDate := getMediaDate(d, params.DateFormat) + d := GetFileTime(osPathname, true) + mediaDate := GetMediaDate(d, params.DateFormat) if d.Before(params.DateRange[0]) || d.After(params.DateRange[1]) { return godirwalk.SkipThis diff --git a/pkg/media/dates.go b/pkg/media/dates.go new file mode 100644 index 0000000..97f0903 --- /dev/null +++ b/pkg/media/dates.go @@ -0,0 +1,148 @@ +package media + +import ( + "bytes" + "io" + "log" + "os" + "path/filepath" + "strings" + "time" + + "github.com/dsoprea/go-exif/v3" + "github.com/konradit/gopro-utils/telemetry" + mErrors "github.com/konradit/mmt/pkg/errors" + "github.com/konradit/mmt/pkg/utils" + "github.com/konradit/mmt/pkg/videomanipulation" + "github.com/rwcarlsen/goexif/exif" + "gopkg.in/djherbis/times.v1" +) + +func GetFileTimeExif(osPathname string) time.Time { + var date time.Time + + if strings.Contains(osPathname, ".WAV") { + osPathname = osPathname[:len(osPathname)-len(filepath.Ext(osPathname))] + ".MP4" + } + + t, err := times.Stat(osPathname) + if err != nil { + log.Fatal(err.Error()) + } + + d := t.ModTime() + + f, err := os.Open(osPathname) + if err != nil { + return d + } + defer f.Close() + x, err := exif.Decode(f) + if err != nil { + return d + } + + // First search in gps track + if strings.Contains(osPathname, ".MP4") { + err := GetTimeFromMP4(osPathname, &date) + if err == nil { + return date + } + } + + gpsDateTime := x.Get(FieldName("GPSDateStamp")) + " " + x.Get(FieldName("GPSTimeStamp")) + date, err = time.Parse("2006:01:02 15:04:05", gpsDateTime) + if err == nil { + return date + } + + // define the list of possible tags to extract date from + dateTags := []string{"DateTimeOriginal", "DateTime", "DateTimeDigitized"} + + // loop through the tags until a valid date is found + for _, tag := range dateTags { + if x.tagMap[tag] != nil && x.tagMap[tag] != "" { + date, err := time.Parse("2006:01:02 15:04:05", x.tagMap[tag]) + if err != nil { + continue + } + return date + } + } + + return d +} + +func GetFreeDiskSpace(path string) (uint64, error) { + var stat syscall.Statfs_t + err := syscall.Statfs(path, &stat) + if err != nil { + return 0, err + } + return stat.Bavail * uint64(stat.Bsize), nil +} + +func GetTimeFromMP4(videoPath string, date *time.Time) error { + vman := videomanipulation.New() + data, err := vman.ExtractGPMF(videoPath) + if err != nil { + return err + } + + reader := bytes.NewReader(*data) + + lastEvent := &telemetry.TELEM{} + + for { + event, err := telemetry.Read(reader) + if err != nil && err != io.EOF { + return err + } else if err == io.EOF || event == nil { + break + } + + if lastEvent.IsZero() { + *lastEvent = *event + event.Clear() + continue + } + + err = lastEvent.FillTimes(event.Time.Time) + if err != nil { + return err + } + + telems := lastEvent.ShitJson() + for _, telem := range telems { + if telem.Latitude != 0 && telem.Longitude != 0 { + *date = time.Unix(0, telem.TS) + + return nil + } + } + *lastEvent = *event + } + + return mErrors.ErrNoGPS +} + +func GetFileTime(osPathname string, utcFix bool) time.Time { + t := GetFileTimeExif(osPathname) + + if utcFix { + zoneName, _ := t.Zone() + newTime := strings.Replace(t.Format(time.UnixDate), zoneName, "UTC", -1) + t, _ = time.Parse(time.UnixDate, newTime) + } + + return t +} + +func GetMediaDate(d time.Time, dateFormat string) string { + mediaDate := d.Format("02-01-2006") + if strings.Contains(dateFormat, "yyyy") && strings.Contains(dateFormat, "mm") && strings.Contains(dateFormat, "dd") { + mediaDate = d.Format(utils.DateFormatReplacer.Replace(dateFormat)) + } + + return mediaDate +} From 17eb38c132bfd942d242dfdb0b35e1999a0ed96a Mon Sep 17 00:00:00 2001 From: Fco Javier Felix Date: Sun, 23 Apr 2023 16:27:07 +0200 Subject: [PATCH 07/18] resolve some bugs --- pkg/gopro/gopro.go | 8 ++++---- pkg/media/dates.go | 30 +++++++++++++++++------------- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/pkg/gopro/gopro.go b/pkg/gopro/gopro.go index c80baf0..83c8d5d 100644 --- a/pkg/gopro/gopro.go +++ b/pkg/gopro/gopro.go @@ -160,8 +160,8 @@ folderLoop: continue fileTypeLoop } - d := GetFileTime(osPathname, true) - mediaDate := GetMediaDate(getFileTime(osPathname, true), params.DateFormat) + d := media.GetFileTime(osPathname, true) + mediaDate := media.GetMediaDate(getFileTime(osPathname, true), params.DateFormat) if d.Before(params.DateRange[0]) || d.After(params.DateRange[1]) { return godirwalk.SkipThis @@ -337,8 +337,8 @@ func importFromGoProV1(params utils.ImportParams) utils.Result { continue } - d := GetFileTime(osPathname, true) - mediaDate := GetMediaDate(d, params.DateFormat) + d := media.GetFileTime(osPathname, true) + mediaDate := media.GetMediaDate(d, params.DateFormat) if d.Before(params.DateRange[0]) || d.After(params.DateRange[1]) { return godirwalk.SkipThis diff --git a/pkg/media/dates.go b/pkg/media/dates.go index 97f0903..96281aa 100644 --- a/pkg/media/dates.go +++ b/pkg/media/dates.go @@ -50,7 +50,16 @@ func GetFileTimeExif(osPathname string) time.Time { } } - gpsDateTime := x.Get(FieldName("GPSDateStamp")) + " " + x.Get(FieldName("GPSTimeStamp")) + var gpsDateTime string + gpsDateStamp, _ := x.Get(exif.GPSDateStamp) + gpsTimeStamp, _ := x.Get(exif.GPSTimeStamp) + + gpsT, _ := gpsTimeStamp.StringVal() + gpsD, _ := gpsDateStamp.StringVal() + + gpsDateTime = gpsD + " " + gpsT + + // parse the string into time date, err = time.Parse("2006:01:02 15:04:05", gpsDateTime) if err == nil { return date @@ -59,10 +68,14 @@ func GetFileTimeExif(osPathname string) time.Time { // define the list of possible tags to extract date from dateTags := []string{"DateTimeOriginal", "DateTime", "DateTimeDigitized"} - // loop through the tags until a valid date is found + // loop for each tag and return the first valid date for _, tag := range dateTags { - if x.tagMap[tag] != nil && x.tagMap[tag] != "" { - date, err := time.Parse("2006:01:02 15:04:05", x.tagMap[tag]) + // get value of tag from exif + tt, err := x.Get(exif.FieldName(tag)) + + if err != nil { + tts, _ := tt.StringVal() + date, err = time.Parse("2006:01:02 15:04:05", tts) if err != nil { continue } @@ -73,15 +86,6 @@ func GetFileTimeExif(osPathname string) time.Time { return d } -func GetFreeDiskSpace(path string) (uint64, error) { - var stat syscall.Statfs_t - err := syscall.Statfs(path, &stat) - if err != nil { - return 0, err - } - return stat.Bavail * uint64(stat.Bsize), nil -} - func GetTimeFromMP4(videoPath string, date *time.Time) error { vman := videomanipulation.New() data, err := vman.ExtractGPMF(videoPath) From 3ce43d622f98b9a5ce88d6bbeb0ba106c1a0c166 Mon Sep 17 00:00:00 2001 From: Fco Javier Felix Date: Sun, 23 Apr 2023 17:56:04 +0200 Subject: [PATCH 08/18] Remove unused functions --- pkg/gopro/gopro.go | 28 ++-------------------------- pkg/media/dates.go | 2 -- 2 files changed, 2 insertions(+), 28 deletions(-) diff --git a/pkg/gopro/gopro.go b/pkg/gopro/gopro.go index 83c8d5d..72a9952 100644 --- a/pkg/gopro/gopro.go +++ b/pkg/gopro/gopro.go @@ -23,7 +23,6 @@ import ( "github.com/maja42/goval" "github.com/minio/minio/pkg/disk" "github.com/vbauerster/mpb/v8" - "gopkg.in/djherbis/times.v1" ) /* @@ -161,7 +160,7 @@ folderLoop: } d := media.GetFileTime(osPathname, true) - mediaDate := media.GetMediaDate(getFileTime(osPathname, true), params.DateFormat) + mediaDate := media.GetMediaDate(media.GetFileTime(osPathname, true), params.DateFormat) if d.Before(params.DateRange[0]) || d.After(params.DateRange[1]) { return godirwalk.SkipThis @@ -294,7 +293,7 @@ folderLoop: inlineCounter.SetFailure(err, "") } } - +,d wg.Wait() progressBar.Shutdown() @@ -551,29 +550,6 @@ func readInfo(inBytes []byte) (*Info, error) { return &gpVersion, nil } -func getFileTime(osPathname string, utcFix bool) time.Time { - var d time.Time - t, err := times.Stat(osPathname) - if err != nil { - log.Fatal(err.Error()) - } - d = t.ModTime() - if utcFix { - zoneName, _ := d.Zone() - newTime := strings.Replace(d.Format(time.UnixDate), zoneName, "UTC", -1) - d, _ = time.Parse(time.UnixDate, newTime) - } - return d -} - -func getMediaDate(d time.Time, dateFormat string) string { - mediaDate := d.Format("02-01-2006") - if strings.Contains(dateFormat, "yyyy") && strings.Contains(dateFormat, "mm") && strings.Contains(dateFormat, "dd") { - mediaDate = d.Format(utils.DateFormatReplacer.Replace(dateFormat)) - } - return mediaDate -} - func parse(folder string, name string, osPathname string, bufferSize int, bar *mpb.Bar, modTime time.Time) error { if _, err := os.Stat(folder); os.IsNotExist(err) { mkdirerr := os.MkdirAll(folder, 0o755) diff --git a/pkg/media/dates.go b/pkg/media/dates.go index 96281aa..d9dc4d3 100644 --- a/pkg/media/dates.go +++ b/pkg/media/dates.go @@ -9,7 +9,6 @@ import ( "strings" "time" - "github.com/dsoprea/go-exif/v3" "github.com/konradit/gopro-utils/telemetry" mErrors "github.com/konradit/mmt/pkg/errors" "github.com/konradit/mmt/pkg/utils" @@ -72,7 +71,6 @@ func GetFileTimeExif(osPathname string) time.Time { for _, tag := range dateTags { // get value of tag from exif tt, err := x.Get(exif.FieldName(tag)) - if err != nil { tts, _ := tt.StringVal() date, err = time.Parse("2006:01:02 15:04:05", tts) From da840a2595ef64cd4c2e7c6912887a1895438b33 Mon Sep 17 00:00:00 2001 From: Fco Javier Felix Date: Mon, 24 Apr 2023 18:50:03 +0200 Subject: [PATCH 09/18] continue work --- pkg/media/dates.go | 85 +++++++++++++++++++++++++++++++--------------- 1 file changed, 58 insertions(+), 27 deletions(-) diff --git a/pkg/media/dates.go b/pkg/media/dates.go index d9dc4d3..4a7a0ac 100644 --- a/pkg/media/dates.go +++ b/pkg/media/dates.go @@ -2,6 +2,7 @@ package media import ( "bytes" + "fmt" "io" "log" "os" @@ -10,13 +11,47 @@ import ( "time" "github.com/konradit/gopro-utils/telemetry" - mErrors "github.com/konradit/mmt/pkg/errors" "github.com/konradit/mmt/pkg/utils" "github.com/konradit/mmt/pkg/videomanipulation" "github.com/rwcarlsen/goexif/exif" "gopkg.in/djherbis/times.v1" ) +func GetGPSTime(x *exif.Exif, date *time.Time) bool { + var gpsDateTime string + + gpsDateStamp, err := x.Get(exif.GPSDateStamp) + if err != nil { + return false + } + gpsTimeStamp, err := x.Get(exif.GPSTimeStamp) + if err != nil { + return false + } + + gpsD, err := gpsDateStamp.StringVal() + if err != nil { + return false + } + gpsT, err := gpsTimeStamp.StringVal() + if err != nil { + return false + } + + gpsDateTime = gpsD + " " + gpsT + + fmt.Printf("gpsDateTime: %s", gpsDateTime) + + // parse the string into time + d, err := time.Parse("2006:01:02 15:04:05", gpsDateTime) + if err == nil { + *date = d + return true + } + + return false +} + func GetFileTimeExif(osPathname string) time.Time { var date time.Time @@ -31,6 +66,15 @@ func GetFileTimeExif(osPathname string) time.Time { d := t.ModTime() + // First search in gps track + if strings.Contains(osPathname, ".MP4") { + if GetTimeFromMP4(osPathname, &date) { + fmt.Fprintf(os.Stderr, fmt.Sprintf("mp4 gpsDateTime: %s \n", date)) + + return date + } + } + f, err := os.Open(osPathname) if err != nil { return d @@ -41,26 +85,8 @@ func GetFileTimeExif(osPathname string) time.Time { return d } - // First search in gps track - if strings.Contains(osPathname, ".MP4") { - err := GetTimeFromMP4(osPathname, &date) - if err == nil { - return date - } - } - - var gpsDateTime string - gpsDateStamp, _ := x.Get(exif.GPSDateStamp) - gpsTimeStamp, _ := x.Get(exif.GPSTimeStamp) - - gpsT, _ := gpsTimeStamp.StringVal() - gpsD, _ := gpsDateStamp.StringVal() - - gpsDateTime = gpsD + " " + gpsT - - // parse the string into time - date, err = time.Parse("2006:01:02 15:04:05", gpsDateTime) - if err == nil { + if GetGPSTime(x, &date) { + fmt.Fprintf(os.Stderr, fmt.Sprintf("gpstime gpsDateTime: %s \n", date)) return date } @@ -77,18 +103,21 @@ func GetFileTimeExif(osPathname string) time.Time { if err != nil { continue } + fmt.Fprintf(os.Stderr, fmt.Sprintf("exitf gpsDateTime: %s \n", date)) return date } } + fmt.Fprintf(os.Stderr, fmt.Sprintf("sin valor obtenido: %s \n", d)) + return d } -func GetTimeFromMP4(videoPath string, date *time.Time) error { +func GetTimeFromMP4(videoPath string, date *time.Time) bool { vman := videomanipulation.New() data, err := vman.ExtractGPMF(videoPath) if err != nil { - return err + return false } reader := bytes.NewReader(*data) @@ -98,7 +127,7 @@ func GetTimeFromMP4(videoPath string, date *time.Time) error { for { event, err := telemetry.Read(reader) if err != nil && err != io.EOF { - return err + return false } else if err == io.EOF || event == nil { break } @@ -111,21 +140,23 @@ func GetTimeFromMP4(videoPath string, date *time.Time) error { err = lastEvent.FillTimes(event.Time.Time) if err != nil { - return err + return false } telems := lastEvent.ShitJson() for _, telem := range telems { + fmt.Fprintf(os.Stderr, fmt.Sprintf("location: %f - %f \n", telem.Latitude, telem.Longitude)) + if telem.Latitude != 0 && telem.Longitude != 0 { *date = time.Unix(0, telem.TS) - return nil + return true } } *lastEvent = *event } - return mErrors.ErrNoGPS + return false } func GetFileTime(osPathname string, utcFix bool) time.Time { From 6bbdccb36d12effb44e8ccc39e5493df5d4af7f7 Mon Sep 17 00:00:00 2001 From: Fco Javier Felix Date: Mon, 24 Apr 2023 20:26:19 +0200 Subject: [PATCH 10/18] fix time conversions --- pkg/media/dates.go | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/pkg/media/dates.go b/pkg/media/dates.go index 4a7a0ac..dc3ef22 100644 --- a/pkg/media/dates.go +++ b/pkg/media/dates.go @@ -33,14 +33,22 @@ func GetGPSTime(x *exif.Exif, date *time.Time) bool { if err != nil { return false } - gpsT, err := gpsTimeStamp.StringVal() + + // convert rational to string + gpsH, _, err := gpsTimeStamp.Rat2(0) + if err != nil { + return false + } + gpsM, _, err := gpsTimeStamp.Rat2(1) + if err != nil { + return false + } + gpsS, _, err := gpsTimeStamp.Rat2(2) if err != nil { return false } - gpsDateTime = gpsD + " " + gpsT - - fmt.Printf("gpsDateTime: %s", gpsDateTime) + gpsDateTime = fmt.Sprintf("%s %02d:%02d:%02d", gpsD, gpsH, gpsM, gpsS) // parse the string into time d, err := time.Parse("2006:01:02 15:04:05", gpsDateTime) @@ -69,8 +77,6 @@ func GetFileTimeExif(osPathname string) time.Time { // First search in gps track if strings.Contains(osPathname, ".MP4") { if GetTimeFromMP4(osPathname, &date) { - fmt.Fprintf(os.Stderr, fmt.Sprintf("mp4 gpsDateTime: %s \n", date)) - return date } } @@ -86,7 +92,6 @@ func GetFileTimeExif(osPathname string) time.Time { } if GetGPSTime(x, &date) { - fmt.Fprintf(os.Stderr, fmt.Sprintf("gpstime gpsDateTime: %s \n", date)) return date } @@ -103,13 +108,10 @@ func GetFileTimeExif(osPathname string) time.Time { if err != nil { continue } - fmt.Fprintf(os.Stderr, fmt.Sprintf("exitf gpsDateTime: %s \n", date)) return date } } - fmt.Fprintf(os.Stderr, fmt.Sprintf("sin valor obtenido: %s \n", d)) - return d } @@ -145,10 +147,8 @@ func GetTimeFromMP4(videoPath string, date *time.Time) bool { telems := lastEvent.ShitJson() for _, telem := range telems { - fmt.Fprintf(os.Stderr, fmt.Sprintf("location: %f - %f \n", telem.Latitude, telem.Longitude)) - if telem.Latitude != 0 && telem.Longitude != 0 { - *date = time.Unix(0, telem.TS) + *date = time.UnixMicro(telem.TS) return true } From 168de4536de76dfab1836f0fa97681015e1fe940 Mon Sep 17 00:00:00 2001 From: Fco Javier Felix Date: Mon, 24 Apr 2023 20:41:49 +0200 Subject: [PATCH 11/18] fix keep time --- pkg/gopro/gopro.go | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/pkg/gopro/gopro.go b/pkg/gopro/gopro.go index b8f3740..b2ea6b1 100644 --- a/pkg/gopro/gopro.go +++ b/pkg/gopro/gopro.go @@ -197,7 +197,7 @@ folderLoop: folder := filepath.Join(dayFolder, "videos", additionalDir, rfpsFolder) go func(folder, filename, osPathname string, bar *mpb.Bar) { defer wg.Done() - err := parse(folder, filename, osPathname, params.BufferSize, bar) + err := parse(folder, filename, osPathname, params.BufferSize, bar, d) if err != nil { inlineCounter.SetFailure(err, filename) } else { @@ -222,7 +222,7 @@ folderLoop: go func(folder, filename, osPathname string, bar *mpb.Bar) { defer wg.Done() - _ = parse(folder, filename, osPathname, params.BufferSize, bar) + _ = parse(folder, filename, osPathname, params.BufferSize, bar, d) }(folder, filename, lrvFullpath, proxyVideoBar) case Photo: additionalDir := "" @@ -232,7 +232,7 @@ folderLoop: folder := filepath.Join(dayFolder, "photos", additionalDir) go func(folder, filename, osPathname string, bar *mpb.Bar) { defer wg.Done() - err := parse(folder, filename, osPathname, params.BufferSize, bar) + err := parse(folder, filename, osPathname, params.BufferSize, bar, d) if err != nil { inlineCounter.SetFailure(err, filename) } else { @@ -248,7 +248,7 @@ folderLoop: folder := filepath.Join(dayFolder, "multishot", additionalDir, de.Name()[:4]) go func(folder, filename, osPathname string, bar *mpb.Bar) { defer wg.Done() - err := parse(folder, filename, osPathname, params.BufferSize, bar) + err := parse(folder, filename, osPathname, params.BufferSize, bar, d) if err != nil { inlineCounter.SetFailure(err, filename) } else { @@ -260,7 +260,7 @@ folderLoop: folder := filepath.Join(dayFolder, "photos/raw") go func(folder, filename, osPathname string, bar *mpb.Bar) { defer wg.Done() - err := parse(folder, filename, osPathname, params.BufferSize, bar) + err := parse(folder, filename, osPathname, params.BufferSize, bar, d) if err != nil { inlineCounter.SetFailure(err, filename) } else { @@ -272,7 +272,7 @@ folderLoop: folder := filepath.Join(dayFolder, "audios") go func(folder, filename, osPathname string, bar *mpb.Bar) { defer wg.Done() - err := parse(folder, filename, osPathname, params.BufferSize, bar) + err := parse(folder, filename, osPathname, params.BufferSize, bar, d) if err != nil { inlineCounter.SetFailure(err, filename) } else { @@ -379,7 +379,7 @@ func importFromGoProV1(params utils.ImportParams) utils.Result { folder := filepath.Join(dayFolder, "videos", additionalDir, rfpsFolder) go func(folder, filename, osPathname string, bar *mpb.Bar) { defer wg.Done() - err := parse(folder, filename, osPathname, params.BufferSize, bar) + err := parse(folder, filename, osPathname, params.BufferSize, bar, d) if err != nil { inlineCounter.SetFailure(err, filename) } else { @@ -402,7 +402,7 @@ func importFromGoProV1(params utils.ImportParams) utils.Result { go func(folder, filename, osPathname string, bar *mpb.Bar) { defer wg.Done() - _ = parse(folder, filename, osPathname, params.BufferSize, bar) + _ = parse(folder, filename, osPathname, params.BufferSize, bar, d) }(folder, x, lrvFullpath, proxyVideoBar) case ChapteredVideo: @@ -426,7 +426,7 @@ func importFromGoProV1(params utils.ImportParams) utils.Result { folder := filepath.Join(dayFolder, "videos", additionalDir, rfpsFolder) go func(folder, filename, osPathname string, bar *mpb.Bar) { defer wg.Done() - err := parse(folder, filename, osPathname, params.BufferSize, bar) + err := parse(folder, filename, osPathname, params.BufferSize, bar, d) if err != nil { inlineCounter.SetFailure(err, filename) } else { @@ -455,7 +455,7 @@ func importFromGoProV1(params utils.ImportParams) utils.Result { folder := filepath.Join(dayFolder, "photos") go func(folder, filename, osPathname string, bar *mpb.Bar) { defer wg.Done() - err := parse(folder, filename, osPathname, params.BufferSize, bar) + err := parse(folder, filename, osPathname, params.BufferSize, bar, d) if err != nil { inlineCounter.SetFailure(err, filename) } else { @@ -470,7 +470,7 @@ func importFromGoProV1(params utils.ImportParams) utils.Result { folder := filepath.Join(dayFolder, "videos/proxy") go func(folder, filename, osPathname string, bar *mpb.Bar) { defer wg.Done() - err := parse(folder, filename, osPathname, params.BufferSize, bar) + err := parse(folder, filename, osPathname, params.BufferSize, bar, d) if err != nil { inlineCounter.SetFailure(err, filename) } else { @@ -482,7 +482,7 @@ func importFromGoProV1(params utils.ImportParams) utils.Result { folder := filepath.Join(dayFolder, "multishot", de.Name()[:4]) go func(folder, filename, osPathname string, bar *mpb.Bar) { defer wg.Done() - err := parse(folder, filename, osPathname, params.BufferSize, bar) + err := parse(folder, filename, osPathname, params.BufferSize, bar, d) if err != nil { inlineCounter.SetFailure(err, filename) } else { @@ -494,7 +494,7 @@ func importFromGoProV1(params utils.ImportParams) utils.Result { folder := filepath.Join(dayFolder, "photos/raw") go func(folder, filename, osPathname string, bar *mpb.Bar) { defer wg.Done() - err := parse(folder, filename, osPathname, params.BufferSize, bar) + err := parse(folder, filename, osPathname, params.BufferSize, bar, d) if err != nil { inlineCounter.SetFailure(err, filename) } else { @@ -550,7 +550,7 @@ func readInfo(inBytes []byte) (*Info, error) { return &gpVersion, nil } -func parse(folder string, name string, osPathname string, bufferSize int, bar *mpb.Bar) error { +func parse(folder string, name string, osPathname string, bufferSize int, bar *mpb.Bar, modTime time.Time) error { if _, err := os.Stat(folder); os.IsNotExist(err) { mkdirerr := os.MkdirAll(folder, 0o755) if mkdirerr != nil { @@ -562,7 +562,7 @@ func parse(folder string, name string, osPathname string, bufferSize int, bar *m return err } - err = utils.CopyFile(osPathname, filepath.Join(folder, name), bufferSize, bar) + err = utils.CopyFile(osPathname, filepath.Join(folder, name), bufferSize, bar, modTime) if err != nil { bar.EwmaSetCurrent(sourceFileStat.Size(), 1*time.Millisecond) bar.EwmaIncrInt64(sourceFileStat.Size(), 1*time.Millisecond) From 2a55623a5adc5f9943777f7e681db27a544a3d6c Mon Sep 17 00:00:00 2001 From: Fco Javier Felix Date: Mon, 24 Apr 2023 20:42:30 +0200 Subject: [PATCH 12/18] fix keep time --- pkg/gopro/gopro.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/gopro/gopro.go b/pkg/gopro/gopro.go index b2ea6b1..c31c6db 100644 --- a/pkg/gopro/gopro.go +++ b/pkg/gopro/gopro.go @@ -449,7 +449,7 @@ func importFromGoProV1(params utils.ImportParams) utils.Result { go func(folder, filename, osPathname string, bar *mpb.Bar) { defer wg.Done() - _ = parse(folder, filename, osPathname, params.BufferSize, bar) + _ = parse(folder, filename, osPathname, params.BufferSize, bar, d) }(folder, x, lrvFullpath, proxyVideoBar) case Photo: folder := filepath.Join(dayFolder, "photos") From 6af48165cc07297ba3d6bd38fc279e19b02f6107 Mon Sep 17 00:00:00 2001 From: Fco Javier Felix Date: Tue, 25 Apr 2023 07:48:54 +0200 Subject: [PATCH 13/18] Complete migration to new system for dji and insta360 --- pkg/dji/dji.go | 15 +++------------ pkg/insta360/insta360.go | 16 +++------------- 2 files changed, 6 insertions(+), 25 deletions(-) diff --git a/pkg/dji/dji.go b/pkg/dji/dji.go index ef0c0e5..a5082af 100644 --- a/pkg/dji/dji.go +++ b/pkg/dji/dji.go @@ -6,18 +6,17 @@ import ( "os" "path/filepath" "regexp" - "strings" "sync" "time" "github.com/dustin/go-humanize" "github.com/fatih/color" "github.com/karrick/godirwalk" + "github.com/konradit/mmt/pkg/media" "github.com/konradit/mmt/pkg/utils" "github.com/minio/minio/pkg/disk" "github.com/rwcarlsen/goexif/exif" "github.com/vbauerster/mpb/v8" - "gopkg.in/djherbis/times.v1" ) func getDeviceNameFromPhoto(path string) (string, error) { //nolint:unused @@ -97,19 +96,11 @@ func (Entrypoint) Import(params utils.ImportParams) (*utils.Result, error) { if !ftype.Regex.MatchString(de.Name()) { continue } - t, err := times.Stat(osPathname) - if err != nil { - return godirwalk.SkipThis - } - d := t.ModTime() - mediaDate := d.Format("02-01-2006") - if strings.Contains(params.DateFormat, "yyyy") && strings.Contains(params.DateFormat, "mm") && strings.Contains(params.DateFormat, "dd") { - mediaDate = d.Format(utils.DateFormatReplacer.Replace(params.DateFormat)) - } + d := media.GetFileTime(osPathname, true) + mediaDate := media.GetMediaDate(d, params.DateFormat) // check if is in date range - if d.Before(params.DateRange[0]) || d.After(params.DateRange[1]) { return godirwalk.SkipThis } diff --git a/pkg/insta360/insta360.go b/pkg/insta360/insta360.go index 14195ae..b713719 100644 --- a/pkg/insta360/insta360.go +++ b/pkg/insta360/insta360.go @@ -8,17 +8,16 @@ import ( "os" "path/filepath" "regexp" - "strings" "sync" "time" "github.com/dustin/go-humanize" "github.com/fatih/color" "github.com/karrick/godirwalk" + "github.com/konradit/mmt/pkg/media" "github.com/konradit/mmt/pkg/utils" "github.com/minio/minio/pkg/disk" "github.com/vbauerster/mpb/v8" - "gopkg.in/djherbis/times.v1" ) func getDeviceName(manifest string) string { @@ -91,20 +90,11 @@ func (Entrypoint) Import(params utils.ImportParams) (*utils.Result, error) { if !ftype.Regex.MatchString(de.Name()) { continue } - t, err := times.Stat(osPathname) - if err != nil { - return godirwalk.SkipThis - } - d := t.ModTime() - - mediaDate := d.Format("02-01-2006") - if strings.Contains(params.DateFormat, "yyyy") && strings.Contains(params.DateFormat, "mm") && strings.Contains(params.DateFormat, "dd") { - mediaDate = d.Format(utils.DateFormatReplacer.Replace(params.DateFormat)) - } + d := media.GetFileTime(osPathname, true) + mediaDate := media.GetMediaDate(d, params.DateFormat) // check if is in date range - if d.Before(params.DateRange[0]) || d.After(params.DateRange[1]) { return godirwalk.SkipThis } From f802882c2b0fac2d310c2aae31dc8804dc214322 Mon Sep 17 00:00:00 2001 From: Fco Javier Felix Date: Tue, 25 Apr 2023 12:28:38 +0200 Subject: [PATCH 14/18] Make function private getTimeFromMP4 --- pkg/media/dates.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/media/dates.go b/pkg/media/dates.go index dc3ef22..479df54 100644 --- a/pkg/media/dates.go +++ b/pkg/media/dates.go @@ -76,7 +76,7 @@ func GetFileTimeExif(osPathname string) time.Time { // First search in gps track if strings.Contains(osPathname, ".MP4") { - if GetTimeFromMP4(osPathname, &date) { + if getTimeFromMP4(osPathname, &date) { return date } } @@ -115,7 +115,7 @@ func GetFileTimeExif(osPathname string) time.Time { return d } -func GetTimeFromMP4(videoPath string, date *time.Time) bool { +func getTimeFromMP4(videoPath string, date *time.Time) bool { vman := videomanipulation.New() data, err := vman.ExtractGPMF(videoPath) if err != nil { From 8b993385ba30f851e1c51cb665561be7bc932fc4 Mon Sep 17 00:00:00 2001 From: Fco Javier Felix Date: Tue, 25 Apr 2023 12:29:12 +0200 Subject: [PATCH 15/18] Make function private getFileTimeExif --- pkg/media/dates.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/media/dates.go b/pkg/media/dates.go index 479df54..da0e055 100644 --- a/pkg/media/dates.go +++ b/pkg/media/dates.go @@ -60,7 +60,7 @@ func GetGPSTime(x *exif.Exif, date *time.Time) bool { return false } -func GetFileTimeExif(osPathname string) time.Time { +func getFileTimeExif(osPathname string) time.Time { var date time.Time if strings.Contains(osPathname, ".WAV") { @@ -160,7 +160,7 @@ func getTimeFromMP4(videoPath string, date *time.Time) bool { } func GetFileTime(osPathname string, utcFix bool) time.Time { - t := GetFileTimeExif(osPathname) + t := getFileTimeExif(osPathname) if utcFix { zoneName, _ := t.Zone() From 478f060adab663fa96cedceb9b875333654c6e18 Mon Sep 17 00:00:00 2001 From: Fco Javier Felix Date: Tue, 25 Apr 2023 12:29:36 +0200 Subject: [PATCH 16/18] Make function private getGPSTime --- pkg/media/dates.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/media/dates.go b/pkg/media/dates.go index da0e055..09efb6b 100644 --- a/pkg/media/dates.go +++ b/pkg/media/dates.go @@ -17,7 +17,7 @@ import ( "gopkg.in/djherbis/times.v1" ) -func GetGPSTime(x *exif.Exif, date *time.Time) bool { +func getGPSTime(x *exif.Exif, date *time.Time) bool { var gpsDateTime string gpsDateStamp, err := x.Get(exif.GPSDateStamp) @@ -91,7 +91,7 @@ func getFileTimeExif(osPathname string) time.Time { return d } - if GetGPSTime(x, &date) { + if getGPSTime(x, &date) { return date } From d49fd8dc3aa954c61cf75c2a314bfb3215a8144f Mon Sep 17 00:00:00 2001 From: Fco Javier Felix Date: Tue, 25 Apr 2023 12:59:13 +0200 Subject: [PATCH 17/18] Include support for gopro specific process --- pkg/dji/dji.go | 2 +- pkg/gopro/gopro.go | 6 +++--- pkg/insta360/insta360.go | 2 +- pkg/media/dates.go | 8 ++++---- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/pkg/dji/dji.go b/pkg/dji/dji.go index a5082af..838b9b5 100644 --- a/pkg/dji/dji.go +++ b/pkg/dji/dji.go @@ -97,7 +97,7 @@ func (Entrypoint) Import(params utils.ImportParams) (*utils.Result, error) { continue } - d := media.GetFileTime(osPathname, true) + d := media.GetFileTime(osPathname, true, false) mediaDate := media.GetMediaDate(d, params.DateFormat) // check if is in date range diff --git a/pkg/gopro/gopro.go b/pkg/gopro/gopro.go index c31c6db..23f636f 100644 --- a/pkg/gopro/gopro.go +++ b/pkg/gopro/gopro.go @@ -159,8 +159,8 @@ folderLoop: continue fileTypeLoop } - d := media.GetFileTime(osPathname, true) - mediaDate := media.GetMediaDate(media.GetFileTime(osPathname, true), params.DateFormat) + d := media.GetFileTime(osPathname, true, true) + mediaDate := media.GetMediaDate(media.GetFileTime(osPathname, true, true), params.DateFormat) if d.Before(params.DateRange[0]) || d.After(params.DateRange[1]) { return godirwalk.SkipThis @@ -336,7 +336,7 @@ func importFromGoProV1(params utils.ImportParams) utils.Result { continue } - d := media.GetFileTime(osPathname, true) + d := media.GetFileTime(osPathname, true, true) mediaDate := media.GetMediaDate(d, params.DateFormat) if d.Before(params.DateRange[0]) || d.After(params.DateRange[1]) { diff --git a/pkg/insta360/insta360.go b/pkg/insta360/insta360.go index b713719..e52d17a 100644 --- a/pkg/insta360/insta360.go +++ b/pkg/insta360/insta360.go @@ -91,7 +91,7 @@ func (Entrypoint) Import(params utils.ImportParams) (*utils.Result, error) { continue } - d := media.GetFileTime(osPathname, true) + d := media.GetFileTime(osPathname, true, false) mediaDate := media.GetMediaDate(d, params.DateFormat) // check if is in date range diff --git a/pkg/media/dates.go b/pkg/media/dates.go index 09efb6b..ba55c91 100644 --- a/pkg/media/dates.go +++ b/pkg/media/dates.go @@ -60,7 +60,7 @@ func getGPSTime(x *exif.Exif, date *time.Time) bool { return false } -func getFileTimeExif(osPathname string) time.Time { +func getFileTimeExif(osPathname string, goPro bool) time.Time { var date time.Time if strings.Contains(osPathname, ".WAV") { @@ -75,7 +75,7 @@ func getFileTimeExif(osPathname string) time.Time { d := t.ModTime() // First search in gps track - if strings.Contains(osPathname, ".MP4") { + if goPro && strings.Contains(osPathname, ".MP4") { if getTimeFromMP4(osPathname, &date) { return date } @@ -159,8 +159,8 @@ func getTimeFromMP4(videoPath string, date *time.Time) bool { return false } -func GetFileTime(osPathname string, utcFix bool) time.Time { - t := getFileTimeExif(osPathname) +func GetFileTime(osPathname string, utcFix bool, goPro bool) time.Time { + t := getFileTimeExif(osPathname, goPro) if utcFix { zoneName, _ := t.Zone() From 13180f4219c473c3e80948a70fcbf64770c47ff0 Mon Sep 17 00:00:00 2001 From: Fco Javier Felix Date: Tue, 25 Apr 2023 12:59:41 +0200 Subject: [PATCH 18/18] remove utcfix from insta360 and dji --- pkg/dji/dji.go | 2 +- pkg/insta360/insta360.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/dji/dji.go b/pkg/dji/dji.go index 838b9b5..5d497d2 100644 --- a/pkg/dji/dji.go +++ b/pkg/dji/dji.go @@ -97,7 +97,7 @@ func (Entrypoint) Import(params utils.ImportParams) (*utils.Result, error) { continue } - d := media.GetFileTime(osPathname, true, false) + d := media.GetFileTime(osPathname, false, false) mediaDate := media.GetMediaDate(d, params.DateFormat) // check if is in date range diff --git a/pkg/insta360/insta360.go b/pkg/insta360/insta360.go index e52d17a..f2c02b6 100644 --- a/pkg/insta360/insta360.go +++ b/pkg/insta360/insta360.go @@ -91,7 +91,7 @@ func (Entrypoint) Import(params utils.ImportParams) (*utils.Result, error) { continue } - d := media.GetFileTime(osPathname, true, false) + d := media.GetFileTime(osPathname, false, false) mediaDate := media.GetMediaDate(d, params.DateFormat) // check if is in date range