feat: store and expose individual track artists
a
This commit is contained in:
@@ -91,6 +91,7 @@ func (c *Controller) ServeGetMusicDirectory(r *http.Request) *spec.Response {
|
||||
Where("album_id=?", id.Value).
|
||||
Preload("Album").
|
||||
Preload("Album.Artists").
|
||||
Preload("Artists").
|
||||
Preload("TrackStar", "user_id=?", user.ID).
|
||||
Preload("TrackRating", "user_id=?", user.ID).
|
||||
Order("filename").
|
||||
@@ -255,7 +256,9 @@ func (c *Controller) ServeSearchTwo(r *http.Request) *spec.Response {
|
||||
for _, s := range queries {
|
||||
q = q.Where(`filename LIKE ? OR filename LIKE ?`, s, s)
|
||||
}
|
||||
q = q.Preload("TrackStar", "user_id=?", user.ID).
|
||||
q = q.
|
||||
Preload("Artists").
|
||||
Preload("TrackStar", "user_id=?", user.ID).
|
||||
Preload("TrackRating", "user_id=?", user.ID).
|
||||
Offset(params.GetOrInt("songOffset", 0)).
|
||||
Limit(params.GetOrInt("songCount", 20))
|
||||
@@ -338,6 +341,7 @@ func (c *Controller) ServeGetStarred(r *http.Request) *spec.Response {
|
||||
Preload("Album").
|
||||
Joins("JOIN track_stars ON tracks.id=track_stars.track_id").
|
||||
Where("track_stars.user_id=?", user.ID).
|
||||
Preload("Artists").
|
||||
Preload("TrackStar", "user_id=?", user.ID).
|
||||
Preload("TrackRating", "user_id=?", user.ID)
|
||||
if m := getMusicFolder(c.musicPaths, params); m != "" {
|
||||
|
||||
@@ -108,6 +108,7 @@ func (c *Controller) ServeGetAlbum(r *http.Request) *spec.Response {
|
||||
Preload("Tracks", func(db *gorm.DB) *gorm.DB {
|
||||
return db.
|
||||
Order("tracks.tag_disc_number, tracks.tag_track_number").
|
||||
Preload("Artists").
|
||||
Preload("TrackStar", "user_id=?", user.ID).
|
||||
Preload("TrackRating", "user_id=?", user.ID)
|
||||
}).
|
||||
@@ -272,6 +273,7 @@ func (c *Controller) ServeSearchThree(r *http.Request) *spec.Response {
|
||||
Preload("Album").
|
||||
Preload("Album.Artists").
|
||||
Preload("Genres").
|
||||
Preload("Artists").
|
||||
Preload("TrackStar", "user_id=?", user.ID).
|
||||
Preload("TrackRating", "user_id=?", user.ID)
|
||||
for _, s := range queries {
|
||||
@@ -409,6 +411,7 @@ func (c *Controller) ServeGetSongsByGenre(r *http.Request) *spec.Response {
|
||||
Joins("JOIN genres ON track_genres.genre_id=genres.id AND genres.name=?", genre).
|
||||
Preload("Album").
|
||||
Preload("Album.Artists").
|
||||
Preload("Artists").
|
||||
Preload("TrackStar", "user_id=?", user.ID).
|
||||
Preload("TrackRating", "user_id=?", user.ID).
|
||||
Offset(params.GetOrInt("offset", 0)).
|
||||
@@ -490,6 +493,7 @@ func (c *Controller) ServeGetStarredTwo(r *http.Request) *spec.Response {
|
||||
Order("track_stars.star_date DESC").
|
||||
Preload("Album").
|
||||
Preload("Album.Artists").
|
||||
Preload("Artists").
|
||||
Preload("TrackStar", "user_id=?", user.ID).
|
||||
Preload("TrackRating", "user_id=?", user.ID)
|
||||
if m := getMusicFolder(c.musicPaths, params); m != "" {
|
||||
@@ -562,6 +566,7 @@ func (c *Controller) ServeGetTopSongs(r *http.Request) *spec.Response {
|
||||
Joins("JOIN album_artists ON album_artists.album_id=albums.id").
|
||||
Where("album_artists.artist_id=? AND tracks.tag_title IN (?)", artist.ID, topTrackNames).
|
||||
Limit(count).
|
||||
Preload("Artists").
|
||||
Preload("TrackStar", "user_id=?", user.ID).
|
||||
Preload("TrackRating", "user_id=?", user.ID).
|
||||
Group("tracks.id").
|
||||
@@ -622,6 +627,7 @@ func (c *Controller) ServeGetSimilarSongs(r *http.Request) *spec.Response {
|
||||
err = c.dbc.
|
||||
Select("tracks.*").
|
||||
Preload("Album").
|
||||
Preload("Artists").
|
||||
Preload("TrackStar", "user_id=?", user.ID).
|
||||
Preload("TrackRating", "user_id=?", user.ID).
|
||||
Where("tracks.tag_title IN (?)", similarTrackNames).
|
||||
@@ -685,6 +691,7 @@ func (c *Controller) ServeGetSimilarSongsTwo(r *http.Request) *spec.Response {
|
||||
var tracks []*db.Track
|
||||
err = c.dbc.
|
||||
Preload("Album").
|
||||
Preload("Artists").
|
||||
Preload("TrackStar", "user_id=?", user.ID).
|
||||
Preload("TrackRating", "user_id=?", user.ID).
|
||||
Joins("JOIN album_artists ON album_artists.album_id=tracks.album_id").
|
||||
|
||||
@@ -212,6 +212,7 @@ func (c *Controller) ServeGetPlayQueue(r *http.Request) *spec.Response {
|
||||
c.dbc.
|
||||
Where("id=?", id.Value).
|
||||
Preload("Album").
|
||||
Preload("Artists").
|
||||
Preload("TrackStar", "user_id=?", user.ID).
|
||||
Preload("TrackRating", "user_id=?", user.ID).
|
||||
Find(&track)
|
||||
@@ -268,6 +269,7 @@ func (c *Controller) ServeGetSong(r *http.Request) *spec.Response {
|
||||
Where("id=?", id.Value).
|
||||
Preload("Album").
|
||||
Preload("Album.Artists").
|
||||
Preload("Artists").
|
||||
Preload("TrackStar", "user_id=?", user.ID).
|
||||
Preload("TrackRating", "user_id=?", user.ID).
|
||||
First(&track).
|
||||
@@ -294,6 +296,7 @@ func (c *Controller) ServeGetRandomSongs(r *http.Request) *spec.Response {
|
||||
Limit(params.GetOrInt("size", 10)).
|
||||
Preload("Album").
|
||||
Preload("Album.Artists").
|
||||
Preload("Artists").
|
||||
Preload("TrackStar", "user_id=?", user.ID).
|
||||
Preload("TrackRating", "user_id=?", user.ID).
|
||||
Joins("JOIN albums ON tracks.album_id=albums.id").
|
||||
|
||||
@@ -218,7 +218,7 @@ func playlistRender(c *Controller, params params.Params, playlistID string, play
|
||||
switch id := file.SID(); id.Type {
|
||||
case specid.Track:
|
||||
var track db.Track
|
||||
if err := c.dbc.Where("id=?", id.Value).Preload("Album").Preload("Album.Artists").Preload("TrackStar", "user_id=?", user.ID).Preload("TrackRating", "user_id=?", user.ID).Find(&track).Error; errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
if err := c.dbc.Where("id=?", id.Value).Preload("Album").Preload("Album.Artists").Preload("Artists").Preload("TrackStar", "user_id=?", user.ID).Preload("TrackRating", "user_id=?", user.ID).Find(&track).Error; errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
return nil, fmt.Errorf("load track by id: %w", err)
|
||||
}
|
||||
trch = spec.NewTCTrackByFolder(&track, track.Album)
|
||||
|
||||
@@ -96,6 +96,9 @@ func NewTCTrackByFolder(t *db.Track, parent *db.Album) *TrackChild {
|
||||
for _, g := range t.Genres {
|
||||
trCh.Genres = append(trCh.Genres, &GenreRef{Name: g.Name})
|
||||
}
|
||||
for _, a := range t.Artists {
|
||||
trCh.Artists = append(trCh.Artists, &ArtistRef{ID: a.SID(), Name: a.Name})
|
||||
}
|
||||
return trCh
|
||||
}
|
||||
|
||||
|
||||
@@ -94,6 +94,9 @@ func NewTrackByTags(t *db.Track, album *db.Album) *TrackChild {
|
||||
for _, g := range t.Genres {
|
||||
ret.Genres = append(ret.Genres, &GenreRef{Name: g.Name})
|
||||
}
|
||||
for _, a := range t.Artists {
|
||||
ret.Artists = append(ret.Artists, &ArtistRef{ID: a.SID(), Name: a.Name})
|
||||
}
|
||||
return ret
|
||||
}
|
||||
|
||||
|
||||
@@ -160,29 +160,30 @@ type TranscodeMeta struct {
|
||||
}
|
||||
|
||||
type TrackChild struct {
|
||||
ID *specid.ID `xml:"id,attr,omitempty" json:"id,omitempty"`
|
||||
Album string `xml:"album,attr,omitempty" json:"album,omitempty"`
|
||||
AlbumID *specid.ID `xml:"albumId,attr,omitempty" json:"albumId,omitempty"`
|
||||
Artist string `xml:"artist,attr,omitempty" json:"artist,omitempty"`
|
||||
ArtistID *specid.ID `xml:"artistId,attr,omitempty" json:"artistId,omitempty"`
|
||||
Bitrate int `xml:"bitRate,attr,omitempty" json:"bitRate,omitempty"`
|
||||
ContentType string `xml:"contentType,attr,omitempty" json:"contentType,omitempty"`
|
||||
CoverID *specid.ID `xml:"coverArt,attr,omitempty" json:"coverArt,omitempty"`
|
||||
CreatedAt time.Time `xml:"created,attr,omitempty" json:"created,omitempty"`
|
||||
Duration int `xml:"duration,attr,omitempty" json:"duration,omitempty"`
|
||||
Genre string `xml:"genre,attr,omitempty" json:"genre,omitempty"`
|
||||
Genres []*GenreRef `xml:"genres,omitempty" json:"genres,omitempty"`
|
||||
IsDir bool `xml:"isDir,attr" json:"isDir"`
|
||||
IsVideo bool `xml:"isVideo,attr" json:"isVideo"`
|
||||
ParentID *specid.ID `xml:"parent,attr,omitempty" json:"parent,omitempty"`
|
||||
Path string `xml:"path,attr,omitempty" json:"path,omitempty"`
|
||||
Size int `xml:"size,attr,omitempty" json:"size,omitempty"`
|
||||
Suffix string `xml:"suffix,attr,omitempty" json:"suffix,omitempty"`
|
||||
Title string `xml:"title,attr" json:"title"`
|
||||
TrackNumber int `xml:"track,attr,omitempty" json:"track,omitempty"`
|
||||
DiscNumber int `xml:"discNumber,attr,omitempty" json:"discNumber,omitempty"`
|
||||
Type string `xml:"type,attr,omitempty" json:"type,omitempty"`
|
||||
Year int `xml:"year,attr,omitempty" json:"year,omitempty"`
|
||||
ID *specid.ID `xml:"id,attr,omitempty" json:"id,omitempty"`
|
||||
Album string `xml:"album,attr,omitempty" json:"album,omitempty"`
|
||||
AlbumID *specid.ID `xml:"albumId,attr,omitempty" json:"albumId,omitempty"`
|
||||
Artist string `xml:"artist,attr,omitempty" json:"artist,omitempty"`
|
||||
ArtistID *specid.ID `xml:"artistId,attr,omitempty" json:"artistId,omitempty"`
|
||||
Artists []*ArtistRef `xml:"artists,omitempty" json:"artists,omitempty"`
|
||||
Bitrate int `xml:"bitRate,attr,omitempty" json:"bitRate,omitempty"`
|
||||
ContentType string `xml:"contentType,attr,omitempty" json:"contentType,omitempty"`
|
||||
CoverID *specid.ID `xml:"coverArt,attr,omitempty" json:"coverArt,omitempty"`
|
||||
CreatedAt time.Time `xml:"created,attr,omitempty" json:"created,omitempty"`
|
||||
Duration int `xml:"duration,attr,omitempty" json:"duration,omitempty"`
|
||||
Genre string `xml:"genre,attr,omitempty" json:"genre,omitempty"`
|
||||
Genres []*GenreRef `xml:"genres,omitempty" json:"genres,omitempty"`
|
||||
IsDir bool `xml:"isDir,attr" json:"isDir"`
|
||||
IsVideo bool `xml:"isVideo,attr" json:"isVideo"`
|
||||
ParentID *specid.ID `xml:"parent,attr,omitempty" json:"parent,omitempty"`
|
||||
Path string `xml:"path,attr,omitempty" json:"path,omitempty"`
|
||||
Size int `xml:"size,attr,omitempty" json:"size,omitempty"`
|
||||
Suffix string `xml:"suffix,attr,omitempty" json:"suffix,omitempty"`
|
||||
Title string `xml:"title,attr" json:"title"`
|
||||
TrackNumber int `xml:"track,attr,omitempty" json:"track,omitempty"`
|
||||
DiscNumber int `xml:"discNumber,attr,omitempty" json:"discNumber,omitempty"`
|
||||
Type string `xml:"type,attr,omitempty" json:"type,omitempty"`
|
||||
Year int `xml:"year,attr,omitempty" json:"year,omitempty"`
|
||||
// star / rating
|
||||
Starred *time.Time `xml:"starred,attr,omitempty" json:"starred,omitempty"`
|
||||
UserRating int `xml:"userRating,attr,omitempty" json:"userRating,omitempty"`
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
"albumId": "al-3",
|
||||
"artist": "artist-0",
|
||||
"artistId": "ar-1",
|
||||
"artists": [{ "id": "ar-1", "name": "artist-0" }],
|
||||
"bitRate": 100,
|
||||
"contentType": "audio/flac",
|
||||
"coverArt": "al-3",
|
||||
@@ -49,6 +50,7 @@
|
||||
"albumId": "al-3",
|
||||
"artist": "artist-0",
|
||||
"artistId": "ar-1",
|
||||
"artists": [{ "id": "ar-1", "name": "artist-0" }],
|
||||
"bitRate": 100,
|
||||
"contentType": "audio/flac",
|
||||
"coverArt": "al-3",
|
||||
@@ -71,6 +73,7 @@
|
||||
"albumId": "al-3",
|
||||
"artist": "artist-0",
|
||||
"artistId": "ar-1",
|
||||
"artists": [{ "id": "ar-1", "name": "artist-0" }],
|
||||
"bitRate": 100,
|
||||
"contentType": "audio/flac",
|
||||
"coverArt": "al-3",
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
"id": "tr-1",
|
||||
"album": "album-0",
|
||||
"artist": "artist-0",
|
||||
"artists": [{ "id": "ar-1", "name": "artist-0" }],
|
||||
"bitRate": 100,
|
||||
"contentType": "audio/flac",
|
||||
"coverArt": "al-3",
|
||||
@@ -34,6 +35,7 @@
|
||||
"id": "tr-2",
|
||||
"album": "album-0",
|
||||
"artist": "artist-0",
|
||||
"artists": [{ "id": "ar-1", "name": "artist-0" }],
|
||||
"bitRate": 100,
|
||||
"contentType": "audio/flac",
|
||||
"coverArt": "al-3",
|
||||
@@ -54,6 +56,7 @@
|
||||
"id": "tr-3",
|
||||
"album": "album-0",
|
||||
"artist": "artist-0",
|
||||
"artists": [{ "id": "ar-1", "name": "artist-0" }],
|
||||
"bitRate": 100,
|
||||
"contentType": "audio/flac",
|
||||
"coverArt": "al-3",
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
"albumId": "al-3",
|
||||
"artist": "artist-0",
|
||||
"artistId": "ar-1",
|
||||
"artists": [{ "id": "ar-1", "name": "artist-0" }],
|
||||
"bitRate": 100,
|
||||
"contentType": "audio/flac",
|
||||
"coverArt": "al-3",
|
||||
@@ -37,6 +38,7 @@
|
||||
"albumId": "al-3",
|
||||
"artist": "artist-0",
|
||||
"artistId": "ar-1",
|
||||
"artists": [{ "id": "ar-1", "name": "artist-0" }],
|
||||
"bitRate": 100,
|
||||
"contentType": "audio/flac",
|
||||
"coverArt": "al-3",
|
||||
@@ -61,6 +63,7 @@
|
||||
"albumId": "al-3",
|
||||
"artist": "artist-0",
|
||||
"artistId": "ar-1",
|
||||
"artists": [{ "id": "ar-1", "name": "artist-0" }],
|
||||
"bitRate": 100,
|
||||
"contentType": "audio/flac",
|
||||
"coverArt": "al-3",
|
||||
@@ -85,6 +88,7 @@
|
||||
"albumId": "al-4",
|
||||
"artist": "artist-0",
|
||||
"artistId": "ar-1",
|
||||
"artists": [{ "id": "ar-1", "name": "artist-0" }],
|
||||
"bitRate": 100,
|
||||
"contentType": "audio/flac",
|
||||
"coverArt": "al-4",
|
||||
@@ -109,6 +113,7 @@
|
||||
"albumId": "al-4",
|
||||
"artist": "artist-0",
|
||||
"artistId": "ar-1",
|
||||
"artists": [{ "id": "ar-1", "name": "artist-0" }],
|
||||
"bitRate": 100,
|
||||
"contentType": "audio/flac",
|
||||
"coverArt": "al-4",
|
||||
@@ -133,6 +138,7 @@
|
||||
"albumId": "al-4",
|
||||
"artist": "artist-0",
|
||||
"artistId": "ar-1",
|
||||
"artists": [{ "id": "ar-1", "name": "artist-0" }],
|
||||
"bitRate": 100,
|
||||
"contentType": "audio/flac",
|
||||
"coverArt": "al-4",
|
||||
@@ -157,6 +163,7 @@
|
||||
"albumId": "al-5",
|
||||
"artist": "artist-0",
|
||||
"artistId": "ar-1",
|
||||
"artists": [{ "id": "ar-1", "name": "artist-0" }],
|
||||
"bitRate": 100,
|
||||
"contentType": "audio/flac",
|
||||
"coverArt": "al-5",
|
||||
@@ -181,6 +188,7 @@
|
||||
"albumId": "al-5",
|
||||
"artist": "artist-0",
|
||||
"artistId": "ar-1",
|
||||
"artists": [{ "id": "ar-1", "name": "artist-0" }],
|
||||
"bitRate": 100,
|
||||
"contentType": "audio/flac",
|
||||
"coverArt": "al-5",
|
||||
@@ -205,6 +213,7 @@
|
||||
"albumId": "al-5",
|
||||
"artist": "artist-0",
|
||||
"artistId": "ar-1",
|
||||
"artists": [{ "id": "ar-1", "name": "artist-0" }],
|
||||
"bitRate": 100,
|
||||
"contentType": "audio/flac",
|
||||
"coverArt": "al-5",
|
||||
@@ -229,6 +238,7 @@
|
||||
"albumId": "al-7",
|
||||
"artist": "artist-1",
|
||||
"artistId": "ar-2",
|
||||
"artists": [{ "id": "ar-2", "name": "artist-1" }],
|
||||
"bitRate": 100,
|
||||
"contentType": "audio/flac",
|
||||
"coverArt": "al-7",
|
||||
@@ -253,6 +263,7 @@
|
||||
"albumId": "al-7",
|
||||
"artist": "artist-1",
|
||||
"artistId": "ar-2",
|
||||
"artists": [{ "id": "ar-2", "name": "artist-1" }],
|
||||
"bitRate": 100,
|
||||
"contentType": "audio/flac",
|
||||
"coverArt": "al-7",
|
||||
@@ -277,6 +288,7 @@
|
||||
"albumId": "al-7",
|
||||
"artist": "artist-1",
|
||||
"artistId": "ar-2",
|
||||
"artists": [{ "id": "ar-2", "name": "artist-1" }],
|
||||
"bitRate": 100,
|
||||
"contentType": "audio/flac",
|
||||
"coverArt": "al-7",
|
||||
@@ -301,6 +313,7 @@
|
||||
"albumId": "al-8",
|
||||
"artist": "artist-1",
|
||||
"artistId": "ar-2",
|
||||
"artists": [{ "id": "ar-2", "name": "artist-1" }],
|
||||
"bitRate": 100,
|
||||
"contentType": "audio/flac",
|
||||
"coverArt": "al-8",
|
||||
@@ -325,6 +338,7 @@
|
||||
"albumId": "al-8",
|
||||
"artist": "artist-1",
|
||||
"artistId": "ar-2",
|
||||
"artists": [{ "id": "ar-2", "name": "artist-1" }],
|
||||
"bitRate": 100,
|
||||
"contentType": "audio/flac",
|
||||
"coverArt": "al-8",
|
||||
@@ -349,6 +363,7 @@
|
||||
"albumId": "al-8",
|
||||
"artist": "artist-1",
|
||||
"artistId": "ar-2",
|
||||
"artists": [{ "id": "ar-2", "name": "artist-1" }],
|
||||
"bitRate": 100,
|
||||
"contentType": "audio/flac",
|
||||
"coverArt": "al-8",
|
||||
@@ -373,6 +388,7 @@
|
||||
"albumId": "al-9",
|
||||
"artist": "artist-1",
|
||||
"artistId": "ar-2",
|
||||
"artists": [{ "id": "ar-2", "name": "artist-1" }],
|
||||
"bitRate": 100,
|
||||
"contentType": "audio/flac",
|
||||
"coverArt": "al-9",
|
||||
@@ -397,6 +413,7 @@
|
||||
"albumId": "al-9",
|
||||
"artist": "artist-1",
|
||||
"artistId": "ar-2",
|
||||
"artists": [{ "id": "ar-2", "name": "artist-1" }],
|
||||
"bitRate": 100,
|
||||
"contentType": "audio/flac",
|
||||
"coverArt": "al-9",
|
||||
@@ -421,6 +438,7 @@
|
||||
"albumId": "al-9",
|
||||
"artist": "artist-1",
|
||||
"artistId": "ar-2",
|
||||
"artists": [{ "id": "ar-2", "name": "artist-1" }],
|
||||
"bitRate": 100,
|
||||
"contentType": "audio/flac",
|
||||
"coverArt": "al-9",
|
||||
@@ -445,6 +463,7 @@
|
||||
"albumId": "al-11",
|
||||
"artist": "artist-2",
|
||||
"artistId": "ar-3",
|
||||
"artists": [{ "id": "ar-3", "name": "artist-2" }],
|
||||
"bitRate": 100,
|
||||
"contentType": "audio/flac",
|
||||
"coverArt": "al-11",
|
||||
@@ -469,6 +488,7 @@
|
||||
"albumId": "al-11",
|
||||
"artist": "artist-2",
|
||||
"artistId": "ar-3",
|
||||
"artists": [{ "id": "ar-3", "name": "artist-2" }],
|
||||
"bitRate": 100,
|
||||
"contentType": "audio/flac",
|
||||
"coverArt": "al-11",
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
"id": "tr-1",
|
||||
"album": "album-0",
|
||||
"artist": "artist-0",
|
||||
"artists": [{ "id": "ar-1", "name": "artist-0" }],
|
||||
"bitRate": 100,
|
||||
"contentType": "audio/flac",
|
||||
"coverArt": "al-3",
|
||||
@@ -31,6 +32,7 @@
|
||||
"id": "tr-2",
|
||||
"album": "album-0",
|
||||
"artist": "artist-0",
|
||||
"artists": [{ "id": "ar-1", "name": "artist-0" }],
|
||||
"bitRate": 100,
|
||||
"contentType": "audio/flac",
|
||||
"coverArt": "al-3",
|
||||
@@ -51,6 +53,7 @@
|
||||
"id": "tr-3",
|
||||
"album": "album-0",
|
||||
"artist": "artist-0",
|
||||
"artists": [{ "id": "ar-1", "name": "artist-0" }],
|
||||
"bitRate": 100,
|
||||
"contentType": "audio/flac",
|
||||
"coverArt": "al-3",
|
||||
@@ -71,6 +74,7 @@
|
||||
"id": "tr-4",
|
||||
"album": "album-1",
|
||||
"artist": "artist-0",
|
||||
"artists": [{ "id": "ar-1", "name": "artist-0" }],
|
||||
"bitRate": 100,
|
||||
"contentType": "audio/flac",
|
||||
"coverArt": "al-4",
|
||||
@@ -91,6 +95,7 @@
|
||||
"id": "tr-5",
|
||||
"album": "album-1",
|
||||
"artist": "artist-0",
|
||||
"artists": [{ "id": "ar-1", "name": "artist-0" }],
|
||||
"bitRate": 100,
|
||||
"contentType": "audio/flac",
|
||||
"coverArt": "al-4",
|
||||
@@ -111,6 +116,7 @@
|
||||
"id": "tr-6",
|
||||
"album": "album-1",
|
||||
"artist": "artist-0",
|
||||
"artists": [{ "id": "ar-1", "name": "artist-0" }],
|
||||
"bitRate": 100,
|
||||
"contentType": "audio/flac",
|
||||
"coverArt": "al-4",
|
||||
@@ -131,6 +137,7 @@
|
||||
"id": "tr-7",
|
||||
"album": "album-2",
|
||||
"artist": "artist-0",
|
||||
"artists": [{ "id": "ar-1", "name": "artist-0" }],
|
||||
"bitRate": 100,
|
||||
"contentType": "audio/flac",
|
||||
"coverArt": "al-5",
|
||||
@@ -151,6 +158,7 @@
|
||||
"id": "tr-8",
|
||||
"album": "album-2",
|
||||
"artist": "artist-0",
|
||||
"artists": [{ "id": "ar-1", "name": "artist-0" }],
|
||||
"bitRate": 100,
|
||||
"contentType": "audio/flac",
|
||||
"coverArt": "al-5",
|
||||
@@ -171,6 +179,7 @@
|
||||
"id": "tr-9",
|
||||
"album": "album-2",
|
||||
"artist": "artist-0",
|
||||
"artists": [{ "id": "ar-1", "name": "artist-0" }],
|
||||
"bitRate": 100,
|
||||
"contentType": "audio/flac",
|
||||
"coverArt": "al-5",
|
||||
@@ -191,6 +200,7 @@
|
||||
"id": "tr-10",
|
||||
"album": "album-0",
|
||||
"artist": "artist-1",
|
||||
"artists": [{ "id": "ar-2", "name": "artist-1" }],
|
||||
"bitRate": 100,
|
||||
"contentType": "audio/flac",
|
||||
"coverArt": "al-7",
|
||||
@@ -211,6 +221,7 @@
|
||||
"id": "tr-11",
|
||||
"album": "album-0",
|
||||
"artist": "artist-1",
|
||||
"artists": [{ "id": "ar-2", "name": "artist-1" }],
|
||||
"bitRate": 100,
|
||||
"contentType": "audio/flac",
|
||||
"coverArt": "al-7",
|
||||
@@ -231,6 +242,7 @@
|
||||
"id": "tr-12",
|
||||
"album": "album-0",
|
||||
"artist": "artist-1",
|
||||
"artists": [{ "id": "ar-2", "name": "artist-1" }],
|
||||
"bitRate": 100,
|
||||
"contentType": "audio/flac",
|
||||
"coverArt": "al-7",
|
||||
@@ -251,6 +263,7 @@
|
||||
"id": "tr-13",
|
||||
"album": "album-1",
|
||||
"artist": "artist-1",
|
||||
"artists": [{ "id": "ar-2", "name": "artist-1" }],
|
||||
"bitRate": 100,
|
||||
"contentType": "audio/flac",
|
||||
"coverArt": "al-8",
|
||||
@@ -271,6 +284,7 @@
|
||||
"id": "tr-14",
|
||||
"album": "album-1",
|
||||
"artist": "artist-1",
|
||||
"artists": [{ "id": "ar-2", "name": "artist-1" }],
|
||||
"bitRate": 100,
|
||||
"contentType": "audio/flac",
|
||||
"coverArt": "al-8",
|
||||
@@ -291,6 +305,7 @@
|
||||
"id": "tr-15",
|
||||
"album": "album-1",
|
||||
"artist": "artist-1",
|
||||
"artists": [{ "id": "ar-2", "name": "artist-1" }],
|
||||
"bitRate": 100,
|
||||
"contentType": "audio/flac",
|
||||
"coverArt": "al-8",
|
||||
@@ -311,6 +326,7 @@
|
||||
"id": "tr-16",
|
||||
"album": "album-2",
|
||||
"artist": "artist-1",
|
||||
"artists": [{ "id": "ar-2", "name": "artist-1" }],
|
||||
"bitRate": 100,
|
||||
"contentType": "audio/flac",
|
||||
"coverArt": "al-9",
|
||||
@@ -331,6 +347,7 @@
|
||||
"id": "tr-17",
|
||||
"album": "album-2",
|
||||
"artist": "artist-1",
|
||||
"artists": [{ "id": "ar-2", "name": "artist-1" }],
|
||||
"bitRate": 100,
|
||||
"contentType": "audio/flac",
|
||||
"coverArt": "al-9",
|
||||
@@ -351,6 +368,7 @@
|
||||
"id": "tr-18",
|
||||
"album": "album-2",
|
||||
"artist": "artist-1",
|
||||
"artists": [{ "id": "ar-2", "name": "artist-1" }],
|
||||
"bitRate": 100,
|
||||
"contentType": "audio/flac",
|
||||
"coverArt": "al-9",
|
||||
@@ -371,6 +389,7 @@
|
||||
"id": "tr-19",
|
||||
"album": "album-0",
|
||||
"artist": "artist-2",
|
||||
"artists": [{ "id": "ar-3", "name": "artist-2" }],
|
||||
"bitRate": 100,
|
||||
"contentType": "audio/flac",
|
||||
"coverArt": "al-11",
|
||||
@@ -391,6 +410,7 @@
|
||||
"id": "tr-20",
|
||||
"album": "album-0",
|
||||
"artist": "artist-2",
|
||||
"artists": [{ "id": "ar-3", "name": "artist-2" }],
|
||||
"bitRate": 100,
|
||||
"contentType": "audio/flac",
|
||||
"coverArt": "al-11",
|
||||
|
||||
Reference in New Issue
Block a user