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 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 |
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"`
}
type CoverArt struct {
Images []struct {
Types []string `json:"types"`
Front bool `json:"front"`
Back bool `json:"back"`
Edit int `json:"edit"`
Image string `json:"image"`
Comment string `json:"comment"`
Approved bool `json:"approved"`
Thumbnails struct {
// TODO: add interface here to allow for different size variations
Num250 string `json:"250"`
// Num500 string `json:"500"`
// Num1200 string `json:"1200"`
// Large string `json:"large"`
// Small string `json:"small"`
} `json:"thumbnails"`
ID int64 `json:"id"`
} `json:"images"`
Release string `json:"release"`
}
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) (CoverArt, error) {
url := fmt.Sprintf("https://coverartarchive.org/release/%s", url.QueryEscape(releaseMbid))
res, err := http.Get(url)
if err != nil {
return CoverArt{}, err
}
body, err := io.ReadAll(res.Body)
if err != nil {
log.Printf("body: %s\nerror: %s\n",url, err)
return CoverArt{}, err
}
var coverArt CoverArt
if err := json.Unmarshal(body, &coverArt); err != nil {
log.Printf("url: %s\nbody: %s\nerror: %s\n",url, body, err)
return CoverArt{}, err
}
return coverArt, nil
}
|