backend/listenBrainz.go (view raw)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
package main
import (
"encoding/json"
"fmt"
"io"
"log"
"net/http"
"net/url"
)
type PlayingNow struct {
Payload struct {
Count int `json:"count"`
Listens []struct {
PlayingNow bool `json:"playing_now"`
TrackMetadata struct {
AdditionalInfo struct {
ArtistMbids []any `json:"artist_mbids"`
DurationMs int `json:"duration_ms"`
SubmissionClient string `json:"submission_client"`
SubmissionClientVersion string `json:"submission_client_version"`
Tracknumber int `json:"tracknumber"`
} `json:"additional_info"`
ArtistName string `json:"artist_name"`
ReleaseName string `json:"release_name"`
TrackName string `json:"track_name"`
} `json:"track_metadata"`
} `json:"listens"`
PlayingNow bool `json:"playing_now"`
UserID string `json:"user_id"`
} `json:"payload"`
}
type Metadata struct {
ArtistCreditName string `json:"artist_credit_name"`
ArtistMbids []string `json:"artist_mbids"`
RecordingMbid string `json:"recording_mbid"`
RecordingName string `json:"recording_name"`
ReleaseMbid string `json:"release_mbid"`
ReleaseName string `json:"release_name"`
}
func getPlayingNow(userName string) (PlayingNow, error) {
url := fmt.Sprintf("https://api.listenbrainz.org/1/user/%s/playing-now", url.QueryEscape(userName))
res, err := http.Get(url)
if err != nil {
return PlayingNow{}, err
}
body, err := io.ReadAll(res.Body)
if err != nil {
log.Printf("body: %s\nerror: %s\n",url, err)
return PlayingNow{}, err
}
var playingNow PlayingNow
if err := json.Unmarshal(body, &playingNow); err != nil {
log.Printf("url: %s\nbody: %s\nerror: %s\n",url, body, err)
return PlayingNow{}, err
}
return playingNow, nil
}
func getMetadata(artistName string, recordingName string, releaseName string) (Metadata, error) {
url := fmt.Sprintf(
"https://api.listenbrainz.org/1/metadata/lookup/?artist_name=%s&recording_name=%s&release_name=%s&metadata=false&inc=release_mbid",
url.QueryEscape(artistName),
url.QueryEscape(recordingName),
url.QueryEscape(releaseName),
)
res, err := http.Get(url)
if err != nil {
return Metadata{}, err
}
body, err := io.ReadAll(res.Body)
if err != nil {
log.Printf("body: %s\nerror: %s\n",url, err)
return Metadata{}, err
}
var metadata Metadata
if err := json.Unmarshal(body, &metadata); err != nil {
log.Printf("url: %s\nbody: %s\nerror: %s\n",url, body, err)
return Metadata{}, err
}
return metadata, nil
}
func getCover(releaseMbid string) (string, error) {
client := http.Client{}
url := fmt.Sprintf("https://coverartarchive.org/release/%s/front-250", url.QueryEscape(releaseMbid))
req , err := http.NewRequest("GET", url, nil)
if err != nil {
return "", err
}
req.Header = http.Header{
"Sec-Fetch-Mode": {"navigate"},
}
res, err := client.Do(req)
return res.Request.URL.String(), nil
}
|