Update scanner to delete removed files
This commit is contained in:
parent
d50a15be90
commit
a2d0509cad
|
@ -30,3 +30,6 @@ yarn.lock
|
||||||
npm-debug.log*
|
npm-debug.log*
|
||||||
yarn-debug.log*
|
yarn-debug.log*
|
||||||
yarn-error.log*
|
yarn-error.log*
|
||||||
|
|
||||||
|
# vscode
|
||||||
|
__debug_bin
|
||||||
|
|
|
@ -15,5 +15,5 @@ CREATE TABLE IF NOT EXISTS access_token (
|
||||||
expire timestamp NOT NULL,
|
expire timestamp NOT NULL,
|
||||||
|
|
||||||
PRIMARY KEY (token_id),
|
PRIMARY KEY (token_id),
|
||||||
FOREIGN KEY (user_id) REFERENCES user(user_id)
|
FOREIGN KEY (user_id) REFERENCES user(user_id) ON DELETE CASCADE
|
||||||
);
|
);
|
||||||
|
|
|
@ -22,8 +22,8 @@ CREATE TABLE IF NOT EXISTS album (
|
||||||
path varchar(512) NOT NULL UNIQUE,
|
path varchar(512) NOT NULL UNIQUE,
|
||||||
|
|
||||||
PRIMARY KEY (album_id),
|
PRIMARY KEY (album_id),
|
||||||
FOREIGN KEY (parent_album) REFERENCES album(album_id),
|
FOREIGN KEY (parent_album) REFERENCES album(album_id) ON DELETE CASCADE,
|
||||||
FOREIGN KEY (owner_id) REFERENCES user(user_id)
|
FOREIGN KEY (owner_id) REFERENCES user(user_id) ON DELETE CASCADE
|
||||||
);
|
);
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS photo (
|
CREATE TABLE IF NOT EXISTS photo (
|
||||||
|
@ -34,8 +34,8 @@ CREATE TABLE IF NOT EXISTS photo (
|
||||||
exif_id int,
|
exif_id int,
|
||||||
|
|
||||||
PRIMARY KEY (photo_id),
|
PRIMARY KEY (photo_id),
|
||||||
FOREIGN KEY (album_id) REFERENCES album(album_id),
|
FOREIGN KEY (album_id) REFERENCES album(album_id) ON DELETE CASCADE,
|
||||||
FOREIGN KEY (exif_id) REFERENCES photo_exif(exif_id)
|
FOREIGN KEY (exif_id) REFERENCES photo_exif(exif_id) ON DELETE CASCADE
|
||||||
);
|
);
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS photo_url (
|
CREATE TABLE IF NOT EXISTS photo_url (
|
||||||
|
@ -48,5 +48,5 @@ CREATE TABLE IF NOT EXISTS photo_url (
|
||||||
content_type varchar(64) NOT NULL,
|
content_type varchar(64) NOT NULL,
|
||||||
|
|
||||||
PRIMARY KEY (url_id),
|
PRIMARY KEY (url_id),
|
||||||
FOREIGN KEY (photo_id) REFERENCES photo(photo_id)
|
FOREIGN KEY (photo_id) REFERENCES photo(photo_id) ON DELETE CASCADE
|
||||||
);
|
);
|
|
@ -8,6 +8,8 @@ import (
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/h2non/filetype"
|
"github.com/h2non/filetype"
|
||||||
"github.com/viktorstrate/photoview/api/graphql/models"
|
"github.com/viktorstrate/photoview/api/graphql/models"
|
||||||
|
@ -45,7 +47,9 @@ func ScanUser(database *sql.DB, userId int) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func scan(database *sql.DB, user *models.User) {
|
func scan(database *sql.DB, user *models.User) {
|
||||||
|
// Start scanning
|
||||||
scanner_cache := make(scanner_cache)
|
scanner_cache := make(scanner_cache)
|
||||||
|
album_paths_scanned := make([]interface{}, 0)
|
||||||
|
|
||||||
type scanInfo struct {
|
type scanInfo struct {
|
||||||
path string
|
path string
|
||||||
|
@ -65,6 +69,8 @@ func scan(database *sql.DB, user *models.User) {
|
||||||
albumPath := albumInfo.path
|
albumPath := albumInfo.path
|
||||||
albumParentId := albumInfo.parentId
|
albumParentId := albumInfo.parentId
|
||||||
|
|
||||||
|
album_paths_scanned = append(album_paths_scanned, albumPath)
|
||||||
|
|
||||||
// Read path
|
// Read path
|
||||||
dirContent, err := ioutil.ReadDir(albumPath)
|
dirContent, err := ioutil.ReadDir(albumPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -143,6 +149,8 @@ func scan(database *sql.DB, user *models.User) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cleanupCache(database, album_paths_scanned)
|
||||||
|
|
||||||
log.Println("Done scanning")
|
log.Println("Done scanning")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -226,3 +234,40 @@ func isPathImage(path string, cache *scanner_cache) bool {
|
||||||
log.Printf("Unsupported image %s of type %s\n", path, imgType.MIME.Value)
|
log.Printf("Unsupported image %s of type %s\n", path, imgType.MIME.Value)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func cleanupCache(database *sql.DB, scanned_albums []interface{}) {
|
||||||
|
if len(scanned_albums) == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
albums_questions := strings.Repeat("?,", len(scanned_albums))[:len(scanned_albums)*2-1]
|
||||||
|
rows, err := database.Query("SELECT album_id FROM album WHERE path NOT IN ("+albums_questions+")", scanned_albums...)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("ERROR: Could not get albums from database: %s\n", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
deleted_albums := 0
|
||||||
|
deleted_ids := make([]interface{}, 0)
|
||||||
|
for rows.Next() {
|
||||||
|
var album_id int
|
||||||
|
rows.Scan(&album_id)
|
||||||
|
deleted_ids = append(deleted_ids, album_id)
|
||||||
|
cache_path := path.Join("./image-cache", strconv.Itoa(album_id))
|
||||||
|
err := os.RemoveAll(cache_path)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("ERROR: Could not delete unused cache folder: %s\n%s\n", cache_path, err)
|
||||||
|
} else {
|
||||||
|
deleted_albums++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(deleted_ids) > 0 {
|
||||||
|
albums_questions = strings.Repeat("?,", len(deleted_ids))[:len(deleted_ids)*2-1]
|
||||||
|
if _, err := database.Exec("DELETE FROM album WHERE album_id IN ("+albums_questions+")", deleted_ids...); err != nil {
|
||||||
|
log.Printf("ERROR: Could not delete old albums from database:\n%s\n", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Printf("Deleted %d unused albums from cache", deleted_albums)
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue