package radio import ( "strings" "sync" "github.com/pkg/errors" ) // Playlist holds a list of paths to a song files. type Playlist struct { sync.Mutex playlist []string cur int repeat bool } // NewPlaylist returns an instance of a Playlist struct with a loaded playlist. // Returns an error if failed to load a playlist. func NewPlaylistFromPlaintext(data []byte, repeat bool) (*Playlist, error) { p := &Playlist{repeat: repeat} return p, p.LoadFromPlaintext(data) } // Next returns the next song to play. Returns an empty string if repeat is // false and the end of a playlist was reached. func (p *Playlist) Next() (song string) { if p.cur == len(p.playlist) { // If the end of a playlist was reached and repeat is set to true, // then go back to the head of it, thus repeating it. Return an empty // string otherwise. if p.repeat { p.cur = 0 } else { return "" } } song = p.playlist[p.cur] p.cur++ return } // Load accepts a byte array of plaintext data and parses it into an array of strings. // Also resets a cur index to 0 to start over. func (p *Playlist) LoadFromPlaintext(data []byte) error { if len(data) == 0 { return errors.New("an empty playlist array was passed") } p.playlist = strings.Split(string(data), "\n") p.cur = 0 return nil }