82 lines
1.5 KiB
Go
82 lines
1.5 KiB
Go
package gomus
|
|
|
|
import (
|
|
"time"
|
|
|
|
tea "github.com/charmbracelet/bubbletea"
|
|
"github.com/faiface/beep/speaker"
|
|
)
|
|
|
|
var (
|
|
termWidth = 0
|
|
termHeight = 0
|
|
)
|
|
|
|
type ModelArgs struct {
|
|
MusicPath string
|
|
}
|
|
|
|
type Model struct {
|
|
cursor int
|
|
currentlyPlaying int
|
|
|
|
TrackPlayer
|
|
trackIndex
|
|
|
|
trackPlayerView
|
|
}
|
|
|
|
func NewModel(args ModelArgs) Model {
|
|
ti := NewDirTrackIndex(args.MusicPath)
|
|
tpv := newTrackPlayerView(ti.tracks)
|
|
|
|
return Model{
|
|
cursor: 0,
|
|
currentlyPlaying: 0,
|
|
|
|
trackIndex: ti,
|
|
TrackPlayer: TrackPlayer{},
|
|
|
|
trackPlayerView: tpv,
|
|
}
|
|
}
|
|
|
|
func (m Model) Init() tea.Cmd {
|
|
return tea.Batch(tea.EnterAltScreen, m.trackPlayerView.Init())
|
|
}
|
|
|
|
func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
|
|
var cmds []tea.Cmd
|
|
|
|
switch msg := msg.(type) {
|
|
case tea.WindowSizeMsg:
|
|
termHeight = msg.Height
|
|
termWidth = msg.Width
|
|
case tea.KeyMsg:
|
|
switch msg.String() {
|
|
case "ctrl+c", "q":
|
|
m.TrackPlayer.Close()
|
|
return m, tea.Quit
|
|
case "enter":
|
|
t := m.trackPlayerView.trackList.SelectedItem().(track)
|
|
cmds = append(cmds, newTrackChangeCmd(t))
|
|
stream, format, err := t.GetStream()
|
|
check(err)
|
|
speaker.Init(format.SampleRate, format.SampleRate.N(time.Second/10))
|
|
m.TrackPlayer.Play(&stream)
|
|
case " ":
|
|
pauseState := m.TrackPlayer.TogglePause()
|
|
cmds = append(cmds, newTrackPauseCmd(pauseState))
|
|
}
|
|
}
|
|
var cmd tea.Cmd
|
|
m.trackPlayerView, cmd = m.trackPlayerView.Update(msg)
|
|
cmds = append(cmds, cmd)
|
|
|
|
return m, tea.Batch(cmds...)
|
|
}
|
|
|
|
func (m Model) View() string {
|
|
return m.trackPlayerView.View()
|
|
}
|