1
Fork 0
photoview/api/scanner/scanner_media.go

71 lines
1.9 KiB
Go
Raw Normal View History

2020-02-23 18:00:08 +01:00
package scanner
import (
"database/sql"
"log"
"path"
2020-02-26 19:44:47 +01:00
2020-07-10 18:57:27 +02:00
"github.com/pkg/errors"
2020-02-26 19:44:47 +01:00
"github.com/viktorstrate/photoview/api/graphql/models"
2020-02-23 18:00:08 +01:00
)
func ScanMedia(tx *sql.Tx, mediaPath string, albumId int, cache *AlbumScannerCache) (*models.Media, bool, error) {
2020-07-10 18:57:27 +02:00
mediaName := path.Base(mediaPath)
2020-02-23 18:00:08 +01:00
// Check if image already exists
{
2020-07-10 18:57:27 +02:00
row := tx.QueryRow("SELECT * FROM media WHERE path_hash = MD5(?)", mediaPath)
photo, err := models.NewMediaFromRow(row)
if err != sql.ErrNoRows {
if err == nil {
log.Printf("Media already scanned: %s\n", mediaPath)
return photo, false, nil
} else {
2020-07-10 18:57:27 +02:00
return nil, false, errors.Wrap(err, "scan media fetch from database")
}
2020-02-23 18:00:08 +01:00
}
}
2020-07-10 18:57:27 +02:00
log.Printf("Scanning media: %s\n", mediaPath)
mediaType, err := cache.GetMediaType(mediaPath)
if err != nil {
return nil, false, errors.Wrap(err, "could determine if media was photo or video")
}
var mediaTypeText string
if mediaType.isVideo() {
mediaTypeText = "video"
} else {
mediaTypeText = "photo"
}
result, err := tx.Exec("INSERT INTO media (title, path, path_hash, album_id, media_type) VALUES (?, ?, MD5(path), ?, ?)", mediaName, mediaPath, albumId, mediaTypeText)
2020-02-23 18:00:08 +01:00
if err != nil {
2020-07-10 18:57:27 +02:00
return nil, false, errors.Wrap(err, "could not insert media into database")
2020-02-23 18:00:08 +01:00
}
media_id, err := result.LastInsertId()
2020-02-23 18:00:08 +01:00
if err != nil {
return nil, false, err
2020-02-23 18:00:08 +01:00
}
2020-07-10 18:57:27 +02:00
row := tx.QueryRow("SELECT * FROM media WHERE media_id = ?", media_id)
2020-07-12 14:17:49 +02:00
media, err := models.NewMediaFromRow(row)
2020-02-23 18:00:08 +01:00
if err != nil {
2020-07-10 18:57:27 +02:00
return nil, false, errors.Wrap(err, "failed to get media by id from database")
2020-02-23 18:00:08 +01:00
}
2020-07-12 14:17:49 +02:00
_, err = ScanEXIF(tx, media)
2020-02-24 23:30:08 +01:00
if err != nil {
2020-07-10 18:57:27 +02:00
log.Printf("WARN: ScanEXIF for %s failed: %s\n", mediaName, err)
2020-02-24 23:30:08 +01:00
}
2020-07-12 14:17:49 +02:00
if media.Type == models.MediaTypeVideo {
if err = ScanVideoMetadata(tx, media); err != nil {
log.Printf("WARN: ScanVideoMetadata for %s failed: %s\n", mediaName, err)
}
}
return media, true, nil
2020-02-23 18:00:08 +01:00
}