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:
Deluan
2020-01-19 15:37:41 -05:00
parent 40186f7e10
commit 67eeb218c4
47 changed files with 389 additions and 1621 deletions
+7 -24
View File
@@ -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)
}
}
+3 -9
View File
@@ -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
View File
@@ -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) {