clean up scanner and add better log messages
This commit is contained in:
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user