all repos — paprika @ bdaefbdeb1674762cd448b2b7288d1db2fb9c055

go rewrite of taigabot

plugins/listenbrainz/nowplaying.go (view raw)

 1package listenbrainz
 2
 3import (
 4	"encoding/json"
 5	"fmt"
 6	"net/http"
 7	"time"
 8
 9	"github.com/dustin/go-humanize"
10)
11
12type ListenInfo struct {
13	Payload struct {
14		Count   int `json:"count"`
15		Listens []struct {
16			InsertedAt    string `json:"inserted_at"`
17			ListenedAt    int    `json:"listened_at"`
18			TrackMetadata struct {
19				ArtistName  string `json:"artist_name"`
20				ReleaseName string `json:"release_name"`
21				TrackName   string `json:"track_name"`
22			} `json:"track_metadata"`
23			UserName string `json:"user_name"`
24		} `json:"listens"`
25	} `json:"payload"`
26}
27
28func getListen(url string) (*ListenInfo, error) {
29	li := ListenInfo{}
30	r, err := http.Get(url)
31	if err != nil {
32		return nil, err
33	} else if r.StatusCode != 200 {
34		return nil, fmt.Errorf("non-200 response from Listenbrainz")
35	}
36
37	json.NewDecoder(r.Body).Decode(&li)
38	return &li, err
39}
40
41func NowPlaying(user string) (string, error) {
42	url := fmt.Sprintf(
43		"https://api.listenbrainz.org/1/user/%s/playing-now",
44		user,
45	)
46	li, err := getListen(url)
47	if err != nil {
48		return "", err
49	}
50
51	if len(li.Payload.Listens) != 0 {
52		// Now playing a track
53		tm := li.Payload.Listens[0].TrackMetadata
54		return fmt.Sprintf(
55			`%s is currently listening to "%s" by %s, from the album %s`,
56			user,
57			tm.TrackName,
58			tm.ArtistName,
59			tm.ReleaseName,
60		), nil
61	} else {
62		// Last listen
63		url = fmt.Sprintf(
64			"https://api.listenbrainz.org/1/user/%s/listens?count=1",
65			user,
66		)
67		li, err := getListen(url)
68		if err != nil {
69			return "", err
70		}
71
72		fmt.Println(li)
73		tm := li.Payload.Listens[0].TrackMetadata
74		listenedAt, _ := time.Parse(time.RFC1123, li.Payload.Listens[0].InsertedAt)
75		return fmt.Sprintf(
76			`%s listened to "%s" by %s, from the album %s, %s`,
77			user,
78			tm.TrackName,
79			tm.ArtistName,
80			tm.ReleaseName,
81			humanize.Time(listenedAt),
82		), nil
83	}
84}