2023-09-30 23:59:48 +04:00
|
|
|
package http
|
|
|
|
|
|
|
|
import (
|
|
|
|
"dwelling-radio/internal/radio"
|
2023-10-01 05:43:52 +04:00
|
|
|
"dwelling-radio/pkg/oggtag"
|
2023-10-01 03:35:33 +04:00
|
|
|
"encoding/json"
|
2023-09-30 23:59:48 +04:00
|
|
|
"fmt"
|
|
|
|
"log"
|
|
|
|
"net/http"
|
2023-10-01 05:43:52 +04:00
|
|
|
"time"
|
2023-09-30 23:59:48 +04:00
|
|
|
)
|
|
|
|
|
|
|
|
type DJHandlers struct {
|
2023-10-01 20:32:07 +04:00
|
|
|
listeners *radio.ListenerCounter
|
2023-10-01 01:32:57 +04:00
|
|
|
playlist *radio.Playlist
|
2023-10-02 03:18:54 +04:00
|
|
|
songList *radio.SongList
|
2023-09-30 23:59:48 +04:00
|
|
|
}
|
|
|
|
|
2023-10-02 03:18:54 +04:00
|
|
|
func NewDJHandlers(l *radio.ListenerCounter, p *radio.Playlist, sl *radio.SongList, slLen int) *DJHandlers {
|
|
|
|
return &DJHandlers{listeners: l, playlist: p, songList: sl}
|
2023-09-30 23:59:48 +04:00
|
|
|
}
|
|
|
|
|
2023-10-01 01:32:17 +04:00
|
|
|
func (dj *DJHandlers) ListenersGet(w http.ResponseWriter, _ *http.Request) {
|
2023-10-02 02:35:01 +04:00
|
|
|
w.Header().Add("Content-Type", "application/json")
|
|
|
|
json.NewEncoder(w).Encode(dj.listeners)
|
2023-09-30 23:59:48 +04:00
|
|
|
}
|
|
|
|
|
2023-10-01 01:32:17 +04:00
|
|
|
func (dj *DJHandlers) ListenersInc(w http.ResponseWriter, _ *http.Request) {
|
2023-09-30 23:59:48 +04:00
|
|
|
l := dj.listeners.Inc()
|
2023-10-01 05:43:52 +04:00
|
|
|
go func() {
|
2023-10-02 03:18:54 +04:00
|
|
|
if l > dj.songList.Current().MaxListeners {
|
|
|
|
dj.songList.Current().MaxListeners = l
|
2023-10-01 05:43:52 +04:00
|
|
|
}
|
|
|
|
}()
|
2023-09-30 23:59:48 +04:00
|
|
|
w.WriteHeader(http.StatusCreated)
|
|
|
|
w.Header().Add("Content-Type", "text/plain")
|
|
|
|
fmt.Fprint(w, l)
|
|
|
|
}
|
|
|
|
|
2023-10-01 01:32:17 +04:00
|
|
|
func (dj *DJHandlers) ListenersDec(w http.ResponseWriter, _ *http.Request) {
|
2023-09-30 23:59:48 +04:00
|
|
|
l, err := dj.listeners.Dec()
|
|
|
|
if err != nil {
|
|
|
|
log.Print(err)
|
|
|
|
http.Error(w, err.Error(), http.StatusBadRequest)
|
|
|
|
}
|
|
|
|
w.WriteHeader(http.StatusOK)
|
|
|
|
w.Header().Add("Content-Type", "text/plain")
|
|
|
|
fmt.Fprint(w, l)
|
|
|
|
}
|
2023-10-01 01:32:57 +04:00
|
|
|
|
|
|
|
func (dj *DJHandlers) PlaylistNext(w http.ResponseWriter, _ *http.Request) {
|
|
|
|
w.Header().Add("Content-Type", "text/plain")
|
|
|
|
nxt := dj.playlist.Next()
|
|
|
|
if nxt == "" {
|
|
|
|
log.Println("the end of a playlist has been reached")
|
2023-10-01 05:43:52 +04:00
|
|
|
} else {
|
|
|
|
go func() {
|
2023-10-02 01:27:14 +04:00
|
|
|
bs, be, err := oggtag.ReadFile(nxt)
|
2023-10-01 05:43:52 +04:00
|
|
|
if err != nil {
|
2023-10-02 01:27:14 +04:00
|
|
|
log.Println("cannot read an OGG file", nxt, ":", err)
|
2023-10-02 02:29:18 +04:00
|
|
|
http.Error(w, "cannot read an OGG file", http.StatusInternalServerError)
|
|
|
|
return
|
2023-10-01 05:43:52 +04:00
|
|
|
}
|
|
|
|
|
2023-10-02 03:18:30 +04:00
|
|
|
song := radio.Song{
|
2023-10-02 01:27:14 +04:00
|
|
|
Artist: oggtag.GetTag(bs, "artist"),
|
|
|
|
Title: oggtag.GetTag(bs, "title"),
|
|
|
|
Duration: oggtag.GetDuration(bs, be),
|
2023-10-01 05:43:52 +04:00
|
|
|
MaxListeners: dj.listeners.Current(),
|
|
|
|
StartAt: time.Now()}
|
|
|
|
// radio.CheckAndUpdateMostListenedSong(song, currentSong)
|
2023-10-02 03:18:54 +04:00
|
|
|
dj.songList.Add(song)
|
2023-10-01 05:43:52 +04:00
|
|
|
}()
|
2023-10-01 01:32:57 +04:00
|
|
|
}
|
|
|
|
fmt.Fprint(w, nxt)
|
|
|
|
}
|
2023-10-01 03:35:33 +04:00
|
|
|
|
|
|
|
func (dj *DJHandlers) Song(w http.ResponseWriter, r *http.Request) {
|
|
|
|
w.Header().Add("Content-Type", "application/json")
|
2023-10-02 03:18:54 +04:00
|
|
|
err := json.NewEncoder(w).Encode(dj.songList.Current())
|
2023-10-01 22:05:39 +04:00
|
|
|
if err != nil {
|
|
|
|
log.Println("DJHandlers.Song:", err)
|
|
|
|
http.Error(w, "cannot obtain current song", http.StatusInternalServerError)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (dj *DJHandlers) Songs(w http.ResponseWriter, r *http.Request) {
|
|
|
|
w.Header().Add("Content-Type", "application/json")
|
2023-10-02 03:18:54 +04:00
|
|
|
err := json.NewEncoder(w).Encode(dj.songList.List())
|
2023-10-01 22:05:39 +04:00
|
|
|
if err != nil {
|
|
|
|
log.Println("DJHandlers.Songs:", err)
|
|
|
|
http.Error(w, "cannot obtain list of last songs", http.StatusInternalServerError)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-10-01 22:07:04 +04:00
|
|
|
func (dj *DJHandlers) Status(w http.ResponseWriter, r *http.Request) {
|
2023-10-02 02:22:14 +04:00
|
|
|
w.Header().Add("Content-Type", "application/json")
|
|
|
|
err := json.NewEncoder(w).Encode(&struct {
|
2023-10-02 03:18:30 +04:00
|
|
|
Current *radio.Song `json:"current_song,omitempty"`
|
2023-10-02 02:22:14 +04:00
|
|
|
Listeners *radio.ListenerCounter `json:"listeners"`
|
2023-10-02 03:18:30 +04:00
|
|
|
List []radio.Song `json:"last_songs,omitempty"`
|
2023-10-02 02:22:14 +04:00
|
|
|
Mls *radio.MostListenedSong `json:"most_listened_song,omitempty"`
|
|
|
|
}{
|
2023-10-02 03:18:54 +04:00
|
|
|
Current: dj.songList.Current(),
|
2023-10-02 02:22:14 +04:00
|
|
|
Listeners: dj.listeners,
|
2023-10-02 03:18:54 +04:00
|
|
|
List: dj.songList.List(),
|
2023-10-02 02:22:14 +04:00
|
|
|
Mls: radio.MostListened()})
|
|
|
|
if err != nil {
|
|
|
|
log.Println("DJHandlers.Status:", err)
|
|
|
|
http.Error(w, "status parsing failed", http.StatusInternalServerError)
|
|
|
|
}
|
|
|
|
}
|
2023-10-02 02:28:46 +04:00
|
|
|
|
|
|
|
func (dj *DJHandlers) MostListenedSong(w http.ResponseWriter, r *http.Request) {
|
|
|
|
w.Header().Add("Content-Type", "application/json")
|
|
|
|
mls := radio.MostListened()
|
|
|
|
if mls == nil {
|
|
|
|
w.WriteHeader(http.StatusNotFound)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
err := json.NewEncoder(w).Encode(mls)
|
|
|
|
if err != nil {
|
|
|
|
log.Println("DJHandlers.MostListenedSong:", err)
|
|
|
|
http.Error(w, "MostListenedSong parsing failed", http.StatusInternalServerError)
|
2023-10-01 03:35:33 +04:00
|
|
|
}
|
|
|
|
}
|