hikan.ru/mvc/models/lastfm.go

124 lines
2.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

// Простой модуль для взаимодействия с 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(`
<img src="%s">
<img src="/assets/pic/playing.gif" alt="overlay" class="overlay-image" style="%s">
<div class="descr" title="Это можно скроллить если описание слишком большое">
<div id="subdescr">%s</div>
<div id="artist">%s</div>
<div id="title">%s</div>
</div>`,
trackData.URL,
style,
subdescr,
trackData.Artist,
trackData.Title,
)
}