diff --git a/api/browsing.go b/api/browsing.go index 8f54b9e3c..8aea376eb 100644 --- a/api/browsing.go +++ b/api/browsing.go @@ -64,8 +64,6 @@ func (c *BrowsingController) GetIndexes() { func (c *BrowsingController) GetMusicDirectory() { id := c.RequiredParamString("id", "id parameter required") - response := c.NewEmpty() - dir, err := c.browser.Directory(id) switch { case err == domain.ErrNotFound: @@ -76,8 +74,27 @@ func (c *BrowsingController) GetMusicDirectory() { c.SendError(responses.ErrorGeneric, "Internal Error") } + response := c.NewEmpty() response.Directory = c.buildDirectory(dir) + c.SendResponse(response) +} +func (c *BrowsingController) GetSong() { + id := c.RequiredParamString("id", "id parameter required") + + song, err := c.browser.GetSong(id) + switch { + case err == domain.ErrNotFound: + beego.Error("Requested Id", id, "not found:", err) + c.SendError(responses.ErrorDataNotFound, "Directory not found") + case err != nil: + beego.Error(err) + c.SendError(responses.ErrorGeneric, "Internal Error") + } + + response := c.NewEmpty() + child := c.ToChild(*song) + response.Song = &child c.SendResponse(response) } diff --git a/api/responses/responses.go b/api/responses/responses.go index 796d07e5a..fa7b31c44 100644 --- a/api/responses/responses.go +++ b/api/responses/responses.go @@ -21,6 +21,7 @@ type Subsonic struct { SearchResult2 *SearchResult2 `xml:"searchResult2,omitempty" json:"searchResult2,omitempty"` Starred *Starred `xml:"starred,omitempty" json:"starred,omitempty"` NowPlaying *NowPlaying `xml:"nowPlaying,omitempty" json:"nowPlaying,omitempty"` + Song *Child `xml:"song,omitempty" json:"song,omitempty"` } type JsonWrapper struct { diff --git a/conf/router.go b/conf/router.go index b14fc016d..dd3a48462 100644 --- a/conf/router.go +++ b/conf/router.go @@ -23,6 +23,7 @@ func mapEndpoints() { beego.NSRouter("/getMusicFolders.view", &api.BrowsingController{}, "*:GetMusicFolders"), beego.NSRouter("/getIndexes.view", &api.BrowsingController{}, "*:GetIndexes"), beego.NSRouter("/getMusicDirectory.view", &api.BrowsingController{}, "*:GetMusicDirectory"), + beego.NSRouter("/getSong.view", &api.BrowsingController{}, "*:GetSong"), beego.NSRouter("/search2.view", &api.SearchingController{}, "*:Search2"), diff --git a/engine/browser.go b/engine/browser.go index 21264e1ed..5be7cad84 100644 --- a/engine/browser.go +++ b/engine/browser.go @@ -15,6 +15,7 @@ type Browser interface { MediaFolders() (domain.MediaFolders, error) Indexes(ifModifiedSince time.Time) (domain.ArtistIndexes, time.Time, error) Directory(id string) (*DirectoryInfo, error) + GetSong(id string) (*Entry, error) } func NewBrowser(pr PropertyRepository, fr domain.MediaFolderRepository, ir domain.ArtistIndexRepository, @@ -87,6 +88,16 @@ func (b *browser) Directory(id string) (*DirectoryInfo, error) { return dir, nil } +func (b *browser) GetSong(id string) (*Entry, error) { + mf, err := b.mfileRepo.Get(id) + if err != nil { + return nil, err + } + + entry := FromMediaFile(mf) + return &entry, nil +} + func (b *browser) buildArtistDir(a *domain.Artist, albums domain.Albums) *DirectoryInfo { dir := &DirectoryInfo{Id: a.Id, Name: a.Name}