From db992a99415200b9497bda0dc625c2ba9453fdc7 Mon Sep 17 00:00:00 2001 From: Deluan Date: Tue, 22 Mar 2016 19:00:18 -0400 Subject: [PATCH] Small changes regarding StarredAt. Making StarredAt more "precise", setting it to the time the change was detected. getStarred.view now returns albums ordered by StarredAt. loadRange method now take QueryOptions.Desc into account --- domain/album.go | 3 +- domain/mediafile.go | 1 + engine/browser.go | 4 +- engine/common.go | 92 ++++++++++++++++----------------- engine/list_generator.go | 2 +- persistence/album_repository.go | 6 ++- persistence/ledis_repository.go | 8 ++- scanner/importer.go | 12 +++++ 8 files changed, 72 insertions(+), 56 deletions(-) diff --git a/domain/album.go b/domain/album.go index 591ceb2b..10500bab 100644 --- a/domain/album.go +++ b/domain/album.go @@ -12,12 +12,13 @@ type Album struct { AlbumArtist string Year int `idx:"Year"` Compilation bool - Starred bool `idx:"Starred"` + Starred bool PlayCount int PlayDate time.Time Duration int Rating int Genre string + StarredAt time.Time `idx:"Starred"` CreatedAt time.Time UpdatedAt time.Time } diff --git a/domain/mediafile.go b/domain/mediafile.go index ebe19f17..6f774988 100644 --- a/domain/mediafile.go +++ b/domain/mediafile.go @@ -28,6 +28,7 @@ type MediaFile struct { PlayDate time.Time Rating int Starred bool + StarredAt time.Time CreatedAt time.Time UpdatedAt time.Time } diff --git a/engine/browser.go b/engine/browser.go index 4a9f0df0..7a39d725 100644 --- a/engine/browser.go +++ b/engine/browser.go @@ -106,9 +106,7 @@ func (b *browser) buildAlbumDir(al *domain.Album, tracks domain.MediaFiles) *Dir Parent: al.ArtistId, PlayCount: int32(al.PlayCount), UserRating: al.Rating, - } - if al.Starred { - dir.Starred = al.UpdatedAt + Starred: al.StarredAt, } dir.Entries = make(Entries, len(tracks)) diff --git a/engine/common.go b/engine/common.go index 2e0f20ea..dc27ff7b 100644 --- a/engine/common.go +++ b/engine/common.go @@ -46,59 +46,55 @@ var ( ) func FromAlbum(al *domain.Album) Entry { - c := Entry{} - c.Id = al.Id - c.Title = al.Name - c.IsDir = true - c.Parent = al.ArtistId - c.Album = al.Name - c.Year = al.Year - c.Artist = al.AlbumArtist - c.Genre = al.Genre - c.CoverArt = al.CoverArtId - if al.Starred { - c.Starred = al.UpdatedAt - } - c.PlayCount = int32(al.PlayCount) - c.Created = al.CreatedAt - c.AlbumId = al.Id - c.ArtistId = al.ArtistId - c.UserRating = al.Rating - c.Duration = al.Duration - return c + e := Entry{} + e.Id = al.Id + e.Title = al.Name + e.IsDir = true + e.Parent = al.ArtistId + e.Album = al.Name + e.Year = al.Year + e.Artist = al.AlbumArtist + e.Genre = al.Genre + e.CoverArt = al.CoverArtId + e.Starred = al.StarredAt + e.PlayCount = int32(al.PlayCount) + e.Created = al.CreatedAt + e.AlbumId = al.Id + e.ArtistId = al.ArtistId + e.UserRating = al.Rating + e.Duration = al.Duration + return e } func FromMediaFile(mf *domain.MediaFile) Entry { - c := Entry{} - c.Id = mf.Id - c.Title = mf.Title - c.IsDir = false - c.Parent = mf.AlbumId - c.Album = mf.Album - c.Year = mf.Year - c.Artist = mf.Artist - c.Genre = mf.Genre - c.Track = mf.TrackNumber - c.Duration = mf.Duration - c.Size = mf.Size - c.Suffix = mf.Suffix - c.BitRate = mf.BitRate - if mf.Starred { - c.Starred = mf.UpdatedAt - } + e := Entry{} + e.Id = mf.Id + e.Title = mf.Title + e.IsDir = false + e.Parent = mf.AlbumId + e.Album = mf.Album + e.Year = mf.Year + e.Artist = mf.Artist + e.Genre = mf.Genre + e.Track = mf.TrackNumber + e.Duration = mf.Duration + e.Size = mf.Size + e.Suffix = mf.Suffix + e.BitRate = mf.BitRate + e.Starred = mf.StarredAt if mf.HasCoverArt { - c.CoverArt = mf.Id + e.CoverArt = mf.Id } - c.ContentType = mf.ContentType() - c.Path = mf.Path - c.PlayCount = int32(mf.PlayCount) - c.DiscNumber = mf.DiscNumber - c.Created = mf.CreatedAt - c.AlbumId = mf.AlbumId - c.ArtistId = mf.ArtistId - c.Type = "music" // TODO Hardcoded for now - c.UserRating = mf.Rating - return c + e.ContentType = mf.ContentType() + e.Path = mf.Path + e.PlayCount = int32(mf.PlayCount) + e.DiscNumber = mf.DiscNumber + e.Created = mf.CreatedAt + e.AlbumId = mf.AlbumId + e.ArtistId = mf.ArtistId + e.Type = "music" // TODO Hardcoded for now + e.UserRating = mf.Rating + return e } func FromAlbums(albums domain.Albums) Entries { diff --git a/engine/list_generator.go b/engine/list_generator.go index 7114cc7b..6df732b9 100644 --- a/engine/list_generator.go +++ b/engine/list_generator.go @@ -89,7 +89,7 @@ func (g *listGenerator) GetRandom(offset int, size int) (Entries, error) { } func (g *listGenerator) GetStarred(offset int, size int) (Entries, error) { - qo := domain.QueryOptions{Offset: offset, Size: size} + qo := domain.QueryOptions{Offset: offset, Size: size, Desc: true} albums, err := g.albumRepo.GetStarred(qo) if err != nil { return nil, err diff --git a/persistence/album_repository.go b/persistence/album_repository.go index c69df0ad..60ae4fba 100644 --- a/persistence/album_repository.go +++ b/persistence/album_repository.go @@ -2,6 +2,7 @@ package persistence import ( "errors" + "time" "github.com/deluan/gosonic/domain" ) @@ -49,7 +50,7 @@ func (r *albumRepository) GetAllIds() ([]string, error) { ids := make([]string, len(idMap)) i := 0 - for id, _ := range idMap { + for id := range idMap { ids[i] = id i++ } @@ -65,7 +66,8 @@ func (r *albumRepository) PurgeInactive(active domain.Albums) ([]string, error) func (r *albumRepository) GetStarred(options domain.QueryOptions) (domain.Albums, error) { var as = make(domain.Albums, 0) - err := r.loadRange("Starred", true, true, &as, options) + start := time.Time{}.Add(time.Duration(1) * time.Hour) + err := r.loadRange("Starred", start, time.Now(), &as, options) return as, err } diff --git a/persistence/ledis_repository.go b/persistence/ledis_repository.go index 3aecb6cf..3001f189 100644 --- a/persistence/ledis_repository.go +++ b/persistence/ledis_repository.go @@ -290,7 +290,13 @@ func (r *ledisRepository) loadRange(idxName string, min interface{}, max interfa maxS := toScore(max) idxKey := fmt.Sprintf("%s:idx:%s", r.table, idxName) - resp, err := Db().ZRangeByScore([]byte(idxKey), minS, maxS, o.Offset, o.Size) + var resp []ledis.ScorePair + var err error + if o.Desc { + resp, err = Db().ZRevRangeByScore([]byte(idxKey), minS, maxS, o.Offset, o.Size) + } else { + resp, err = Db().ZRangeByScore([]byte(idxKey), minS, maxS, o.Offset, o.Size) + } if err != nil { return err } diff --git a/scanner/importer.go b/scanner/importer.go index 1b594820..81a87207 100644 --- a/scanner/importer.go +++ b/scanner/importer.go @@ -153,6 +153,12 @@ func (i *Importer) importLibrary() (err error) { if mf.UpdatedAt.Before(i.lastScan) { continue } + if mf.Starred { + original, err := i.mfRepo.Get(mf.Id) + if err != nil || !original.Starred { + mf.StarredAt = mf.UpdatedAt + } + } if err := i.mfRepo.Put(mf); err != nil { beego.Error(err) } @@ -172,6 +178,12 @@ func (i *Importer) importLibrary() (err error) { if al.UpdatedAt.Before(i.lastScan) { continue } + if al.Starred { + original, err := i.albumRepo.Get(al.Id) + if err != nil || !original.Starred { + al.StarredAt = al.UpdatedAt + } + } if err := i.albumRepo.Put(al); err != nil { beego.Error(err) }