oh-my-posh/segment_ytm.go
2020-12-01 20:49:51 +01:00

107 lines
2.5 KiB
Go

package main
import (
"encoding/json"
"fmt"
)
type ytm struct {
props *properties
env environmentInfo
status playStatus
artist string
track string
}
const (
// APIURL is the YTMDA Remote Control API URL property.
APIURL Property = "api_url"
)
func (y *ytm) string() string {
icon := ""
separator := y.props.getString(TrackSeparator, " - ")
switch y.status {
case paused:
icon = y.props.getString(PausedIcon, "\uF8E3 ")
case playing:
icon = y.props.getString(PlayingIcon, "\uE602 ")
case stopped:
return y.props.getString(StoppedIcon, "\uF04D ")
}
return fmt.Sprintf("%s%s%s%s", icon, y.artist, separator, y.track)
}
func (y *ytm) enabled() bool {
err := y.setStatus()
// If we don't get a response back (error), the user isn't running
// YTMDA, or they don't have the RC API enabled.
return err == nil
}
func (y *ytm) init(props *properties, env environmentInfo) {
y.props = props
y.env = env
}
type playStatus int
const (
playing playStatus = iota
paused
stopped
)
type ytmdaStatusResponse struct {
player `json:"player"`
track `json:"track"`
}
type player struct {
HasSong bool `json:"hasSong"`
IsPaused bool `json:"isPaused"`
VolumePercent int `json:"volumePercent"`
SeekbarCurrentPosition int `json:"seekbarCurrentPosition"`
SeekbarCurrentPositionHuman string `json:"seekbarCurrentPositionHuman"`
StatePercent float64 `json:"statePercent"`
LikeStatus string `json:"likeStatus"`
RepeatType string `json:"repeatType"`
}
type track struct {
Author string `json:"author"`
Title string `json:"title"`
Album string `json:"album"`
Cover string `json:"cover"`
Duration int `json:"duration"`
DurationHuman string `json:"durationHuman"`
URL string `json:"url"`
ID string `json:"id"`
IsVideo bool `json:"isVideo"`
IsAdvertisement bool `json:"isAdvertisement"`
InLibrary bool `json:"inLibrary"`
}
func (y *ytm) setStatus() error {
// https://github.com/ytmdesktop/ytmdesktop/wiki/Remote-Control-API
url := y.props.getString(APIURL, "http://localhost:9863")
body, err := y.env.doGet(url + "/query")
if err != nil {
return err
}
q := new(ytmdaStatusResponse)
err = json.Unmarshal(body, &q)
if err != nil {
return err
}
y.status = playing
if !q.player.HasSong {
y.status = stopped
} else if q.player.IsPaused {
y.status = paused
}
y.artist = q.track.Author
y.track = q.track.Title
return nil
}