// Простой модуль для взаимодействия с API LastFM
package models
import (
"encoding/json"
"errors"
"fmt"
"io"
"net/http"
)
type LFMWorker struct {
Username string
ApiKey string
}
type Track struct {
URL string
Title string
Artist string
Album string
Listening int
}
type LastFMResponse struct {
RecentTracks struct {
Track []struct {
Name string `json:"name"`
Artist struct {
Name string `json:"#text"`
} `json:"artist"`
Album struct {
Name string `json:"#text"`
} `json:"album"`
Date struct {
Unix string `json:"#text"`
} `json:"date"`
Image []struct {
Size string `json:"size"`
URL string `json:"#text"`
} `json:"image"`
} `json:"track"`
} `json:"recenttracks"`
}
func LFMNew(username, apikey string) *LFMWorker {
return &LFMWorker{
Username: username,
ApiKey: apikey,
}
}
func (w *LFMWorker) LastTrack() (*Track, error) {
url := fmt.Sprintf("https://ws.audioscrobbler.com/2.0/?method=user.getrecenttracks&user=%s&api_key=%s&format=json",
w.Username, w.ApiKey)
resp, err := http.Get(url)
if err != nil {
return nil, err
}
body, err := io.ReadAll(resp.Body)
if err != nil {
return nil, err
}
var lastFMResponse LastFMResponse
var listening int
json.Unmarshal(body, &lastFMResponse)
resp.Body.Close()
// Получаем только последний трек (первый в списке)
if len(lastFMResponse.RecentTracks.Track) == 0 {
return nil, errors.New("no recent tracks")
}
lastTrack := lastFMResponse.RecentTracks.Track[0]
var imageURL string
for _, img := range lastTrack.Image {
if img.Size == "large" {
imageURL = img.URL
break
}
}
if lastTrack.Date.Unix == "" {
listening = 1
} else {
listening = 0
}
return &Track{
URL: imageURL,
Title: lastTrack.Name,
Artist: lastTrack.Artist.Name,
Album: lastTrack.Album.Name,
Listening: listening}, nil
}
func (w *LFMWorker) TrackAjax(trackData *Track) string {
style, subdescr := "display: none;", "Последнее, что слушал админ:"
if trackData.Listening == 1 {
style, subdescr = "display: block;", "Админ сейчас слушает:"
}
if trackData.URL == "" {
trackData.URL = "/assets/pic/noimage.webp"
}
return fmt.Sprintf(`