diff --git a/server/ctrlsubsonic/handlers_common.go b/server/ctrlsubsonic/handlers_common.go index d929f58..799d5eb 100644 --- a/server/ctrlsubsonic/handlers_common.go +++ b/server/ctrlsubsonic/handlers_common.go @@ -283,3 +283,26 @@ func (c *Controller) ServeGetSong(r *http.Request) *spec.Response { sub.Track = spec.NewTrackByTags(track, track.Album) return sub } + +func (c *Controller) ServeGetRandomSongs(r *http.Request) *spec.Response { + params := r.Context().Value(CtxParams).(params.Params) + // TODO: add genre restraint here + var tracks []*db.Track + c.DB.DB. + Limit(params.GetIntOr("size", 10)). + Where( + "albums.tag_year BETWEEN ? AND ?", + params.GetIntOr("fromYear", 1800), + params.GetIntOr("toYear", 2200)). + Joins("JOIN albums ON tracks.album_id=albums.id"). + Preload("Album"). + Order(gorm.Expr("random()")). + Find(&tracks) + sub := spec.NewResponse() + sub.RandomTracks = &spec.RandomTracks{} + sub.RandomTracks.List = make([]*spec.TrackChild, len(tracks)) + for i, track := range tracks { + sub.RandomTracks.List[i] = spec.NewTrackByTags(track, track.Album) + } + return sub +} diff --git a/server/ctrlsubsonic/spec/spec.go b/server/ctrlsubsonic/spec/spec.go index aa69704..7353067 100644 --- a/server/ctrlsubsonic/spec/spec.go +++ b/server/ctrlsubsonic/spec/spec.go @@ -106,7 +106,7 @@ type Album struct { } type RandomTracks struct { - Tracks []*TrackChild `xml:"song" json:"song"` + List []*TrackChild `xml:"song" json:"song"` } type TrackChild struct { diff --git a/server/server.go b/server/server.go index 07df324..c668de3 100644 --- a/server/server.go +++ b/server/server.go @@ -144,6 +144,7 @@ func setupSubsonic(router *mux.Router, ctrl *ctrlsubsonic.Controller) { rout.Handle("/savePlayQueue{_:(?:\\.view)?}", ctrl.H(ctrl.ServeSavePlayQueue)) rout.Handle("/getPlayQueue{_:(?:\\.view)?}", ctrl.H(ctrl.ServeGetPlayQueue)) rout.Handle("/getSong{_:(?:\\.view)?}", ctrl.H(ctrl.ServeGetSong)) + rout.Handle("/getRandomSongs{_:(?:\\.view)?}", ctrl.H(ctrl.ServeGetRandomSongs)) // ** begin raw rout.Handle("/download{_:(?:\\.view)?}", ctrl.HR(ctrl.ServeStream)) rout.Handle("/getCoverArt{_:(?:\\.view)?}", ctrl.HR(ctrl.ServeGetCoverArt))