server: use godirwalk ErrorCallback

This commit is contained in:
sentriz
2020-05-02 04:42:09 +01:00
parent d1cf964029
commit 15a5bba7b1

View File

@@ -76,7 +76,6 @@ type Scanner struct {
seenTracks map[int]struct{} // set of p keys seenTracks map[int]struct{} // set of p keys
seenFolders map[int]struct{} // set of p keys seenFolders map[int]struct{} // set of p keys
seenTracksNew int // n tracks not seen before seenTracksNew int // n tracks not seen before
seenTracksErr int // n tracks we we couldn't scan
} }
func New(musicPath string, db *db.DB) *Scanner { func New(musicPath string, db *db.DB) *Scanner {
@@ -153,7 +152,7 @@ type ScanOptions struct {
func (s *Scanner) Start(opts ScanOptions) error { func (s *Scanner) Start(opts ScanOptions) error {
if IsScanning() { if IsScanning() {
return errors.New("already scanning") return ErrAlreadyScanning
} }
unSet := SetScanning() unSet := SetScanning()
defer unSet() defer unSet()
@@ -163,16 +162,18 @@ func (s *Scanner) Start(opts ScanOptions) error {
s.seenFolders = map[int]struct{}{} s.seenFolders = map[int]struct{}{}
s.curFolders = &stack.Stack{} s.curFolders = &stack.Stack{}
s.seenTracksNew = 0 s.seenTracksNew = 0
s.seenTracksErr = 0
// ** begin being walking // ** begin being walking
log.Println("starting scan") log.Println("starting scan")
var errCount int
start := time.Now() start := time.Now()
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,
Unsorted: true, Unsorted: true,
FollowSymbolicLinks: true, FollowSymbolicLinks: true,
ErrorCallback: func(s string, err error) godirwalk.ErrorAction { ErrorCallback: func(path string, err error) godirwalk.ErrorAction {
log.Printf("error processing %q: %v", path, err)
errCount++
return godirwalk.SkipNode return godirwalk.SkipNode
}, },
}) })
@@ -183,7 +184,7 @@ func (s *Scanner) Start(opts ScanOptions) error {
durSince(start), durSince(start),
s.seenTracksNew, s.seenTracksNew,
len(s.seenTracks), len(s.seenTracks),
s.seenTracksErr, errCount,
) )
// ** begin cleaning // ** begin cleaning
cleanFuncs := []struct { cleanFuncs := []struct {
@@ -196,7 +197,12 @@ func (s *Scanner) Start(opts ScanOptions) error {
} }
for _, clean := range cleanFuncs { for _, clean := range cleanFuncs {
start = time.Now() start = time.Now()
deleted, _ := clean.f() deleted, err := clean.f()
if err != nil {
log.Printf("finished clean %s in %s with error: %v",
clean.name, durSince(start), err)
continue
}
log.Printf("finished clean %s in %s, %d removed", log.Printf("finished clean %s in %s, %d removed",
clean.name, durSince(start), deleted) clean.name, durSince(start), deleted)
} }
@@ -300,11 +306,11 @@ func (s *Scanner) callbackPost(fullPath string, info *godirwalk.Dirent) error {
// ## begin handlers // ## begin handlers
// ## begin handlers // ## begin handlers
func (s *Scanner) itemUnchanged(stat, updated time.Time) bool { func (s *Scanner) itemUnchanged(statModTime, updatedInDB time.Time) bool {
if s.isFull { if s.isFull {
return false return false
} }
return stat.Before(updated) return statModTime.Before(updatedInDB)
} }
func (s *Scanner) handleFolder(it *item) error { func (s *Scanner) handleFolder(it *item) error {
@@ -375,12 +381,7 @@ func (s *Scanner) handleTrack(it *item) error {
track.AlbumID = s.curFolders.PeekID() track.AlbumID = s.curFolders.PeekID()
trTags, err := tags.New(it.fullPath) trTags, err := tags.New(it.fullPath)
if err != nil { if err != nil {
// not returning the error here because we don't want return ErrReadingTags
// the entire walk to stop if we can't read the tags
// of a single file
log.Printf("error reading tags `%s`: %v", it.relPath, err)
s.seenTracksErr++
return nil
} }
track.TagTitle = trTags.Title() track.TagTitle = trTags.Title()
track.TagTitleUDec = decoded(trTags.Title()) track.TagTitleUDec = decoded(trTags.Title())