diff --git a/client/mpd/djmpd/djmpd.go b/client/mpd/djmpd/djmpd.go index 82385f09e311e98c77b8675a710b7a173bfbd932..c0202e566f2b030a350d46d7aa690af3b8aac9d4 100644 --- a/client/mpd/djmpd/djmpd.go +++ b/client/mpd/djmpd/djmpd.go @@ -17,7 +17,9 @@ func main() { flag.Parse() db := djmpd.NewDJRandomDatabase() - m := mpd.NewMPD(mpd.NewPortAudioPlayer(), db) + player := mpd.NewPortAudioPlayer() + db.SetupPlayRecorder(player) + m := mpd.NewMPD(player, db) m.HandleURL("djrandom", db) log.Fatal(m.ListenAndServe(fmt.Sprintf(":%d", *port))) } diff --git a/client/mpd/djrandom.go b/client/mpd/djrandom.go index 95b483e5534ea894bb38408a9fed8dcc018b1604..f425ede1a097234d2a830c7777d4f08f9a74751a 100644 --- a/client/mpd/djrandom.go +++ b/client/mpd/djrandom.go @@ -2,6 +2,7 @@ package djmpd import ( "bytes" + "container/list" "errors" "flag" "fmt" @@ -251,3 +252,58 @@ func (d *DJRandomDatabase) GetSong(songURL *url.URL) (mpd.Song, error) { // Convert api.Song to Song. return newDJRandomSong(&resp, d.client), nil } + +func (d *DJRandomDatabase) SetupPlayRecorder(player mpd.Player) { + rec := newPlayRecorder(d.client) + player.SetSongPlayedCallback(rec.SongPlayed) +} + +type PlayRecorder struct { + client *util.HttpClient + played *list.List + count int + size int + lock sync.Mutex +} + +func newPlayRecorder(client *util.HttpClient) *PlayRecorder { + return &PlayRecorder{ + client: client, + played: list.New(), + size: 5, + } +} + +func (r *PlayRecorder) SongPlayed(song mpd.Song) { + s, ok := song.(*DJRandomSong) + if !ok { + return + } + + r.lock.Lock() + defer r.lock.Unlock() + + // songID := s.Id + r.played.PushBack(s.Id) + if r.count < r.size { + r.count++ + } else { + r.played.Remove(r.played.Front()) + } + + var ids []api.SongID + for e := r.played.Front(); e != nil; e = e.Next() { + ids = append(ids, e.Value.(api.SongID)) + } + + // Make the HTTP request in a separate goroutine so that we + // don't block on network issues (ignores errors). + go func() { + log.Printf("add_playlog: %v", ids) + req := api.AddPlayLogRequest{Songs: ids} + var resp bool + if err := r.client.Post("/api/add_playlog", &req, &resp); err != nil { + log.Printf("add_playlog error: %v", err) + } + }() +}