diff --git a/backend/playbackmanager.go b/backend/playbackmanager.go index 0e928cd..ddb7365 100644 --- a/backend/playbackmanager.go +++ b/backend/playbackmanager.go @@ -179,6 +179,19 @@ func (p *PlaybackManager) PlayTrackAt(idx int) error { return p.player.PlayTrackAt(idx) } +func (p *PlaybackManager) PlayRandomSongs(genreName string) { + params := map[string]string{"size": "100"} + if genreName != "" { + params["genre"] = genreName + } + if songs, err := p.sm.Server.GetRandomSongs(params); err != nil { + log.Printf("error getting random songs: %s", err.Error()) + } else { + p.LoadTracks(songs, false, false) + p.PlayFromBeginning() + } +} + func (p *PlaybackManager) GetPlayQueue() []*subsonic.Child { pq := make([]*subsonic.Child, len(p.playQueue)) for i, tr := range p.playQueue { diff --git a/ui/browsing/genrepage.go b/ui/browsing/genrepage.go index 142a4fb..fc70b00 100644 --- a/ui/browsing/genrepage.go +++ b/ui/browsing/genrepage.go @@ -2,6 +2,7 @@ package browsing import ( "supersonic/backend" + "supersonic/res" "supersonic/ui/controller" "supersonic/ui/widgets" @@ -27,6 +28,7 @@ type GenrePage struct { searcher *widgets.Searcher searchText string titleDisp *widget.RichText + playRandom *widget.Button OnPlayAlbum func(string, int) @@ -47,6 +49,7 @@ func NewGenrePage(genre string, contr *controller.Controller, pm *backend.Playba g.titleDisp.Segments[0].(*widget.TextSegment).Style = widget.RichTextStyle{ SizeName: theme.SizeNameHeadingText, } + g.playRandom = widget.NewButtonWithIcon("Play random", res.ResShuffleInvertSvg, g.playRandomSongs) iter := g.lm.GenreIter(g.genre) g.grid = widgets.NewAlbumGrid(iter, g.im, false) g.grid.OnPlayAlbum = g.onPlayAlbum @@ -65,8 +68,9 @@ func (g *GenrePage) createContainer(searchGrid bool) { if searchGrid { gr = g.searchGrid } + playRandomVbox := container.NewVBox(layout.NewSpacer(), g.playRandom, layout.NewSpacer()) g.container = container.NewBorder( - container.NewHBox(widgets.NewHSpace(6), g.titleDisp, layout.NewSpacer(), searchVbox, widgets.NewHSpace(15)), + container.NewHBox(widgets.NewHSpace(6), g.titleDisp, playRandomVbox, layout.NewSpacer(), searchVbox, widgets.NewHSpace(15)), nil, nil, nil, @@ -88,6 +92,7 @@ func restoreGenrePage(saved *savedGenrePage) *GenrePage { g.titleDisp.Segments[0].(*widget.TextSegment).Style = widget.RichTextStyle{ SizeName: theme.SizeNameHeadingText, } + g.playRandom = widget.NewButtonWithIcon("Play random", res.ResShuffleInvertSvg, g.playRandomSongs) g.grid = widgets.NewAlbumGridFromState(saved.gridState) g.searcher = widgets.NewSearcher() g.searcher.OnSearched = g.OnSearched @@ -108,10 +113,6 @@ func (a *GenrePage) Route() controller.Route { return controller.GenreRoute(a.genre) } -func (a *GenrePage) SetPlayAlbumCallback(cb func(string, int)) { - a.OnPlayAlbum = cb -} - func (g *GenrePage) Reload() { if g.searchText != "" { g.doSearch(g.searchText) @@ -184,6 +185,10 @@ func (g *GenrePage) doSearch(query string) { g.Refresh() } +func (g *GenrePage) playRandomSongs() { + go g.pm.PlayRandomSongs(g.genre) +} + type savedGenrePage struct { genre string searchText string