navidrome/api/searching.go

106 lines
3.0 KiB
Go
Raw Normal View History

2016-03-11 06:37:07 +01:00
package api
import (
2016-03-24 02:06:39 +01:00
"fmt"
"net/http"
2016-03-24 02:06:39 +01:00
2017-04-01 15:47:14 +02:00
"github.com/cloudsonic/sonic-server/api/responses"
"github.com/cloudsonic/sonic-server/engine"
2020-01-09 02:45:07 +01:00
"github.com/cloudsonic/sonic-server/log"
2016-03-11 06:37:07 +01:00
)
type SearchingController struct {
2020-01-11 18:04:40 +01:00
search engine.Search
}
type searchParams struct {
2016-03-28 16:01:43 +02:00
query string
artistCount int
artistOffset int
albumCount int
albumOffset int
songCount int
songOffset int
2016-03-11 06:37:07 +01:00
}
func NewSearchingController(search engine.Search) *SearchingController {
return &SearchingController{search: search}
2016-03-11 06:37:07 +01:00
}
2020-01-11 18:04:40 +01:00
func (c *SearchingController) getParams(r *http.Request) (*searchParams, error) {
var err error
2020-01-11 18:04:40 +01:00
sp := &searchParams{}
sp.query, err = RequiredParamString(r, "query", "Parameter query required")
if err != nil {
2020-01-11 18:04:40 +01:00
return nil, err
}
2020-01-11 18:04:40 +01:00
sp.artistCount = ParamInt(r, "artistCount", 20)
sp.artistOffset = ParamInt(r, "artistOffset", 0)
sp.albumCount = ParamInt(r, "albumCount", 20)
sp.albumOffset = ParamInt(r, "albumOffset", 0)
sp.songCount = ParamInt(r, "songCount", 20)
sp.songOffset = ParamInt(r, "songOffset", 0)
return sp, nil
2016-03-28 16:01:43 +02:00
}
2020-01-11 18:04:40 +01:00
func (c *SearchingController) searchAll(r *http.Request, sp *searchParams) (engine.Entries, engine.Entries, engine.Entries) {
as, err := c.search.SearchArtist(r.Context(), sp.query, sp.artistOffset, sp.artistCount)
2016-03-11 06:37:07 +01:00
if err != nil {
2020-01-09 02:45:07 +01:00
log.Error(r, "Error searching for Artists", err)
2016-03-11 06:37:07 +01:00
}
2020-01-11 18:04:40 +01:00
als, err := c.search.SearchAlbum(r.Context(), sp.query, sp.albumOffset, sp.albumCount)
2016-03-11 16:03:33 +01:00
if err != nil {
2020-01-09 02:45:07 +01:00
log.Error(r, "Error searching for Albums", err)
2016-03-11 16:03:33 +01:00
}
2020-01-11 18:04:40 +01:00
mfs, err := c.search.SearchSong(r.Context(), sp.query, sp.songOffset, sp.songCount)
2016-03-11 16:03:33 +01:00
if err != nil {
2020-01-09 02:45:07 +01:00
log.Error(r, "Error searching for MediaFiles", err)
2016-03-11 16:03:33 +01:00
}
2016-03-11 06:37:07 +01:00
2020-01-11 18:04:40 +01:00
log.Debug(r, fmt.Sprintf("Search resulted in %d songs, %d albums and %d artists", len(mfs), len(als), len(as)), "query", sp.query)
2016-03-28 16:01:43 +02:00
return mfs, als, as
}
func (c *SearchingController) Search2(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) {
2020-01-11 18:04:40 +01:00
sp, err := c.getParams(r)
if err != nil {
return nil, err
}
2020-01-11 18:04:40 +01:00
mfs, als, as := c.searchAll(r, sp)
2016-03-24 02:06:39 +01:00
2020-01-11 23:18:20 +01:00
response := NewResponse()
2016-03-11 06:37:07 +01:00
searchResult2 := &responses.SearchResult2{}
searchResult2.Artist = ToArtists(as)
searchResult2.Album = ToChildren(als)
searchResult2.Song = ToChildren(mfs)
2016-03-11 06:37:07 +01:00
response.SearchResult2 = searchResult2
return response, nil
2016-03-11 06:37:07 +01:00
}
2016-03-28 16:01:43 +02:00
func (c *SearchingController) Search3(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) {
2020-01-11 18:04:40 +01:00
sp, err := c.getParams(r)
if err != nil {
return nil, err
}
2020-01-11 18:04:40 +01:00
mfs, als, as := c.searchAll(r, sp)
2016-03-28 16:01:43 +02:00
2020-01-11 23:18:20 +01:00
response := NewResponse()
2016-03-28 16:01:43 +02:00
searchResult3 := &responses.SearchResult3{}
searchResult3.Artist = make([]responses.ArtistID3, len(as))
for i, e := range as {
searchResult3.Artist[i] = responses.ArtistID3{
Id: e.Id,
Name: e.Title,
CoverArt: e.CoverArt,
AlbumCount: e.AlbumCount,
}
if !e.Starred.IsZero() {
searchResult3.Artist[i].Starred = &e.Starred
}
2016-03-28 16:01:43 +02:00
}
searchResult3.Album = ToAlbums(als)
searchResult3.Song = ToChildren(mfs)
2016-03-28 16:01:43 +02:00
response.SearchResult3 = searchResult3
return response, nil
2016-03-28 16:01:43 +02:00
}