server: use godirwalk ErrorCallback
This commit is contained in:
@@ -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())
|
||||||
|
|||||||
Reference in New Issue
Block a user