diff --git a/internal/http/dj_handlers.go b/internal/http/dj_handlers.go index 75d6709..402cc25 100644 --- a/internal/http/dj_handlers.go +++ b/internal/http/dj_handlers.go @@ -2,18 +2,24 @@ package http import ( "dwelling-radio/internal/radio" + "dwelling-radio/pkg/oggtag" "encoding/json" "fmt" "log" "net/http" + "os" + "time" ) +var songList radio.SongList + type DJHandlers struct { listeners *radio.Listeners playlist *radio.Playlist } -func NewDJHandlers(l *radio.Listeners, p *radio.Playlist) *DJHandlers { +func NewDJHandlers(l *radio.Listeners, p *radio.Playlist, slLen int) *DJHandlers { + songList = *radio.NewSongList(slLen) return &DJHandlers{listeners: l, playlist: p} } @@ -24,6 +30,11 @@ func (dj *DJHandlers) ListenersGet(w http.ResponseWriter, _ *http.Request) { func (dj *DJHandlers) ListenersInc(w http.ResponseWriter, _ *http.Request) { l := dj.listeners.Inc() + go func() { + if l > songList.Current().MaxListeners { + songList.Current().MaxListeners = l + } + }() w.WriteHeader(http.StatusCreated) w.Header().Add("Content-Type", "text/plain") fmt.Fprint(w, l) @@ -45,6 +56,24 @@ func (dj *DJHandlers) PlaylistNext(w http.ResponseWriter, _ *http.Request) { nxt := dj.playlist.Next() if nxt == "" { log.Println("the end of a playlist has been reached") + } else { + go func() { + f, err := os.Open(nxt) + if err != nil { + log.Println("cannot open file \"", nxt, "\" to read tags") + } + + buf := make([]byte, 4096) + f.Read(buf) + + song := radio.Song_{ + Artist: oggtag.OggGetTag(buf, "artist"), + Title: oggtag.OggGetTag(buf, "title"), + MaxListeners: dj.listeners.Current(), + StartAt: time.Now()} + // radio.CheckAndUpdateMostListenedSong(song, currentSong) + songList.Add(song) + }() } fmt.Fprint(w, nxt) } @@ -53,10 +82,14 @@ func (dj *DJHandlers) Song(w http.ResponseWriter, r *http.Request) { isList := r.URL.Query().Has("list") w.Header().Add("Content-Type", "application/json") if isList { - // TODO - json.NewEncoder(w).Encode("") + err := json.NewEncoder(w).Encode(songList.List()) + if err != nil { + log.Println("DJHandlers.Song list:", err) + } } else { - // TODO - json.NewEncoder(w).Encode("") + err := json.NewEncoder(w).Encode(songList.Current()) + if err != nil { + log.Println("DJHandlers.Song current:", err) + } } }