diff --git a/internal/http/dj_handlers.go b/internal/http/dj_handlers.go index 60a7826..60e56b4 100644 --- a/internal/http/dj_handlers.go +++ b/internal/http/dj_handlers.go @@ -42,11 +42,7 @@ func (dj *DJHandlers) ListenersUpdate(w http.ResponseWriter, r *http.Request) { switch r.FormValue("action") { case "listener_add": - l := dj.listeners.Inc() - go func() { - dj.curSong.UpdateMaxListeners(l) - dj.curSong.IncListeners() - }() + _ = dj.listeners.Inc() case "listener_remove": if _, err := dj.listeners.Dec(); err != nil { log.Println("DJHandlers.ListenersUpdate:", err) @@ -63,6 +59,10 @@ func (dj *DJHandlers) ListenersUpdate(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) } +const defaultArtistTag = "[LOL, no artist tag]" +const defaultTitleTag = "[No title tag for you -_-]" +const defaultTitleTagNoArtist = "[And no title tag either! Pffft]" + func (dj *DJHandlers) PlaylistNext(w http.ResponseWriter, _ *http.Request) { w.Header().Add("Content-Type", "text/plain") nxt := dj.playlist.Next() @@ -75,40 +75,51 @@ func (dj *DJHandlers) PlaylistNext(w http.ResponseWriter, _ *http.Request) { } } - go func() { - oggf, err := oggtag.NewOggFile(nxt) - if err != nil { - log.Println("cannot read an OGG file", nxt, ":", err) - return + // go func() { + oggf, err := oggtag.NewOggFile(nxt) + if err != nil { + log.Println("cannot read an OGG file", nxt, ":", err) + http.Error(w, "cannot read an OGG file", http.StatusInternalServerError) + return + } + + newSong := radio.Song{ + Artist: oggf.GetTag("artist"), + Title: oggf.GetTag("title"), + Duration: oggf.GetDuration(), + // Here 5 seconds are being added because it is approximately the + // time between the creation of this Song object and when ezstream + // actually starts to play it. + StartAt: time.Now().Add(5 * time.Second)} + + if newSong.Artist == "" && newSong.Title == "" { + log.Println("Playlist:", nxt, "has no artist and title tags.") + newSong.Artist = defaultArtistTag + newSong.Title = defaultTitleTagNoArtist + } else if newSong.Artist == "" { + log.Println("Playlist:", nxt, "has no artist tag.") + newSong.Artist = defaultArtistTag + } else if newSong.Title == "" { + log.Println("Playlist:", nxt, "has no title tag.") + newSong.Title = defaultTitleTag + } + + if strings.HasSuffix(nxt, "/fallback.ogg") { + newSong.Artist = "Nothing to play. Playing a fallback: " + newSong.Artist + } + + dj.curSong.Listeners, dj.curSong.MaxListeners = dj.listeners.Reset() + + if dj.curSong.Artist != "" { + if err := dj.stats.Add(dj.curSong); err != nil { + log.Println("cannot add a song to a stats DB:", err) } + } - newSong := radio.Song{ - Artist: oggf.GetTag("artist"), - Title: oggf.GetTag("title"), - Duration: oggf.GetDuration(), - Listeners: dj.listeners.Current(), - MaxListeners: dj.listeners.Current(), - // Here 5 seconds are being added because it is approximately the - // time between the creation of this Song object and when ezstream - // actually starts to play it. - StartAt: time.Now().Add(5 * time.Second)} - - if newSong.Artist == "" || newSong.Title == "" { - log.Println("Playlist:", nxt, "has no artist or title tags.") - } - - if strings.HasSuffix(nxt, "/fallback.ogg") { - newSong.Artist = "Nothing to play. Playing a fallback: " + newSong.Artist - } - - if dj.curSong.Artist != "" { - if err := dj.stats.Add(dj.curSong); err != nil { - log.Println("cannot add a song to a stats DB:", err) - } - } - - dj.curSong.SetFrom(&newSong) - }() + *dj.curSong = newSong + dj.curSong.Listeners = 0 + dj.curSong.MaxListeners = 0 + // }() fmt.Fprintln(w, nxt) }