f529fd556c
Artist tree is a map that maps the artist names to a map of albums Similarly the Album tree is a map that maps album names to their content. Album trees are generated from artist trees. the content of the album is a map of title to the destinationFile.
140 lines
3.7 KiB
Go
140 lines
3.7 KiB
Go
package main
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/rivo/tview"
|
|
)
|
|
|
|
func getFormattedString(s string, width int) string {
|
|
if len(s) < width {
|
|
s += strings.Repeat(" ", (width - len(s)))
|
|
} else {
|
|
s = s[:(width - 2)]
|
|
s += " "
|
|
}
|
|
return s
|
|
}
|
|
|
|
func togglePlayBack() error {
|
|
status, err := CONN.Status()
|
|
if status["state"] == "play" && err == nil {
|
|
CONN.Pause(true)
|
|
} else if status["state"] == "pause" && err == nil {
|
|
CONN.Play(-1)
|
|
}
|
|
return err
|
|
}
|
|
|
|
func UpdatePlaylist(inputTable *tview.Table) {
|
|
_playlistAttr, _ := CONN.PlaylistInfo(-1, -1)
|
|
|
|
inputTable.Clear()
|
|
for i, j := range _playlistAttr {
|
|
_, _, w, _ := inputTable.GetInnerRect()
|
|
if j["Title"] == "" || j["Artist"] == "" || j["Album"] == "" {
|
|
inputTable.SetCell(i, 0, tview.NewTableCell(getFormattedString(j["file"], w/3)))
|
|
} else {
|
|
inputTable.SetCell(i, 0, tview.NewTableCell(getFormattedString("[green]"+j["Title"], w/3)))
|
|
inputTable.SetCell(i, 1, tview.NewTableCell(getFormattedString("[magenta]"+j["Artist"], w/3)))
|
|
inputTable.SetCell(i, 2, tview.NewTableCell("[yellow]"+j["Album"]))
|
|
}
|
|
}
|
|
}
|
|
|
|
func join(stringSlice []string) string {
|
|
var _s string = stringSlice[0]
|
|
for i := 1; i < len(stringSlice); i++ {
|
|
if _s != "" {
|
|
_s += ("/" + stringSlice[i])
|
|
}
|
|
}
|
|
return _s
|
|
}
|
|
|
|
func Update(f []FileNode, inputTable *tview.Table) {
|
|
inputTable.Clear()
|
|
for i, j := range f {
|
|
if len(j.children) == 0 {
|
|
_songAttributes, err := CONN.ListAllInfo(j.absolutePath)
|
|
if err == nil && _songAttributes[0]["Title"] != "" {
|
|
_, _, w, _ := inputTable.GetInnerRect()
|
|
inputTable.SetCell(i, 0,
|
|
tview.NewTableCell("[green]"+getFormattedString(_songAttributes[0]["Title"], w/3)).
|
|
SetAlign(tview.AlignLeft))
|
|
|
|
inputTable.SetCell(i, 1,
|
|
tview.NewTableCell("[magenta]"+getFormattedString(_songAttributes[0]["Artist"], w/3)).
|
|
SetAlign(tview.AlignLeft))
|
|
|
|
inputTable.SetCell(i, 2,
|
|
tview.NewTableCell("[yellow]"+_songAttributes[0]["Album"]).
|
|
SetAlign(tview.AlignLeft))
|
|
|
|
} else if _songAttributes[0]["Title"] == "" {
|
|
inputTable.SetCell(i, 0,
|
|
tview.NewTableCell("[blue]"+j.path).
|
|
SetAlign(tview.AlignLeft))
|
|
}
|
|
} else {
|
|
inputTable.SetCell(i, 0,
|
|
tview.NewTableCell("[yellow::b]"+j.path).
|
|
SetAlign(tview.AlignLeft))
|
|
}
|
|
}
|
|
}
|
|
|
|
func GenerateArtistTree() (map[string]map[string]map[string]string, error) {
|
|
ArtistTree := make(map[string]map[string]map[string]string)
|
|
AllInfo, err := CONN.ListAllInfo("/")
|
|
if err == nil {
|
|
for _, i := range AllInfo {
|
|
if _, ArtistExists := ArtistTree[i["Artist"]]; !ArtistExists {
|
|
ArtistTree[i["Artist"]] = make(map[string]map[string]string)
|
|
}
|
|
if _, AlbumExists := ArtistTree[i["Artist"]][i["Album"]]; !AlbumExists {
|
|
ArtistTree[i["Artist"]][i["Album"]] = make(map[string]string)
|
|
}
|
|
if _, TitleExists := ArtistTree[i["Artist"]][i["Album"]][i["Title"]]; !TitleExists {
|
|
ArtistTree[i["Artist"]][i["Album"]][i["Title"]] = i["file"]
|
|
}
|
|
}
|
|
return ArtistTree, nil
|
|
} else {
|
|
return nil, errors.New("Could Not Generate Artist Tree")
|
|
}
|
|
}
|
|
|
|
func GetAlbumTree(a map[string]map[string]map[string]string) map[string]map[string]string {
|
|
AlbumTree := make(map[string]map[string]string)
|
|
for _, AlbumMap := range a {
|
|
for AlbumName, AlbumContent := range AlbumMap {
|
|
AlbumTree[AlbumName] = AlbumContent
|
|
}
|
|
}
|
|
return AlbumTree
|
|
}
|
|
|
|
func PrintAlbumTree(a map[string]map[string]string) {
|
|
for k, v := range a {
|
|
fmt.Println(k)
|
|
for k1 := range v {
|
|
fmt.Println("\t|---", k1)
|
|
}
|
|
}
|
|
}
|
|
|
|
func PrintArtistTree(a map[string]map[string]map[string]string) {
|
|
for k, v := range a {
|
|
fmt.Println(k, " : ")
|
|
for k1, v1 := range v {
|
|
fmt.Println("\t|---", k1, " : ")
|
|
for k2 := range v1 {
|
|
fmt.Println("\t\t|---", k2)
|
|
}
|
|
}
|
|
}
|
|
}
|