all repos — paprika @ ed37b272f5791d139f3031bd35c8b3c41592f356

go rewrite of taigabot

plugins/listenbrainz/nowplaying.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
package listenbrainz

import (
	"encoding/json"
	"fmt"
	"net/http"
	"time"

	"github.com/dustin/go-humanize"
)

type ListenInfo struct {
	Payload struct {
		Count   int `json:"count"`
		Listens []struct {
			InsertedAt    string `json:"inserted_at"`
			ListenedAt    int    `json:"listened_at"`
			TrackMetadata struct {
				ArtistName  string `json:"artist_name"`
				ReleaseName string `json:"release_name"`
				TrackName   string `json:"track_name"`
			} `json:"track_metadata"`
			UserName string `json:"user_name"`
		} `json:"listens"`
	} `json:"payload"`
}

func getListen(url string) (*ListenInfo, error) {
	li := ListenInfo{}
	r, err := http.Get(url)
	if err != nil {
		return nil, err
	} else if r.StatusCode != 200 {
		return nil, fmt.Errorf("non-200 response from Listenbrainz")
	}

	json.NewDecoder(r.Body).Decode(&li)
	defer r.Body.Close()

	return &li, err
}

func NowPlaying(user string) (string, error) {
	url := fmt.Sprintf(
		"https://api.listenbrainz.org/1/user/%s/playing-now",
		user,
	)
	li, err := getListen(url)
	if err != nil {
		return "", err
	}

	if len(li.Payload.Listens) != 0 {
		// Now playing a track
		tm := li.Payload.Listens[0].TrackMetadata
		return fmt.Sprintf(
			"%s is currently listening to \"%s\" by \x02%s\x02, from the album \x02%s\x02",
			user,
			tm.TrackName,
			tm.ArtistName,
			tm.ReleaseName,
		), nil
	} else {
		// Last listen
		url = fmt.Sprintf(
			"https://api.listenbrainz.org/1/user/%s/listens?count=1",
			user,
		)
		li, err := getListen(url)
		if err != nil {
			return "", err
		}

		tm := li.Payload.Listens[0].TrackMetadata
		listenedAt, _ := time.Parse(time.RFC1123, li.Payload.Listens[0].InsertedAt)
		return fmt.Sprintf(
			"%s listened to \"%s\" by \x02%s\x02, from the album \x02%s\x02, %s",
			user,
			tm.TrackName,
			tm.ArtistName,
			tm.ReleaseName,
			humanize.Time(listenedAt),
		), nil
	}
}