122 lines
3.3 KiB
Go
122 lines
3.3 KiB
Go
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)
|
|
}
|