all repos — breadsite @ b460d4815b1c523bfbd453ca9d9fe542d5cdc6cb

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
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
}