From aab665356867143cd471855f46e9fed617f4c3b9 Mon Sep 17 00:00:00 2001 From: Simon Garrelou Date: Sat, 10 Dec 2022 17:49:07 +0100 Subject: Play album/song next / end --- music/playqueue.go | 10 +++++++- src/app.go | 5 ++-- src/footer.go | 6 ++++- src/keybinds.go | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++ src/page_artists.go | 19 +++++++-------- 5 files changed, 91 insertions(+), 15 deletions(-) diff --git a/music/playqueue.go b/music/playqueue.go index 7c21b9b..235007e 100644 --- a/music/playqueue.go +++ b/music/playqueue.go @@ -43,9 +43,17 @@ func (q *Queue) Append(s *subsonic.Child) { q.songs = append(q.songs, s) } +func (q *Queue) Insert(i int, s *subsonic.Child) { + q.songs = append(q.songs[:i], append([]*subsonic.Child{s}, q.songs[i:]...)...) +} + func (q *Queue) Clear() { q.songs = make([]*subsonic.Child, 0) - speaker.Clear() + if q.isPaused { + q.TogglePause() + } + q.Stop() + q.triggerChange() } func (q *Queue) PlaySong(s *subsonic.Child) error { diff --git a/src/app.go b/src/app.go index 3a02dbe..f1995a4 100644 --- a/src/app.go +++ b/src/app.go @@ -20,8 +20,9 @@ type app struct { cfg *Config // Artists page - artistsTree *tview.TreeView - songsList *tview.List + artistsTree *tview.TreeView + songsList *tview.List + currentSongs []*subsonic.Child // Play queue page playQueueList *tview.List diff --git a/src/footer.go b/src/footer.go index 96b0aa3..be275c3 100644 --- a/src/footer.go +++ b/src/footer.go @@ -3,7 +3,11 @@ package src func (a *app) updateFooter() { switch a.headerSections.GetHighlights()[0] { case "artists": - a.footer.SetText("[blue]l:[yellow] Next song [blue]p:[yellow] Toggle pause") + if a.tv.GetFocus() == a.artistsTree { + a.footer.SetText("[blue]l:[yellow] Next song [blue]p:[yellow] Toggle pause [blue]e:[yellow] Play album last [blue]n:[yellow] Play album next") + } else if a.tv.GetFocus() == a.songsList { + a.footer.SetText("[blue]l:[yellow] Next song [blue]p:[yellow] Toggle pause [blue]e:[yellow] Play song last [blue]n:[yellow] Play song next") + } case "playqueue": a.footer.SetText("[blue]l:[yellow] Next song [blue]p:[yellow] Toggle pause [blue]d:[yellow] Remove [blue]j:[yellow] Move up [blue]k:[yellow] Move down") case "playlists": diff --git a/src/keybinds.go b/src/keybinds.go index 2a9c16b..ffdf64a 100644 --- a/src/keybinds.go +++ b/src/keybinds.go @@ -54,6 +54,72 @@ func (a *app) setupMusicControlKeys(p *tview.Box) { } } + if a.tv.GetFocus() == a.songsList { + if event.Rune() == 'e' { + // Add to end + sel := a.songsList.GetCurrentItem() + a.playQueue.Append(a.currentSongs[sel]) + + a.updatePageQueue() + } else if event.Rune() == 'n' { + // Add next + sel := a.songsList.GetCurrentItem() + a.playQueue.Insert(1, a.currentSongs[sel]) + + a.updatePageQueue() + } + } else if a.tv.GetFocus() == a.artistsTree { + if event.Rune() == 'e' { + // Add to end + sel := a.artistsTree.GetCurrentNode() + ref := sel.GetReference() + if ref == nil { + return nil + } + + if ref.(selection).entryType != "album" { + return nil + } + + id := ref.(selection).id + album, err := a.sub.GetMusicDirectory(id) + if err != nil { + a.alert("Error: %v", err) + return nil + } + + for _, s := range album.Child { + a.playQueue.Append(s) + } + + a.updatePageQueue() + } else if event.Rune() == 'n' { + // Add next + sel := a.artistsTree.GetCurrentNode() + ref := sel.GetReference() + if ref == nil { + return nil + } + + if ref.(selection).entryType != "album" { + return nil + } + + id := ref.(selection).id + album, err := a.sub.GetMusicDirectory(id) + if err != nil { + a.alert("Error: %v", err) + return nil + } + + for i := len(album.Child) - 1; i >= 0; i-- { + a.playQueue.Insert(1, album.Child[i]) + } + + a.updatePageQueue() + } + } + return event }) } diff --git a/src/page_artists.go b/src/page_artists.go index 6cbaee1..874a675 100644 --- a/src/page_artists.go +++ b/src/page_artists.go @@ -47,6 +47,7 @@ func (a *app) artistsPage() tview.Primitive { a.artistsTree.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey { if event.Key() == tcell.KeyLeft || event.Key() == tcell.KeyRight { a.tv.SetFocus(a.songsList) + a.updateFooter() return nil } return event @@ -55,6 +56,7 @@ func (a *app) artistsPage() tview.Primitive { a.songsList.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey { if event.Key() == tcell.KeyLeft || event.Key() == tcell.KeyRight { a.tv.SetFocus(a.artistsTree) + a.updateFooter() return nil } return event @@ -112,22 +114,17 @@ func (a *app) loadAlbumInPanel(id string) error { return err } - var songs []*subsonic.Child - a.songsList.Clear() - for i := len(album.Child) - 1; i >= 0; i-- { - song := album.Child[i] - songNoPtr := *song - songs = append([]*subsonic.Child{&songNoPtr}, songs...) - - songsCopy := make([]*subsonic.Child, len(songs)) - copy(songsCopy, songs) + a.currentSongs = make([]*subsonic.Child, 0) + for _, song := range album.Child { + a.currentSongs = append(a.currentSongs, song) txt := fmt.Sprintf("%-2d - %s", song.Track, song.Title) - a.songsList.InsertItem(0, txt, "", 0, func() { + a.songsList.AddItem(txt, "", 0, func() { + sel := a.songsList.GetCurrentItem() a.playQueue.Clear() - for _, s := range songsCopy { + for _, s := range a.currentSongs[sel:] { a.playQueue.Append(s) } err := a.playQueue.Play() -- cgit v1.2.3