diff --git a/scanner/scanner.go b/scanner/importer.go similarity index 59% rename from scanner/scanner.go rename to scanner/importer.go index 39e208adb..e7a4878a6 100644 --- a/scanner/scanner.go +++ b/scanner/importer.go @@ -3,14 +3,14 @@ package scanner import ( "fmt" "github.com/astaxie/beego" - "github.com/deluan/gosonic/consts" "github.com/deluan/gosonic/domain" "github.com/deluan/gosonic/persistence" - "github.com/deluan/gosonic/utils" - "strings" "time" "github.com/dhowden/tag" + "github.com/deluan/gosonic/utils" + "github.com/deluan/gosonic/consts" "os" + "strings" ) type Scanner interface { @@ -19,53 +19,71 @@ type Scanner interface { type tempIndex map[string]domain.ArtistInfo -// TODO Implement a flag 'isScanning'. func StartImport() { - go doImport(beego.AppConfig.String("musicFolder"), &ItunesScanner{}) + go func() { + i := &Importer{ + scanner: &ItunesScanner{}, + mediaFolder: beego.AppConfig.String("musicFolder"), + mfRepo: persistence.NewMediaFileRepository(), + albumRepo:persistence.NewAlbumRepository(), + artistRepo: persistence.NewArtistRepository(), + idxRepo: persistence.NewArtistIndexRepository(), + propertyRepo: persistence.NewPropertyRepository(), + + } + i.Run() + }() } -func doImport(mediaFolder string, scanner Scanner) { - beego.Info("Starting iTunes import from:", mediaFolder) - files := scanner.LoadFolder(mediaFolder) - importLibrary(files) +// TODO Implement a flag 'inProgress'. +type Importer struct { + scanner Scanner + mediaFolder string + mfRepo domain.MediaFileRepository + albumRepo domain.AlbumRepository + artistRepo domain.ArtistRepository + idxRepo domain.ArtistIndexRepository + propertyRepo domain.PropertyRepository +} + +func (i *Importer) Run() { + beego.Info("Starting iTunes import from:", i.mediaFolder) + files := i.scanner.LoadFolder(i.mediaFolder) + i.importLibrary(files) beego.Info("Finished importing", len(files), "files") } -func importLibrary(files []Track) (err error) { +func (i *Importer) importLibrary(files []Track) (err error) { indexGroups := utils.ParseIndexGroups(beego.AppConfig.String("indexGroups")) - mfRepo := persistence.NewMediaFileRepository() - albumRepo := persistence.NewAlbumRepository() - artistRepo := persistence.NewArtistRepository() var artistIndex = make(map[string]tempIndex) for _, t := range files { - mf, album, artist := parseTrack(&t) - persist(mfRepo, mf, albumRepo, album, artistRepo, artist) - collectIndex(indexGroups, artist, artistIndex) + mf, album, artist := i.parseTrack(&t) + i.persist(mf, album, artist) + i.collectIndex(indexGroups, artist, artistIndex) } - if err = saveIndex(artistIndex); err != nil { + if err = i.saveIndex(artistIndex); err != nil { beego.Error(err) } - c, _ := artistRepo.CountAll() + c, _ := i.artistRepo.CountAll() beego.Info("Total Artists in database:", c) - c, _ = albumRepo.CountAll() + c, _ = i.albumRepo.CountAll() beego.Info("Total Albums in database:", c) - c, _ = mfRepo.CountAll() + c, _ = i.mfRepo.CountAll() beego.Info("Total MediaFiles in database:", c) if err == nil { - propertyRepo := persistence.NewPropertyRepository() millis := time.Now().UnixNano() / 1000000 - propertyRepo.Put(consts.LastScan, fmt.Sprint(millis)) + i.propertyRepo.Put(consts.LastScan, fmt.Sprint(millis)) beego.Info("LastScan timestamp:", millis) } return err } -func hasCoverArt(path string) bool { +func (i *Importer) hasCoverArt(path string) bool { if _, err := os.Stat(path); err == nil { f, err := os.Open(path) if err != nil { @@ -84,8 +102,8 @@ func hasCoverArt(path string) bool { return false } -func parseTrack(t *Track) (*domain.MediaFile, *domain.Album, *domain.Artist) { - hasCover := hasCoverArt(t.Path) +func (i *Importer) parseTrack(t *Track) (*domain.MediaFile, *domain.Album, *domain.Artist) { + hasCover := i.hasCoverArt(t.Path) mf := &domain.MediaFile{ Id: t.Id, Album: t.Album, @@ -129,29 +147,29 @@ func parseTrack(t *Track) (*domain.MediaFile, *domain.Album, *domain.Artist) { return mf, album, artist } -func persist(mfRepo domain.MediaFileRepository, mf *domain.MediaFile, albumRepo domain.AlbumRepository, album *domain.Album, artistRepo domain.ArtistRepository, artist *domain.Artist) { - if err := artistRepo.Put(artist); err != nil { +func (i *Importer) persist(mf *domain.MediaFile, album *domain.Album, artist *domain.Artist) { + if err := i.artistRepo.Put(artist); err != nil { beego.Error(err) } album.ArtistId = artist.Id - if err := albumRepo.Put(album); err != nil { + if err := i.albumRepo.Put(album); err != nil { beego.Error(err) } mf.AlbumId = album.Id - if err := mfRepo.Put(mf); err != nil { + if err := i.mfRepo.Put(mf); err != nil { beego.Error(err) } } -func collectIndex(ig utils.IndexGroups, a *domain.Artist, artistIndex map[string]tempIndex) { +func (i *Importer) collectIndex(ig utils.IndexGroups, a *domain.Artist, artistIndex map[string]tempIndex) { name := a.Name indexName := strings.ToLower(utils.NoArticle(name)) if indexName == "" { return } - group := findGroup(ig, indexName) + group := i.findGroup(ig, indexName) artists := artistIndex[group] if artists == nil { artists = make(tempIndex) @@ -160,7 +178,7 @@ func collectIndex(ig utils.IndexGroups, a *domain.Artist, artistIndex map[string artists[indexName] = domain.ArtistInfo{ArtistId: a.Id, Artist: a.Name} } -func findGroup(ig utils.IndexGroups, name string) string { +func (i *Importer) findGroup(ig utils.IndexGroups, name string) string { for k, v := range ig { key := strings.ToLower(k) if strings.HasPrefix(name, key) { @@ -170,15 +188,13 @@ func findGroup(ig utils.IndexGroups, name string) string { return "#" } -func saveIndex(artistIndex map[string]tempIndex) error { - idxRepo := persistence.NewArtistIndexRepository() - +func (i *Importer) saveIndex(artistIndex map[string]tempIndex) error { for k, temp := range artistIndex { idx := &domain.ArtistIndex{Id: k} for _, v := range temp { idx.Artists = append(idx.Artists, v) } - err := idxRepo.Put(idx) + err := i.idxRepo.Put(idx) if err != nil { return err } diff --git a/scanner/scanner_test.go b/scanner/importer_test.go similarity index 89% rename from scanner/scanner_test.go rename to scanner/importer_test.go index d991e191f..2c2c57a14 100644 --- a/scanner/scanner_test.go +++ b/scanner/importer_test.go @@ -13,11 +13,13 @@ func TestCollectIndex(t *testing.T) { ig := utils.IndexGroups{"A": "A", "B": "B", "Tom": "Tom", "X": "X-Z"} + importer := &Importer{} + Convey("Simple Name", t, func() { a := &domain.Artist{Name: "Björk"} artistIndex := make(map[string]tempIndex) - collectIndex(ig, a, artistIndex) + importer.collectIndex(ig, a, artistIndex) So(artistIndex, ShouldContainKey, "B") So(artistIndex["B"], ShouldContainKey, "björk") @@ -31,7 +33,7 @@ func TestCollectIndex(t *testing.T) { a := &domain.Artist{Name: "Kraftwerk"} artistIndex := make(map[string]tempIndex) - collectIndex(ig, a, artistIndex) + importer.collectIndex(ig, a, artistIndex) So(artistIndex, ShouldContainKey, "#") So(artistIndex["#"], ShouldContainKey, "kraftwerk") @@ -45,7 +47,7 @@ func TestCollectIndex(t *testing.T) { a := &domain.Artist{Name: "The The"} artistIndex := make(map[string]tempIndex) - collectIndex(ig, a, artistIndex) + importer.collectIndex(ig, a, artistIndex) So(artistIndex, ShouldContainKey, "#") So(artistIndex["#"], ShouldContainKey, "the") @@ -59,7 +61,7 @@ func TestCollectIndex(t *testing.T) { a := &domain.Artist{Name: "Tom Waits"} artistIndex := make(map[string]tempIndex) - collectIndex(ig, a, artistIndex) + importer.collectIndex(ig, a, artistIndex) So(artistIndex, ShouldContainKey, "Tom") So(artistIndex["Tom"], ShouldContainKey, "tom waits")