clean up scanner and add better log messages

This commit is contained in:
sentriz
2019-06-05 18:45:13 +01:00
parent a1a40b85e4
commit f7e00fdaa6

View File

@@ -38,11 +38,12 @@ var coverFilenames = map[string]struct{}{
} }
type Scanner struct { type Scanner struct {
db, tx *gorm.DB db, tx *gorm.DB
musicPath string musicPath string
seenTracks map[int]struct{} seenTracks map[int]struct{}
curFolders folderStack seenTracksNew int
curCover string curFolders folderStack
curCover string
} }
func New(db *gorm.DB, musicPath string) *Scanner { func New(db *gorm.DB, musicPath string) *Scanner {
@@ -67,7 +68,6 @@ func (s *Scanner) curFolderID() int {
} }
func (s *Scanner) MigrateDB() error { func (s *Scanner) MigrateDB() error {
defer logElapsed(time.Now(), "migrating database")
s.tx = s.db.Begin() s.tx = s.db.Begin()
defer s.tx.Commit() defer s.tx.Commit()
s.tx.AutoMigrate( s.tx.AutoMigrate(
@@ -83,6 +83,7 @@ func (s *Scanner) MigrateDB() error {
Password: "admin", Password: "admin",
IsAdmin: true, IsAdmin: true,
}) })
log.Printf("finished migrating")
return nil return nil
} }
@@ -94,22 +95,9 @@ func (s *Scanner) Start() error {
defer atomic.StoreInt32(&IsScanning, 0) defer atomic.StoreInt32(&IsScanning, 0)
s.tx = s.db.Begin() s.tx = s.db.Begin()
defer s.tx.Commit() defer s.tx.Commit()
if err := s.startScan(); err != nil { //
return errors.Wrap(err, "start scan") // being walking
} start := time.Now()
if err := s.startClean(); err != nil {
return errors.Wrap(err, "start clean")
}
return nil
}
func logElapsed(start time.Time, name string) {
elapsed := time.Since(start)
log.Printf("finished %s in %s\n", name, elapsed)
}
func (s *Scanner) startScan() error {
defer logElapsed(time.Now(), "scanning")
err := godirwalk.Walk(s.musicPath, &godirwalk.Options{ err := godirwalk.Walk(s.musicPath, &godirwalk.Options{
Callback: s.callbackItem, Callback: s.callbackItem,
PostChildrenCallback: s.callbackPost, PostChildrenCallback: s.callbackPost,
@@ -118,20 +106,23 @@ func (s *Scanner) startScan() error {
if err != nil { if err != nil {
return errors.Wrap(err, "walking filesystem") return errors.Wrap(err, "walking filesystem")
} }
return nil log.Printf("finished scanning in %s, +%d/%d tracks\n",
} time.Since(start),
s.seenTracksNew,
func (s *Scanner) startClean() error { len(s.seenTracks),
defer logElapsed(time.Now(), "cleaning database") )
//
// begin cleaning
start = time.Now()
var tracks []*model.Track var tracks []*model.Track
err := s.tx. err = s.tx.
Select("id"). Select("id").
Find(&tracks). Find(&tracks).
Error Error
if err != nil { if err != nil {
return errors.Wrap(err, "scanning tracks") return errors.Wrap(err, "scanning tracks")
} }
var deleted int var deleted uint
for _, track := range tracks { for _, track := range tracks {
_, ok := s.seenTracks[track.ID] _, ok := s.seenTracks[track.ID]
if !ok { if !ok {
@@ -139,7 +130,10 @@ func (s *Scanner) startClean() error {
deleted++ deleted++
} }
} }
log.Printf("removed %d tracks\n", deleted) log.Printf("finished cleaning in %s, -%d tracks\n",
time.Since(start),
deleted,
)
return nil return nil
} }
@@ -282,6 +276,7 @@ func (s *Scanner) handleTrack(it *item) error {
} }
track.ArtistID = artist.ID track.ArtistID = artist.ID
s.tx.Save(track) s.tx.Save(track)
s.seenTracksNew++
// //
// set album if this is the first track in the folder // set album if this is the first track in the folder
if !s.curFolder().IsNew { if !s.curFolder().IsNew {