Files
gspt/ui/view_playlist.go
2023-12-17 15:25:57 +05:30

102 lines
2.5 KiB
Go

package ui
import (
"fmt"
"github.com/aditya-K2/gspt/spt"
"github.com/gdamore/tcell/v2"
"github.com/zmb3/spotify/v2"
)
type PlaylistView struct {
*DefaultView
currentPlaylist *spotify.SimplePlaylist
currentUserFullPlaylist *spt.Playlist
}
func NewPlaylistView() *PlaylistView {
p := &PlaylistView{
&DefaultView{&defView{}},
nil,
nil,
}
return p
}
func (p *PlaylistView) SetPlaylist(pl *spotify.SimplePlaylist) {
p.currentPlaylist = pl
p.currentUserFullPlaylist = nil
}
func (p *PlaylistView) Content() func() [][]Content {
return func() [][]Content {
c := make([][]Content, 0)
if p.currentPlaylist != nil {
if p.currentUserFullPlaylist == nil {
msg := SendNotificationWithChan("Fetching %s....", p.currentPlaylist.Name)
pf, ch := spt.GetPlaylist(p.currentPlaylist.ID)
go func() {
err := <-ch
if err != nil {
msg <- err.Error()
} else {
msg <- "Playlist Fetched Succesfully!"
}
}()
p.currentUserFullPlaylist = pf
}
if p.currentUserFullPlaylist != nil {
for _, v := range *(*p.currentUserFullPlaylist).Tracks {
c = append(c, []Content{
{Content: v.Track.Name, Style: TrackStyle},
{Content: artistName(v.Track.Artists), Style: ArtistStyle},
{Content: v.Track.Album.Name, Style: AlbumStyle},
})
}
}
}
return c
}
}
func (p *PlaylistView) AddToPlaylist() {
r, _ := Main.GetSelection()
addToPlaylist([]spotify.ID{(*(*p.currentUserFullPlaylist).Tracks)[r].Track.ID})
}
func (p *PlaylistView) AddToPlaylistVisual(start, end int, e *tcell.EventKey) *tcell.EventKey {
addToPlaylist(Map((*(*p.currentUserFullPlaylist).Tracks)[start:end+1],
func(s spotify.PlaylistTrack) spotify.ID {
return s.Track.ID
}))
return nil
}
func (p *PlaylistView) QueueSongsVisual(start, end int, e *tcell.EventKey) *tcell.EventKey {
tracks := (*(*p.currentUserFullPlaylist).Tracks)[start : end+1]
queueSongs(Map(tracks,
func(s spotify.PlaylistTrack) spotify.ID {
return s.Track.ID
}))
return nil
}
func (p *PlaylistView) OpenEntry() {
r, _ := Main.GetSelection()
if err := spt.PlaySongWithContext(p.currentPlaylist.URI, r); err != nil {
SendNotification(err.Error())
}
}
func (p *PlaylistView) QueueEntry() {
r, _ := Main.GetSelection()
track := (*(*p.currentUserFullPlaylist).Tracks)[r].Track
msg := fmt.Sprintf("%s queued succesfully!", track.Name)
if err := spt.QueueTracks(track.ID); err != nil {
msg = err.Error()
}
SendNotification(msg)
}
func (p *PlaylistView) Name() string { return "PlaylistView" }