getAlbum.view implemented

This commit is contained in:
Deluan 2016-03-28 09:16:03 -04:00
parent 82576223dc
commit 615dc862af
4 changed files with 102 additions and 27 deletions

View file

@ -111,6 +111,24 @@ func (c *BrowsingController) GetArtist() {
c.SendResponse(response)
}
func (c *BrowsingController) GetAlbum() {
id := c.RequiredParamString("id", "id parameter required")
dir, err := c.browser.Album(id)
switch {
case err == domain.ErrNotFound:
beego.Error("Requested AlbumId", id, "not found:", err)
c.SendError(responses.ErrorDataNotFound, "Album not found")
case err != nil:
beego.Error(err)
c.SendError(responses.ErrorGeneric, "Internal Error")
}
response := c.NewEmpty()
response.AlbumWithSongsID3 = c.buildAlbum(dir)
c.SendResponse(response)
}
func (c *BrowsingController) GetSong() {
id := c.RequiredParamString("id", "id parameter required")
@ -148,13 +166,11 @@ func (c *BrowsingController) buildDirectory(d *engine.DirectoryInfo) *responses.
}
func (c *BrowsingController) buildArtist(d *engine.DirectoryInfo) *responses.ArtistWithAlbumsID3 {
dir := &responses.ArtistWithAlbumsID3{
Id: d.Id,
Name: d.Name,
PlayCount: d.PlayCount,
AlbumCount: d.AlbumCount,
UserRating: d.UserRating,
}
dir := &responses.ArtistWithAlbumsID3{}
dir.Id = d.Id
dir.Name = d.Name
dir.AlbumCount = d.AlbumCount
dir.CoverArt = d.CoverArt
if !d.Starred.IsZero() {
dir.Starred = &d.Starred
}
@ -162,3 +178,26 @@ func (c *BrowsingController) buildArtist(d *engine.DirectoryInfo) *responses.Art
dir.Album = c.ToAlbums(d.Entries)
return dir
}
func (c *BrowsingController) buildAlbum(d *engine.DirectoryInfo) *responses.AlbumWithSongsID3 {
dir := &responses.AlbumWithSongsID3{}
dir.Id = d.Id
dir.Name = d.Name
dir.Artist = d.Artist
dir.ArtistId = d.ArtistId
dir.CoverArt = d.CoverArt
dir.SongCount = d.SongCount
dir.Duration = d.Duration
dir.PlayCount = d.PlayCount
dir.Year = d.Year
dir.Genre = d.Genre
if !d.Created.IsZero() {
dir.Created = &d.Created
}
if !d.Starred.IsZero() {
dir.Starred = &d.Starred
}
dir.Song = c.ToChildren(d.Entries)
return dir
}

View file

