diff --git a/api/media_annotation.go b/api/media_annotation.go index 7e9c92a0d..5e9deec2f 100644 --- a/api/media_annotation.go +++ b/api/media_annotation.go @@ -30,6 +30,13 @@ func (c *MediaAnnotationController) Scrobble() { c.SendError(responses.ERROR_GENERIC, "Internal error") } beego.Info(fmt.Sprintf(`Scrobbled (%s) "%s" at %v`, id, mf.Title, time)) + } else { + mf, err := c.scrobbler.NowPlaying(id) + if err != nil { + beego.Error("Error setting", id, "as current song:", err) + c.SendError(responses.ERROR_GENERIC, "Internal error") + } + beego.Info(fmt.Sprintf(`Current Song (%s) "%s" at %v`, id, mf.Title, time)) } response := c.NewEmpty() diff --git a/engine/mock_nowplaying_repo.go b/engine/mock_nowplaying_repo.go index 290538bcb..ef1ce5b8b 100644 --- a/engine/mock_nowplaying_repo.go +++ b/engine/mock_nowplaying_repo.go @@ -6,7 +6,7 @@ import ( ) func CreateMockNowPlayingRepo() *MockNowPlaying { - return &MockNowPlaying{data: make(map[string]time.Time)} + return &MockNowPlaying{} } type MockNowPlaying struct { @@ -20,7 +20,7 @@ func (m *MockNowPlaying) SetError(err bool) { m.err = err } -func (m *MockNowPlaying) Add(id string) error { +func (m *MockNowPlaying) Set(id string) error { if m.err { return errors.New("Error!") } @@ -28,3 +28,7 @@ func (m *MockNowPlaying) Add(id string) error { m.start = time.Now() return nil } + +func (m *MockNowPlaying) Current() (string, time.Time) { + return m.id, m.start +} diff --git a/engine/nowplaying.go b/engine/nowplaying.go index 65d7acb60..3c624b674 100644 --- a/engine/nowplaying.go +++ b/engine/nowplaying.go @@ -10,5 +10,5 @@ type NowPlayingInfo struct { } type NowPlayingRepository interface { - Add(trackId string) error + Set(trackId string) error } diff --git a/engine/scrobbler.go b/engine/scrobbler.go index feb240f6c..5474a2062 100644 --- a/engine/scrobbler.go +++ b/engine/scrobbler.go @@ -41,5 +41,14 @@ func (s *scrobbler) Register(id string, playDate time.Time) (*domain.MediaFile, } func (s *scrobbler) NowPlaying(id string) (*domain.MediaFile, error) { - return nil, errors.New("Not implemented") + mf, err := s.mfRepo.Get(id) + if err != nil { + return nil, err + } + + if mf == nil { + return nil, errors.New(fmt.Sprintf(`Id "%s" not found`, id)) + } + + return mf, s.npRepo.Set(id) } diff --git a/engine/scrobbler_test.go b/engine/scrobbler_test.go index 48017efe4..ec4dd74e0 100644 --- a/engine/scrobbler_test.go +++ b/engine/scrobbler_test.go @@ -53,6 +53,29 @@ func TestScrobbler(t *testing.T) { }) }) + Convey("When I inform the song that is now playing", func() { + mf, err := scrobbler.NowPlaying("2") + + Convey("Then I get the song for that id back", func() { + So(err, ShouldBeNil) + So(mf.Title, ShouldEqual, "Hands Of Time") + }) + + Convey("And it saves the song as the one current playing", func() { + id, start := npRepo.Current() + So(id, ShouldEqual, "2") + So(start, ShouldHappenBefore, time.Now()) + }) + + Convey("And iTunes is not notified", func() { + So(itCtrl.played, ShouldNotContainKey, "2") + }) + }) + + Reset(func() { + itCtrl.played = make(map[string]time.Time) + }) + }) } diff --git a/persistence/nowplaying_repository.go b/persistence/nowplaying_repository.go index 507539005..83d336216 100644 --- a/persistence/nowplaying_repository.go +++ b/persistence/nowplaying_repository.go @@ -22,7 +22,7 @@ func NewNowPlayingRepository() engine.NowPlayingRepository { return r } -func (r *nowPlayingRepository) Add(id string) error { +func (r *nowPlayingRepository) Set(id string) error { if id == "" { return errors.New("Id is required") } @@ -32,12 +32,7 @@ func (r *nowPlayingRepository) Add(id string) error { if err != nil { return err } - err = Db().Set(nowPlayingKeyName, []byte(h)) - if err != nil { - return err - } - _, err = Db().Expire(nowPlayingKeyName, int64(engine.NowPlayingExpire.Seconds())) - return err + return Db().SetEX(nowPlayingKeyName, int64(engine.NowPlayingExpire.Seconds()), []byte(h)) } var _ engine.NowPlayingRepository = (*nowPlayingRepository)(nil)