diff options
Diffstat (limited to 'Endpoints/SongList.go')
| -rw-r--r-- | Endpoints/SongList.go | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/Endpoints/SongList.go b/Endpoints/SongList.go index fe9ad60..0d0bf58 100644 --- a/Endpoints/SongList.go +++ b/Endpoints/SongList.go @@ -16,12 +16,15 @@ type Song struct { Name string Duration int Start int + Meta audio.TrackMeta } type SongsList struct { Songs []Song } +var cache *SongsList = nil + func (base Song) String() string { var outp, jsonErr = json.Marshal(base) if jsonErr != nil { @@ -39,7 +42,7 @@ func (base SongsList) String() string { } func getSongs(w http.ResponseWriter, r *http.Request) { - var songsList, err = getAvaliableSongs() + var songsList, err = GetAvaliableSongs() if err != nil { w.WriteHeader(http.StatusInternalServerError) log.Printf("Failed to get files: %v\n", err.Error()) @@ -50,7 +53,7 @@ func getSongs(w http.ResponseWriter, r *http.Request) { } func getRandomSong(w http.ResponseWriter, r *http.Request) { - var songsList, err = getAvaliableSongs() + var songsList, err = GetAvaliableSongs() if err != nil { w.WriteHeader(http.StatusInternalServerError) log.Printf("Failed to get files: %v\n", err.Error()) @@ -58,10 +61,15 @@ func getRandomSong(w http.ResponseWriter, r *http.Request) { } var index = rand.Intn(len(songsList.Songs)) w.Header().Add("Content-Type", "application/json") - fmt.Fprint(w, songsList.Songs[index]) + var outp = songsList.Songs[index] + outp.Start = settings.Current.Distribution.GetDistributedInt(outp.Duration) + fmt.Fprint(w, outp) } -func getAvaliableSongs() (SongsList, error) { +func GetAvaliableSongs() (SongsList, error) { + if cache != nil { + return *cache, nil + } var files, dirErr = os.ReadDir(settings.Current.SongsLocation) if dirErr != nil { return SongsList{}, dirErr @@ -69,18 +77,26 @@ func getAvaliableSongs() (SongsList, error) { var outp = SongsList { Songs: make([]Song, 0, len(files)), } - for _, v := range files { + for i, v := range files { + fmt.Printf("Indexing %d/%d\n", i+1, len(files)) var fullPath = fmt.Sprintf("%s/%s", settings.Current.SongsLocation, v.Name()) var duration, durErr = audio.GetSongDuration(fullPath) if durErr != nil { log.Printf("Failed to parse file metadata: File: %s, error: %s\n", fullPath, durErr.Error()) continue } + var meta, metaErr = audio.GenerateMetadata(v.Name()) + if metaErr != nil { + log.Printf("Failed to get metadata from file: %s", metaErr) + continue + } var song = Song { Name: v.Name(), Duration: int(duration.Seconds()), + Meta: meta, } outp.Songs = append(outp.Songs, song) } + cache = &outp return outp, nil } |
