subsonic-tui/internal/tui/views/player.go

123 lines
3.3 KiB
Go
Raw Normal View History

package views
import (
"fmt"
"time"
"git.dayanhub.com/sagi/subsonic-tui/internal/client"
"git.dayanhub.com/sagi/subsonic-tui/internal/config"
"git.dayanhub.com/sagi/subsonic-tui/internal/variables"
"github.com/delucks/go-subsonic"
"github.com/rivo/tview"
)
var _ View = &player{}
type player struct {
client *client.Client
view tview.Primitive
grid *tview.Grid
artwork *tview.Image
progress *tview.Flex
songInfo *tview.TextView
song *subsonic.Child
}
func NewPlayer(client *client.Client) *player {
grid := tview.NewGrid().SetColumns(9, 0)
grid.SetBackgroundColor(config.ColorBackground)
// album art
art := tview.NewImage()
art.SetBackgroundColor(config.ColorBackground)
grid.AddItem(art, 0, 0, 1, 1, 4, 4, false)
// Progress
progress := tview.NewFlex()
progress.SetBackgroundColor(config.ColorBackground)
// Song songInfo
songInfo := tview.NewTextView()
songInfo.SetDynamicColors(true)
songInfo.SetBackgroundColor(config.ColorBackground)
// Info + Progress
songProg := tview.NewFlex().SetDirection(tview.FlexRow)
songProg.AddItem(songInfo, 0, 4, false)
songProg.AddItem(progress, 0, 1, false)
grid.AddItem(songProg, 0, 1, 1, 1, 0, 0, false)
player := &player{
client: client,
view: grid,
artwork: art,
songInfo: songInfo,
grid: grid,
progress: progress,
}
player.SetSongInfo(&subsonic.Child{
Title: "Subsonic TUI",
Album: "Made with love ❤️",
Artist: "ZeGoomba",
CoverArt: "",
Duration: 0,
})
player.UpdateProgress(time.Duration(0))
return player
}
func (p *player) SetSongInfo(song *subsonic.Child) {
info := fmt.Sprintf("[yellow]Title:[white] %s\n[yellow]Album:[white] %s\n[yellow]Atrists:[white] %s",
song.Title, song.Album, song.Artist)
p.songInfo.SetText(info)
p.song = song
p.LoadAlbumArt(song.CoverArt)
}
func (p *player) LoadAlbumArt(ID string) {
i, _ := p.client.GetCoverArt(ID)
p.artwork.SetImage(i)
}
func (p *player) UpdateProgress(elapsed time.Duration) {
if p.song.Duration == 0 {
// Startup... Show version number
versionInfo := tview.NewTextView().SetText(fmt.Sprintf("Version: %s | Commit: %s",
variables.Version, variables.Commit))
versionInfo.SetBackgroundColor(config.ColorPlaybackProgressRemaining)
versionInfo.SetTextColor(config.ColorPlaybackProgressElapsed)
p.progress.AddItem(versionInfo, 0, 1, false)
return
}
songDuration := time.Duration(p.song.Duration) * time.Second
overlappedBox := tview.NewTextView()
overlappedBox.SetBackgroundColor(config.ColorPlaybackProgressElapsed)
overlappedBox.SetTextColor(config.ColorPlaybackProgressRemaining)
overlappedBox.SetText(songDuration.String())
remainingBox := tview.NewTextView()
remainingBox.SetBackgroundColor(config.ColorPlaybackProgressRemaining)
remainingBox.SetTextColor(config.ColorPlaybackProgressElapsed)
remainingBox.SetTextAlign(tview.AlignRight)
rm := time.Duration(songDuration.Seconds()-elapsed.Seconds()) * time.Second
remaining := "-" + rm.String()
remainingBox.SetText(remaining)
p.progress.Clear()
p.progress.AddItem(overlappedBox, 0, int(elapsed.Seconds()), false)
p.progress.AddItem(remainingBox, 0, int(songDuration.Seconds())-int(elapsed.Seconds()), false)
}
func (p *player) GetView() tview.Primitive {
return p.view
}
func (p *player) Update() {
// p.UpdateProgress("00:00", 50)
}