@ -27,6 +27,7 @@ type Subsonic struct {
// ID3
Artist *Indexes `xml:"artists,omitempty" json:"artists,omitempty"`
ArtistWithAlbumsID3 *ArtistWithAlbumsID3 `xml:"artist,omitempty" json:"artist,omitempty"`
AlbumWithSongsID3 *AlbumWithSongsID3 `xml:"album,omitempty" json:"album,omitempty"`
}
type JsonWrapper struct {
@ -136,14 +137,37 @@ type Directory struct {
*/
}
type ArtistWithAlbumsID3 struct {
Album []Child `xml:"album" json:"album,omitempty"`
type ArtistID3 struct {
Id string `xml:"id,attr" json:"id"`
Name string `xml:"name,attr" json:"name"`
Starred *time.Time `xml:"starred,attr,omitempty" json:"starred,omitempty"`
PlayCount int32 `xml:"playCount,attr,omitempty" json:"playcount,omitempty"`
UserRating int `xml:"userRating,attr,omitempty" json:"userRating,omitempty"`
CoverArt string `xml:"coverArt,attr,omitempty" json:"coverArt,omitempty"`
AlbumCount int `xml:"albumCount,attr,omitempty" json:"albumCount,omitempty"`
Starred *time.Time `xml:"starred,attr,omitempty" json:"starred,omitempty"`
}
type AlbumID3 struct {
Id string `xml:"id,attr" json:"id"`
Name string `xml:"name,attr" json:"name"`
Artist string `xml:"artist,attr,omitempty" json:"artist,omitempty"`
ArtistId string `xml:"artistId,attr,omitempty" json:"artistId,omitempty"`
CoverArt string `xml:"coverArt,attr,omitempty" json:"coverArt,omitempty"`
SongCount int `xml:"songCount,attr,omitempty" json:"songCount,omitempty"`
Duration int `xml:"duration,attr,omitempty" json:"duration,omitempty"`
PlayCount int32 `xml:"playCount,attr,omitempty" json:"playcount,omitempty"`
Created *time.Time `xml:"created,attr,omitempty" json:"created,omitempty"`
Starred *time.Time `xml:"starred,attr,omitempty" json:"starred,omitempty"`
Year int `xml:"year,attr,omitempty" json:"year,omitempty"`
Genre string `xml:"genre,attr,omitempty" json:"genre,omitempty"`
}
type ArtistWithAlbumsID3 struct {
ArtistID3
Album []Child `xml:"album" json:"album,omitempty"`
}
type AlbumWithSongsID3 struct {
AlbumID3
Song []Child `xml:"song" json:"song,omitempty"`
}
type AlbumList struct {

View file

@ -26,6 +26,7 @@ func mapEndpoints() {
beego.NSRouter("/getSong.view", &api.BrowsingController{}, "*:GetSong"),
beego.NSRouter("/getArtists.view", &api.BrowsingController{}, "*:GetArtists"),
beego.NSRouter("/getArtist.view", &api.BrowsingController{}, "*:GetArtist"),
beego.NSRouter("/getAlbum.view", &api.BrowsingController{}, "*:GetAlbum"),
beego.NSRouter("/search2.view", &api.SearchingController{}, "*:Search2"),

View file

@ -15,6 +15,7 @@ type Browser interface {
Indexes(ifModifiedSince time.Time) (domain.ArtistIndexes, time.Time, error)
Directory(id string) (*DirectoryInfo, error)
Artist(id string) (*DirectoryInfo, error)
Album(id string) (*DirectoryInfo, error)
GetSong(id string) (*Entry, error)
}
@ -63,6 +64,13 @@ type DirectoryInfo struct {
UserRating int
AlbumCount int
CoverArt string
Artist string
ArtistId string
SongCount int
Duration int
Created time.Time
Year int
Genre string
}
func (b *browser) Artist(id string) (*DirectoryInfo, error) {
@ -74,29 +82,25 @@ func (b *browser) Artist(id string) (*DirectoryInfo, error) {
return b.buildArtistDir(a, albums), nil
}
func (b *browser) Album(id string) (*DirectoryInfo, error) {
beego.Debug("Found Album with id", id)
al, tracks, err := b.retrieveAlbum(id)
if err != nil {
return nil, err
}
return b.buildAlbumDir(al, tracks), nil
}
func (b *browser) Directory(id string) (*DirectoryInfo, error) {
var dir *DirectoryInfo
switch {
case b.isArtist(id):
beego.Debug("Found Artist with id", id)
a, albums, err := b.retrieveArtist(id)
if err != nil {
return nil, err
}
dir = b.buildArtistDir(a, albums)
return b.Artist(id)
case b.isAlbum(id):
beego.Debug("Found Album with id", id)
al, tracks, err := b.retrieveAlbum(id)
if err != nil {
return nil, err
}
dir = b.buildAlbumDir(al, tracks)
return b.Album(id)
default:
beego.Debug("Id", id, "not found")
return nil, domain.ErrNotFound
}
return dir, nil
}
func (b *browser) GetSong(id string) (*Entry, error) {
@ -132,6 +136,13 @@ func (b *browser) buildAlbumDir(al *domain.Album, tracks domain.MediaFiles) *Dir
PlayCount: int32(al.PlayCount),
UserRating: al.Rating,
Starred: al.StarredAt,
Artist: al.Artist,
ArtistId: al.ArtistId,
SongCount: al.SongCount,
Duration: al.Duration,
Created: al.CreatedAt,
Year: al.Year,
Genre: al.Genre,
}
dir.Entries = make(Entries, len(tracks))