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