all repos — breadsite @ e2a4208da37b8e81e7033f183b6a381a28665134

Unnamed repository; edit this file 'description' to name the repository.

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
}