Big Refactor:
- Create model.DataStore, with provision for transactions - Change all layers dependencies on repositories to use DataStore - Implemented persistence.SQLStore - Removed iTunes Bridge/Importer support
This commit is contained in:
+7
-24
@@ -13,28 +13,11 @@ import (
|
||||
|
||||
type Scanner struct {
|
||||
folders map[string]FolderScanner
|
||||
repos Repositories
|
||||
ds model.DataStore
|
||||
}
|
||||
|
||||
type Repositories struct {
|
||||
folder model.MediaFolderRepository
|
||||
mediaFile model.MediaFileRepository
|
||||
album model.AlbumRepository
|
||||
artist model.ArtistRepository
|
||||
playlist model.PlaylistRepository
|
||||
property model.PropertyRepository
|
||||
}
|
||||
|
||||
func New(mfRepo model.MediaFileRepository, albumRepo model.AlbumRepository, artistRepo model.ArtistRepository, plsRepo model.PlaylistRepository, folderRepo model.MediaFolderRepository, property model.PropertyRepository) *Scanner {
|
||||
repos := Repositories{
|
||||
folder: folderRepo,
|
||||
mediaFile: mfRepo,
|
||||
album: albumRepo,
|
||||
artist: artistRepo,
|
||||
playlist: plsRepo,
|
||||
property: property,
|
||||
}
|
||||
s := &Scanner{repos: repos, folders: map[string]FolderScanner{}}
|
||||
func New(ds model.DataStore) *Scanner {
|
||||
s := &Scanner{ds: ds, folders: map[string]FolderScanner{}}
|
||||
s.loadFolders()
|
||||
return s
|
||||
}
|
||||
@@ -77,7 +60,7 @@ func (s *Scanner) RescanAll(fullRescan bool) error {
|
||||
func (s *Scanner) Status() []StatusInfo { return nil }
|
||||
|
||||
func (s *Scanner) getLastModifiedSince(folder string) time.Time {
|
||||
ms, err := s.repos.property.Get(model.PropLastScan + "-" + folder)
|
||||
ms, err := s.ds.Property().Get(model.PropLastScan + "-" + folder)
|
||||
if err != nil {
|
||||
return time.Time{}
|
||||
}
|
||||
@@ -90,14 +73,14 @@ func (s *Scanner) getLastModifiedSince(folder string) time.Time {
|
||||
|
||||
func (s *Scanner) updateLastModifiedSince(folder string, t time.Time) {
|
||||
millis := t.UnixNano() / int64(time.Millisecond)
|
||||
s.repos.property.Put(model.PropLastScan+"-"+folder, fmt.Sprint(millis))
|
||||
s.ds.Property().Put(model.PropLastScan+"-"+folder, fmt.Sprint(millis))
|
||||
}
|
||||
|
||||
func (s *Scanner) loadFolders() {
|
||||
fs, _ := s.repos.folder.GetAll()
|
||||
fs, _ := s.ds.MediaFolder().GetAll()
|
||||
for _, f := range fs {
|
||||
log.Info("Configuring Media Folder", "name", f.Name, "path", f.Path)
|
||||
s.folders[f.Path] = NewTagScanner(f.Path, s.repos)
|
||||
s.folders[f.Path] = NewTagScanner(f.Path, s.ds)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -21,16 +21,10 @@ func xTestScanner(t *testing.T) {
|
||||
var _ = Describe("TODO: REMOVE", func() {
|
||||
conf.Sonic.DbPath = "./testDB"
|
||||
log.SetLevel(log.LevelDebug)
|
||||
repos := Repositories{
|
||||
folder: persistence.NewMediaFolderRepository(),
|
||||
mediaFile: persistence.NewMediaFileRepository(),
|
||||
album: persistence.NewAlbumRepository(),
|
||||
artist: persistence.NewArtistRepository(),
|
||||
playlist: nil,
|
||||
}
|
||||
ds := persistence.New()
|
||||
It("WORKS!", func() {
|
||||
t := NewTagScanner("/Users/deluan/Music/iTunes/iTunes Media/Music", repos)
|
||||
//t := NewTagScanner("/Users/deluan/Development/cloudsonic/sonic-server/tests/fixtures", repos)
|
||||
t := NewTagScanner("/Users/deluan/Music/iTunes/iTunes Media/Music", ds)
|
||||
//t := NewTagScanner("/Users/deluan/Development/cloudsonic/sonic-server/tests/fixtures", ds)
|
||||
Expect(t.Scan(nil, time.Time{})).To(BeNil())
|
||||
})
|
||||
})
|
||||
|
||||
+12
-12
@@ -18,14 +18,14 @@ import (
|
||||
|
||||
type TagScanner struct {
|
||||
rootFolder string
|
||||
repos Repositories
|
||||
ds model.DataStore
|
||||
detector *ChangeDetector
|
||||
}
|
||||
|
||||
func NewTagScanner(rootFolder string, repos Repositories) *TagScanner {
|
||||
func NewTagScanner(rootFolder string, ds model.DataStore) *TagScanner {
|
||||
return &TagScanner{
|
||||
rootFolder: rootFolder,
|
||||
repos: repos,
|
||||
ds: ds,
|
||||
detector: NewChangeDetector(rootFolder),
|
||||
}
|
||||
}
|
||||
@@ -105,12 +105,12 @@ func (s *TagScanner) Scan(ctx context.Context, lastModifiedSince time.Time) erro
|
||||
return err
|
||||
}
|
||||
|
||||
err = s.repos.album.PurgeEmpty()
|
||||
err = s.ds.Album().PurgeEmpty()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = s.repos.artist.PurgeEmpty()
|
||||
err = s.ds.Artist().PurgeEmpty()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -123,7 +123,7 @@ func (s *TagScanner) refreshAlbums(updatedAlbums map[string]bool) error {
|
||||
for id := range updatedAlbums {
|
||||
ids = append(ids, id)
|
||||
}
|
||||
return s.repos.album.Refresh(ids...)
|
||||
return s.ds.Album().Refresh(ids...)
|
||||
}
|
||||
|
||||
func (s *TagScanner) refreshArtists(updatedArtists map[string]bool) error {
|
||||
@@ -131,7 +131,7 @@ func (s *TagScanner) refreshArtists(updatedArtists map[string]bool) error {
|
||||
for id := range updatedArtists {
|
||||
ids = append(ids, id)
|
||||
}
|
||||
return s.repos.artist.Refresh(ids...)
|
||||
return s.ds.Artist().Refresh(ids...)
|
||||
}
|
||||
|
||||
func (s *TagScanner) processChangedDir(dir string, updatedArtists map[string]bool, updatedAlbums map[string]bool) error {
|
||||
@@ -141,7 +141,7 @@ func (s *TagScanner) processChangedDir(dir string, updatedArtists map[string]boo
|
||||
|
||||
// Load folder's current tracks from DB into a map
|
||||
currentTracks := map[string]model.MediaFile{}
|
||||
ct, err := s.repos.mediaFile.FindByPath(dir)
|
||||
ct, err := s.ds.MediaFile().FindByPath(dir)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -169,7 +169,7 @@ func (s *TagScanner) processChangedDir(dir string, updatedArtists map[string]boo
|
||||
for _, n := range newTracks {
|
||||
c, ok := currentTracks[n.ID]
|
||||
if !ok || (ok && n.UpdatedAt.After(c.UpdatedAt)) {
|
||||
err := s.repos.mediaFile.Put(&n, false)
|
||||
err := s.ds.MediaFile().Put(&n, false)
|
||||
updatedArtists[n.ArtistID] = true
|
||||
updatedAlbums[n.AlbumID] = true
|
||||
numUpdatedTracks++
|
||||
@@ -183,7 +183,7 @@ func (s *TagScanner) processChangedDir(dir string, updatedArtists map[string]boo
|
||||
// Remaining tracks from DB that are not in the folder are deleted
|
||||
for id := range currentTracks {
|
||||
numPurgedTracks++
|
||||
if err := s.repos.mediaFile.Delete(id); err != nil {
|
||||
if err := s.ds.MediaFile().Delete(id); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
@@ -195,7 +195,7 @@ func (s *TagScanner) processChangedDir(dir string, updatedArtists map[string]boo
|
||||
func (s *TagScanner) processDeletedDir(dir string, updatedArtists map[string]bool, updatedAlbums map[string]bool) error {
|
||||
dir = path.Join(s.rootFolder, dir)
|
||||
|
||||
ct, err := s.repos.mediaFile.FindByPath(dir)
|
||||
ct, err := s.ds.MediaFile().FindByPath(dir)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -204,7 +204,7 @@ func (s *TagScanner) processDeletedDir(dir string, updatedArtists map[string]boo
|
||||
updatedAlbums[t.AlbumID] = true
|
||||
}
|
||||
|
||||
return s.repos.mediaFile.DeleteByPath(dir)
|
||||
return s.ds.MediaFile().DeleteByPath(dir)
|
||||
}
|
||||
|
||||
func (s *TagScanner) loadTracks(dirPath string) (model.MediaFiles, error) {
|
||||
|
||||
Reference in New Issue
Block a user