mirror of
https://github.com/aditya-K2/gspt.git
synced 2026-01-07 21:13:50 -05:00
166 lines
4.1 KiB
Go
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" }
|