navidrome/api/browsing.go

94 lines
2.4 KiB
Go
Raw Normal View History

package api
import (
"fmt"
"time"
2016-03-03 06:46:23 +01:00
"github.com/astaxie/beego"
"github.com/deluan/gosonic/api/responses"
"github.com/deluan/gosonic/engine"
"github.com/deluan/gosonic/utils"
)
type BrowsingController struct {
BaseAPIController
browser engine.Browser
}
func (c *BrowsingController) Prepare() {
2016-03-11 21:16:17 +01:00
utils.ResolveDependencies(&c.browser)
}
func (c *BrowsingController) GetMediaFolders() {
mediaFolderList, _ := c.browser.MediaFolders()
folders := make([]responses.MusicFolder, len(mediaFolderList))
for i, f := range mediaFolderList {
folders[i].Id = f.Id
folders[i].Name = f.Name
}
response := c.NewEmpty()
response.MusicFolders = &responses.MusicFolders{Folders: folders}
c.SendResponse(response)
}
// TODO: Shortcuts amd validate musicFolder parameter
func (c *BrowsingController) GetIndexes() {
ifModifiedSince := c.ParamTime("ifModifiedSince", time.Time{})
indexes, lastModified, err := c.browser.Indexes(ifModifiedSince)
if err != nil {
beego.Error("Error retrieving Indexes:", err)
c.SendError(responses.ERROR_GENERIC, "Internal Error")
}
res := responses.Indexes{
IgnoredArticles: beego.AppConfig.String("ignoredArticles"),
LastModified: fmt.Sprint(utils.ToMillis(lastModified)),
}
res.Index = make([]responses.Index, len(indexes))
for i, idx := range indexes {
res.Index[i].Name = idx.Id
res.Index[i].Artists = make([]responses.Artist, len(idx.Artists))
for j, a := range idx.Artists {
res.Index[i].Artists[j].Id = a.ArtistId
res.Index[i].Artists[j].Name = a.Artist
}
}
response := c.NewEmpty()
response.Indexes = &res
c.SendResponse(response)
}
func (c *BrowsingController) GetDirectory() {
id := c.RequiredParamString("id", "id parameter required")
2016-03-03 15:50:50 +01:00
response := c.NewEmpty()
dir, err := c.browser.Directory(id)
2016-03-03 15:50:50 +01:00
switch {
2016-03-10 17:25:15 +01:00
case err == engine.ErrDataNotFound:
2016-03-10 00:46:53 +01:00
beego.Error("Requested Id", id, "not found:", err)
2016-03-03 15:50:50 +01:00
c.SendError(responses.ERROR_DATA_NOT_FOUND, "Directory not found")
case err != nil:
beego.Error(err)
c.SendError(responses.ERROR_GENERIC, "Internal Error")
}
response.Directory = c.buildDirectory(dir)
c.SendResponse(response)
}
2016-03-03 02:50:16 +01:00
func (c *BrowsingController) buildDirectory(d *engine.DirectoryInfo) *responses.Directory {
dir := &responses.Directory{Id: d.Id, Name: d.Name}
2016-03-11 15:10:40 +01:00
dir.Child = make([]responses.Child, len(d.Entries))
for i, entry := range d.Entries {
dir.Child[i] = c.ToChild(entry)
2016-03-03 15:50:50 +01:00
}
return dir
}