add cleaning to scannert

This commit is contained in:
sentriz
2019-04-19 15:16:49 +01:00
parent a1db249c0b
commit 2db78a7f6b
2 changed files with 58 additions and 20 deletions

View File

@@ -43,6 +43,7 @@ var (
"front.jpg": true, "front.jpg": true,
"front.jpeg": true, "front.jpeg": true,
} }
seenTracks = make(map[string]bool)
) )
type lastAlbum struct { type lastAlbum struct {
@@ -119,6 +120,10 @@ func handleFile(fullPath string, info *godirwalk.Dirent) error {
if !ok { if !ok {
return nil return nil
} }
// add the full path to the seen set. later used to delete
// tracks that are no longer on filesystem and still in the
// database
seenTracks[fullPath] = true
// set track basics // set track basics
track := db.Track{ track := db.Track{
Path: fullPath, Path: fullPath,
@@ -175,13 +180,8 @@ func handleFile(fullPath string, info *godirwalk.Dirent) error {
return nil return nil
} }
func main() { func createDatabase() {
if len(os.Args) != 2 { tx.AutoMigrate(
log.Fatalf("usage: %s <path to music>", os.Args[0])
}
orm = db.New()
orm.SetLogger(log.New(os.Stdout, "gorm ", 0))
orm.AutoMigrate(
&db.Album{}, &db.Album{},
&db.AlbumArtist{}, &db.AlbumArtist{},
&db.Track{}, &db.Track{},
@@ -190,23 +190,59 @@ func main() {
&db.Setting{}, &db.Setting{},
&db.Play{}, &db.Play{},
) )
// 🤫🤫🤫 // set starting value for `albums` table's
orm.Exec(` // auto increment
INSERT INTO sqlite_sequence(name, seq) tx.Exec(`
SELECT 'albums', 500000 INSERT INTO sqlite_sequence(name, seq)
WHERE NOT EXISTS (SELECT * FROM sqlite_sequence) SELECT 'albums', 500000
WHERE NOT EXISTS (SELECT *
FROM sqlite_sequence);
`) `)
orm.FirstOrCreate(&db.User{}, db.User{ // create the first user if there is none
tx.FirstOrCreate(&db.User{}, db.User{
Name: "admin", Name: "admin",
Password: "admin", Password: "admin",
IsAdmin: true, IsAdmin: true,
}) })
orm.FirstOrCreate(&db.User{}, db.User{ }
Name: "stephen",
Password: "stephen", func cleanDatabase() {
}) // delete tracks not on filesystem
startTime := time.Now() var tracks []*db.Track
tx.Select("id, path").Find(&tracks)
for _, track := range tracks {
_, ok := seenTracks[track.Path]
if ok {
continue
}
tx.Delete(&track)
log.Println("removed", track.Path)
}
// delete albums without tracks
tx.Exec(`
DELETE FROM albums
WHERE (SELECT count(id)
FROM tracks
WHERE album_id = albums.id) = 0;
`)
// delete artists without tracks
tx.Exec(`
DELETE FROM album_artists
WHERE (SELECT count(id)
FROM albums
WHERE album_artist_id = album_artists.id) = 0;
`)
}
func main() {
if len(os.Args) != 2 {
log.Fatalf("usage: %s <path to music>", os.Args[0])
}
orm = db.New()
orm.SetLogger(log.New(os.Stdout, "gorm ", 0))
tx = orm.Begin() tx = orm.Begin()
createDatabase()
startTime := time.Now()
err := godirwalk.Walk(os.Args[1], &godirwalk.Options{ err := godirwalk.Walk(os.Args[1], &godirwalk.Options{
Callback: handleFile, Callback: handleFile,
PostChildrenCallback: handleFolderCompletion, PostChildrenCallback: handleFolderCompletion,
@@ -215,6 +251,9 @@ func main() {
if err != nil { if err != nil {
log.Fatalf("error when walking: %v\n", err) log.Fatalf("error when walking: %v\n", err)
} }
tx.Commit()
log.Printf("scanned in %s\n", time.Since(startTime)) log.Printf("scanned in %s\n", time.Since(startTime))
startTime = time.Now()
cleanDatabase()
log.Printf("cleaned in %s\n", time.Since(startTime))
tx.Commit()
} }

View File

@@ -7,7 +7,6 @@ import (
type CrudBase struct { type CrudBase struct {
CreatedAt time.Time CreatedAt time.Time
UpdatedAt time.Time UpdatedAt time.Time
DeletedAt *time.Time `sql:"index"`
} }
type IDBase struct { type IDBase struct {