add cleaning to scannert
This commit is contained in:
@@ -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()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user