From 0e492a053ca6ddcf8d6f9f6111e5c954d6c9e577 Mon Sep 17 00:00:00 2001 From: Deluan Date: Sun, 6 Mar 2016 21:32:31 -0500 Subject: [PATCH] Only read tag when the track was changed --- scanner/importer.go | 17 ++++++++++++++--- scanner/itunes_scanner.go | 19 ++++++++++++++----- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/scanner/importer.go b/scanner/importer.go index 91ffbbd17..99067d77f 100644 --- a/scanner/importer.go +++ b/scanner/importer.go @@ -7,12 +7,13 @@ import ( "github.com/deluan/gosonic/domain" "github.com/deluan/gosonic/persistence" "github.com/deluan/gosonic/utils" + "strconv" "strings" "time" ) type Scanner interface { - ScanLibrary(path string) (int, error) + ScanLibrary(lastModifiedSince time.Time, path string) (int, error) MediaFiles() map[string]*domain.MediaFile Albums() map[string]*domain.Album Artists() map[string]*domain.Artist @@ -47,7 +48,7 @@ type Importer struct { } func (i *Importer) Run() { - if total, err := i.scanner.ScanLibrary(i.mediaFolder); err != nil { + if total, err := i.scanner.ScanLibrary(i.lastModifiedSince(), i.mediaFolder); err != nil { beego.Error("Error importing iTunes Library:", err) return } else { @@ -62,6 +63,16 @@ func (i *Importer) Run() { beego.Info("Finished importing tracks from iTunes Library") } +func (i *Importer) lastModifiedSince() time.Time { + ms, err := i.propertyRepo.Get(consts.LastScan) + if err != nil { + beego.Warn("Couldn't read LastScan:", err) + return time.Time{} + } + s, _ := strconv.ParseInt(ms, 10, 64) + return time.Unix(0, s*int64(time.Millisecond)) +} + func (i *Importer) importLibrary() (err error) { indexGroups := utils.ParseIndexGroups(beego.AppConfig.String("indexGroups")) artistIndex := make(map[string]tempIndex) @@ -97,7 +108,7 @@ func (i *Importer) importLibrary() (err error) { beego.Info("Total MediaFiles in database:", c) if err == nil { - millis := time.Now().UnixNano() / 1000000 + millis := time.Now().UnixNano() / int64(time.Millisecond) i.propertyRepo.Put(consts.LastScan, fmt.Sprint(millis)) beego.Info("LastScan timestamp:", millis) } diff --git a/scanner/itunes_scanner.go b/scanner/itunes_scanner.go index 7aebf03ee..2da9c87af 100644 --- a/scanner/itunes_scanner.go +++ b/scanner/itunes_scanner.go @@ -12,16 +12,19 @@ import ( "path/filepath" "strconv" "strings" + "time" ) type ItunesScanner struct { - mediaFiles map[string]*domain.MediaFile - albums map[string]*domain.Album - artists map[string]*domain.Artist + mediaFiles map[string]*domain.MediaFile + albums map[string]*domain.Album + artists map[string]*domain.Artist + lastModifiedSince time.Time } -func (s *ItunesScanner) ScanLibrary(path string) (int, error) { +func (s *ItunesScanner) ScanLibrary(lastModifiedSince time.Time, path string) (int, error) { beego.Info("Starting iTunes import from:", path) + beego.Info("Checking for updates since", lastModifiedSince.String()) xml, _ := os.Open(path) l, err := itl.ReadFromXML(xml) if err != nil { @@ -29,6 +32,7 @@ func (s *ItunesScanner) ScanLibrary(path string) (int, error) { } beego.Info("Loaded", len(l.Tracks), "tracks") + s.lastModifiedSince = lastModifiedSince s.mediaFiles = make(map[string]*domain.MediaFile) s.albums = make(map[string]*domain.Album) s.artists = make(map[string]*domain.Artist) @@ -39,6 +43,8 @@ func (s *ItunesScanner) ScanLibrary(path string) (int, error) { ar := s.collectArtists(&t) mf := s.collectMediaFiles(&t) s.collectAlbums(&t, mf, ar) + } else { + beego.Trace("Skipped", t.Location, " - kind:", t.Kind) } i++ if i%1000 == 0 { @@ -87,7 +93,10 @@ func (s *ItunesScanner) collectMediaFiles(t *itl.Track) *domain.MediaFile { path = strings.TrimPrefix(unescape(path), "file://") mf.Path = path mf.Suffix = strings.TrimPrefix(filepath.Ext(path), ".") - mf.HasCoverArt = hasCoverArt(path) + + if mf.UpdatedAt.After(s.lastModifiedSince) { + mf.HasCoverArt = hasCoverArt(path) + } mf.CreatedAt = t.DateAdded mf.UpdatedAt = t.DateModified