From 11d67c9ae972c3ede87fae7ccefd0b449fe545f5 Mon Sep 17 00:00:00 2001 From: sean borg Date: Mon, 16 Nov 2020 20:57:34 +0000 Subject: [PATCH] Add sidecar path & hash to DB --- .../003_sar_side_car_files.down.sql | 4 ++ .../migrations/003_sar_side_car_files.up.sql | 4 ++ api/graphql/models/media.go | 6 ++- api/scanner/scanner_media.go | 51 ++++++++++++++++++- 4 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 api/database/migrations/003_sar_side_car_files.down.sql create mode 100644 api/database/migrations/003_sar_side_car_files.up.sql diff --git a/api/database/migrations/003_sar_side_car_files.down.sql b/api/database/migrations/003_sar_side_car_files.down.sql new file mode 100644 index 00000000..12005bf2 --- /dev/null +++ b/api/database/migrations/003_sar_side_car_files.down.sql @@ -0,0 +1,4 @@ + +ALTER TABLE media + DROP COLUMN IF EXISTS side_car_path, + DROP COLUMN IF EXISTS side_car_hash; diff --git a/api/database/migrations/003_sar_side_car_files.up.sql b/api/database/migrations/003_sar_side_car_files.up.sql new file mode 100644 index 00000000..635f3513 --- /dev/null +++ b/api/database/migrations/003_sar_side_car_files.up.sql @@ -0,0 +1,4 @@ + +ALTER TABLE media + ADD COLUMN IF NOT EXISTS side_car_path varchar(1024) DEFAULT NULL, + ADD COLUMN IF NOT EXISTS side_car_hash varchar(32) DEFAULT NULL; diff --git a/api/graphql/models/media.go b/api/graphql/models/media.go index 24b397cb..6e0f8452 100644 --- a/api/graphql/models/media.go +++ b/api/graphql/models/media.go @@ -21,6 +21,8 @@ type Media struct { Favorite bool Type MediaType VideoMetadataId *int + SideCarPath *string + SideCarHash *string } func (p *Media) ID() int { @@ -51,7 +53,7 @@ type MediaURL struct { func NewMediaFromRow(row *sql.Row) (*Media, error) { media := Media{} - if err := row.Scan(&media.MediaID, &media.Title, &media.Path, &media.PathHash, &media.AlbumId, &media.ExifId, &media.DateShot, &media.DateImported, &media.Favorite, &media.Type, &media.VideoMetadataId); err != nil { + if err := row.Scan(&media.MediaID, &media.Title, &media.Path, &media.PathHash, &media.AlbumId, &media.ExifId, &media.DateShot, &media.DateImported, &media.Favorite, &media.Type, &media.VideoMetadataId, &media.SideCarPath, &media.SideCarHash); err != nil { return nil, err } @@ -63,7 +65,7 @@ func NewMediaFromRows(rows *sql.Rows) ([]*Media, error) { for rows.Next() { var media Media - if err := rows.Scan(&media.MediaID, &media.Title, &media.Path, &media.PathHash, &media.AlbumId, &media.ExifId, &media.DateShot, &media.DateImported, &media.Favorite, &media.Type, &media.VideoMetadataId); err != nil { + if err := rows.Scan(&media.MediaID, &media.Title, &media.Path, &media.PathHash, &media.AlbumId, &media.ExifId, &media.DateShot, &media.DateImported, &media.Favorite, &media.Type, &media.VideoMetadataId, &media.SideCarPath, &media.SideCarHash); err != nil { return nil, err } medias = append(medias, &media) diff --git a/api/scanner/scanner_media.go b/api/scanner/scanner_media.go index 5585796c..39f19b76 100644 --- a/api/scanner/scanner_media.go +++ b/api/scanner/scanner_media.go @@ -1,7 +1,10 @@ package scanner import ( + "crypto/md5" "database/sql" + "encoding/hex" + "io" "log" "os" "path" @@ -10,6 +13,40 @@ import ( "github.com/viktorstrate/photoview/api/graphql/models" ) +func scanForSideCarFile(path string) *string { + testPath := path + ".xmp" + _, err := os.Stat(testPath) + + if os.IsNotExist(err) { + return nil + } else if err != nil { + // unexpected error logging + log.Printf("ERROR: %s", err) + return nil + } + return &testPath + +} + +func hashSideCarFile(path *string) *string { + if path == nil { + return nil + } + + f, err := os.Open(*path) + if err != nil { + log.Printf("ERROR: %s", err) + } + defer f.Close() + + h := md5.New() + if _, err := io.Copy(h, f); err != nil { + log.Printf("ERROR: %s", err) + } + hash := hex.EncodeToString(h.Sum(nil)) + return &hash +} + func ScanMedia(tx *sql.Tx, mediaPath string, albumId int, cache *AlbumScannerCache) (*models.Media, bool, error) { mediaName := path.Base(mediaPath) @@ -35,10 +72,22 @@ func ScanMedia(tx *sql.Tx, mediaPath string, albumId int, cache *AlbumScannerCac } var mediaTypeText string + + var sideCarPath *string + sideCarPath = nil + var sideCarHash *string + sideCarHash = nil if mediaType.isVideo() { mediaTypeText = "video" } else { mediaTypeText = "photo" + // search for sidecar files + if mediaType.isRaw() { + sideCarPath = scanForSideCarFile(mediaPath) + if sideCarPath != nil { + sideCarHash = hashSideCarFile(sideCarPath) + } + } } stat, err := os.Stat(mediaPath) @@ -46,7 +95,7 @@ func ScanMedia(tx *sql.Tx, mediaPath string, albumId int, cache *AlbumScannerCac return nil, false, err } - result, err := tx.Exec("INSERT INTO media (title, path, path_hash, album_id, media_type, date_shot) VALUES (?, ?, MD5(path), ?, ?, ?)", mediaName, mediaPath, albumId, mediaTypeText, stat.ModTime()) + result, err := tx.Exec("INSERT INTO media (title, path, path_hash, side_car_path, side_car_hash, album_id, media_type, date_shot) VALUES (?, ?, MD5(path), ?, ?, ?, ?, ?)", mediaName, mediaPath, sideCarPath, sideCarHash, albumId, mediaTypeText, stat.ModTime()) if err != nil { return nil, false, errors.Wrap(err, "could not insert media into database") }