// Простой модуль для взаимодействия с 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(` overlay
%s
%s
%s
`, trackData.URL, style, subdescr, trackData.Artist, trackData.Title, ) }