Files
gspt/ui/view_search.go
2023-05-13 00:17:17 +05:30

166 lines
4.1 KiB
Go

package ui
import (
"github.com/aditya-K2/gspt/spt"
"github.com/zmb3/spotify/v2"
)
type SearchContent struct {
URI spotify.URI
ID spotify.ID
Name string
Type string
}
type SearchView struct {
*DefaultViewNone
search string
results *spotify.SearchResult
searchContent []SearchContent
}
func NewSearchView() *SearchView {
s := &SearchView{
&DefaultViewNone{&defView{}},
"", nil, []SearchContent{},
}
return s
}
func (a *SearchView) Content() func() [][]Content {
return func() [][]Content {
c := make([][]Content, 0)
generate := true
if len(a.searchContent) != 0 {
generate = false
}
if a.results != nil {
if a.results.Tracks != nil {
c = append(c, []Content{{"Tracks", NotSelectableStyle}})
if generate {
a.searchContent = append(a.searchContent, SearchContent{Type: "null"})
}
for _, v := range a.results.Tracks.Tracks {
if generate {
a.searchContent = append(a.searchContent, SearchContent{v.URI, v.ID, v.Name, "track"})
}
c = append(c, []Content{
{Content: v.Name, Style: TrackStyle},
{Content: artistName(v.Artists), Style: ArtistStyle},
{Content: v.Album.Name, Style: AlbumStyle},
})
}
}
if a.results.Albums != nil {
c = append(c, []Content{{"Albums", NotSelectableStyle}})
if generate {
a.searchContent = append(a.searchContent, SearchContent{Type: "null"})
}
for _, v := range a.results.Albums.Albums {
if generate {
a.searchContent = append(a.searchContent, SearchContent{v.URI, v.ID, v.Name, "album"})
}
c = append(c, []Content{
{Content: v.Name, Style: AlbumStyle},
{Content: artistName(v.Artists), Style: ArtistStyle},
{Content: v.ReleaseDate, Style: TimeStyle},
})
}
}
if a.results.Artists != nil {
c = append(c, []Content{{"Artists", NotSelectableStyle}})
if generate {
a.searchContent = append(a.searchContent, SearchContent{Type: "null"})
}
for _, v := range a.results.Artists.Artists {
if generate {
a.searchContent = append(a.searchContent, SearchContent{v.URI, v.ID, v.Name, "artist"})
}
c = append(c, []Content{
{Content: v.Name, Style: AlbumStyle},
})
}
}
if a.results.Playlists != nil {
c = append(c, []Content{{"Playlists", NotSelectableStyle}})
if generate {
a.searchContent = append(a.searchContent, SearchContent{Type: "null"})
}
for _, v := range a.results.Playlists.Playlists {
if generate {
a.searchContent = append(a.searchContent, SearchContent{v.URI, v.ID, v.Name, "playlist"})
}
c = append(c, []Content{
{Content: v.Name, Style: PlaylistNavStyle},
{Content: v.Owner.DisplayName, Style: ArtistStyle},
})
}
}
}
return c
}
}
func (a *SearchView) OpenEntry() {
r, _ := Main.GetSelection()
switch a.searchContent[r].Type {
case "track":
{
if err := spt.PlaySong(a.searchContent[r].URI); err != nil {
SendNotification(err.Error())
}
}
case "album":
{
albumView.SetAlbum(a.searchContent[r].Name, &a.searchContent[r].ID)
SetCurrentView(albumView)
}
case "artist":
{
artistView.SetArtist(&a.searchContent[r].ID)
SetCurrentView(artistView)
}
case "playlist":
{
if p, err := spt.GetFullPlaylist(a.searchContent[r].ID); err != nil {
SendNotification("Error Opening the playlists: " + err.Error())
return
} else {
playlistView.SetPlaylist(&p.SimplePlaylist)
SetCurrentView(playlistView)
}
}
}
}
func (a *SearchView) PlayEntry() {
r, _ := Main.GetSelection()
switch a.searchContent[r].Type {
case "album", "artist", "playlist":
{
if err := spt.PlayContext(a.searchContent[r].URI); err != nil {
SendNotification(err.Error())
}
}
}
}
func (a *SearchView) RefreshState() {
if a.search != "" {
results, err := spt.Search(a.search)
if err != nil {
SendNotification("Error retrieving Artist Top Tracks: " + err.Error())
return
}
a.results = results
}
}
func (a *SearchView) SetSearch(s string) {
a.search = s
a.searchContent = make([]SearchContent, 0)
a.RefreshState()
}
func (a *SearchView) Name() string { return "SearchView" }