Bookmark API work

This commit is contained in:
Steven Hildreth 2018-12-11 17:09:52 -06:00
parent f02e28ad58
commit 884811674e
14 changed files with 250 additions and 100 deletions

View file

@ -123,6 +123,19 @@ namespace Roadie.Api.Controllers
return Ok(result); return Ok(result);
} }
[HttpPost("setArtistBookmark/{artistId}/{isBookmarked}")]
[ProducesResponseType(200)]
public async Task<IActionResult> SetArtistBookmark(Guid artistId, bool isBookmarked)
{
var result = await this.UserService.SetArtistBookmark(artistId, await this.CurrentUserModel(), isBookmarked);
if (!result.IsSuccess)
{
return StatusCode((int)HttpStatusCode.InternalServerError);
}
this.CacheManager.ClearRegion(EntityControllerBase.ControllerCacheRegionUrn);
return Ok(result);
}
[HttpGet] [HttpGet]
[ProducesResponseType(200)] [ProducesResponseType(200)]

View file

@ -330,22 +330,9 @@ namespace Roadie.Api.Services
join r in this.DbContext.Releases on rl.ReleaseId equals r.Id join r in this.DbContext.Releases on rl.ReleaseId equals r.Id
where r.ArtistId == artist.Id where r.ArtistId == artist.Id
orderby l.SortName orderby l.SortName
select new LabelList select LabelList.FromDataLabel(l, this.MakeLabelThumbnailImage(l.RoadieId)))
{ .ToArray()
Id = rl.RoadieId, .GroupBy(x => x.Label.Value).Select(x => x.First()).OrderBy(x => x.SortName).ThenBy(x => x.Label.Text).ToArray();
Label = new DataToken
{
Text = l.Name,
Value = l.RoadieId.ToString()
},
SortName = l.SortName,
CreatedDate = l.CreatedDate,
LastUpdated = l.LastUpdated,
ArtistCount = l.ArtistCount,
ReleaseCount = l.ReleaseCount,
TrackCount = l.TrackCount,
Thumbnail = MakeLabelThumbnailImage(l.RoadieId)
}).ToArray().GroupBy(x => x.Label.Value).Select(x => x.First()).OrderBy(x => x.SortName).ThenBy(x => x.Label.Text).ToArray();
result.ArtistLabels = result.ArtistLabels.Any() ? result.ArtistLabels : null; result.ArtistLabels = result.ArtistLabels.Any() ? result.ArtistLabels : null;
tsw.Stop(); tsw.Stop();
timings.Add("labels", tsw.ElapsedMilliseconds); timings.Add("labels", tsw.ElapsedMilliseconds);

View file

@ -1,4 +1,5 @@
using Microsoft.Extensions.Logging; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using Roadie.Library.Caching; using Roadie.Library.Caching;
using Roadie.Library.Configuration; using Roadie.Library.Configuration;
using Roadie.Library.Encoding; using Roadie.Library.Encoding;
@ -14,6 +15,7 @@ using System.Linq;
using System.Linq.Dynamic.Core; using System.Linq.Dynamic.Core;
using System.Threading.Tasks; using System.Threading.Tasks;
using data = Roadie.Library.Data; using data = Roadie.Library.Data;
using models = Roadie.Library.Models;
namespace Roadie.Api.Services namespace Roadie.Api.Services
{ {
@ -70,39 +72,59 @@ namespace Roadie.Api.Services
Text = artist.Name, Text = artist.Name,
Value = artist.RoadieId.ToString() Value = artist.RoadieId.ToString()
}; };
row.Artist = models.ArtistList.FromDataArtist(artist, this.MakeArtistThumbnailImage(artist.RoadieId));
row.Thumbnail = this.MakeArtistThumbnailImage(artist.RoadieId); row.Thumbnail = this.MakeArtistThumbnailImage(artist.RoadieId);
row.SortName = artist.SortName ?? artist.Name; row.SortName = artist.SortName ?? artist.Name;
break; break;
case BookmarkType.Release: case BookmarkType.Release:
var release = this.DbContext.Releases.FirstOrDefault(x => x.Id == row.BookmarkTargetId); var release = this.DbContext.Releases.Include(x => x.Artist).FirstOrDefault(x => x.Id == row.BookmarkTargetId);
row.Bookmark = new DataToken row.Bookmark = new DataToken
{ {
Text = release.Title, Text = release.Title,
Value = release.RoadieId.ToString() Value = release.RoadieId.ToString()
}; };
row.Release = models.Releases.ReleaseList.FromDataRelease(release, release.Artist, this.HttpContext.BaseUrl, this.MakeArtistThumbnailImage(release.Artist.RoadieId), this.MakeReleaseThumbnailImage(release.RoadieId));
row.Thumbnail = this.MakeReleaseThumbnailImage(release.RoadieId); row.Thumbnail = this.MakeReleaseThumbnailImage(release.RoadieId);
row.SortName = release.Title; row.SortName = release.Title;
break; break;
case BookmarkType.Track: case BookmarkType.Track:
var track = this.DbContext.Tracks.FirstOrDefault(x => x.Id == row.BookmarkTargetId); var track = this.DbContext.Tracks
.Include(x => x.ReleaseMedia)
.Include(x => x.ReleaseMedia.Release)
.Include(x => x.ReleaseMedia.Release.Artist)
.Include(x => x.TrackArtist)
.FirstOrDefault(x => x.Id == row.BookmarkTargetId);
row.Bookmark = new DataToken row.Bookmark = new DataToken
{ {
Text = track.Title, Text = track.Title,
Value = track.RoadieId.ToString() Value = track.RoadieId.ToString()
}; };
row.Track = TrackList.FromDataTrack(track,
track.ReleaseMedia.MediaNumber,
track.ReleaseMedia.Release,
track.ReleaseMedia.Release.Artist,
track.TrackArtist,
this.HttpContext.BaseUrl,
this.MakeTrackThumbnailImage(track.RoadieId),
this.MakeReleaseThumbnailImage(track.ReleaseMedia.Release.RoadieId),
this.MakeArtistThumbnailImage(track.ReleaseMedia.Release.Artist.RoadieId),
this.MakeArtistThumbnailImage(track.TrackArtist == null ? null : (Guid?)track.TrackArtist.RoadieId));
row.Thumbnail = this.MakeTrackThumbnailImage(track.RoadieId); row.Thumbnail = this.MakeTrackThumbnailImage(track.RoadieId);
row.SortName = track.Title; row.SortName = track.Title;
break; break;
case BookmarkType.Playlist: case BookmarkType.Playlist:
var playlist = this.DbContext.Playlists.FirstOrDefault(x => x.Id == row.BookmarkTargetId); var playlist = this.DbContext.Playlists
.Include(x => x.User)
.FirstOrDefault(x => x.Id == row.BookmarkTargetId);
row.Bookmark = new DataToken row.Bookmark = new DataToken
{ {
Text = playlist.Name, Text = playlist.Name,
Value = playlist.RoadieId.ToString() Value = playlist.RoadieId.ToString()
}; };
row.Playlist = models.Playlists.PlaylistList.FromDataPlaylist(playlist, playlist.User, this.MakePlaylistThumbnailImage(playlist.RoadieId), this.MakeUserThumbnailImage(playlist.User.RoadieId));
row.Thumbnail = this.MakePlaylistThumbnailImage(playlist.RoadieId); row.Thumbnail = this.MakePlaylistThumbnailImage(playlist.RoadieId);
row.SortName = playlist.Name; row.SortName = playlist.Name;
break; break;
@ -114,6 +136,9 @@ namespace Roadie.Api.Services
Text = collection.Name, Text = collection.Name,
Value = collection.RoadieId.ToString() Value = collection.RoadieId.ToString()
}; };
row.Collection = models.Collections.CollectionList.FromDataCollection(collection, (from crc in this.DbContext.CollectionReleases
where crc.CollectionId == collection.Id
select crc.Id).Count(), this.MakeCollectionThumbnailImage(collection.RoadieId));
row.Thumbnail = this.MakeCollectionThumbnailImage(collection.RoadieId); row.Thumbnail = this.MakeCollectionThumbnailImage(collection.RoadieId);
row.SortName = collection.SortName ?? collection.Name; row.SortName = collection.SortName ?? collection.Name;
break; break;
@ -125,6 +150,7 @@ namespace Roadie.Api.Services
Text = label.Name, Text = label.Name,
Value = label.RoadieId.ToString() Value = label.RoadieId.ToString()
}; };
row.Label = models.LabelList.FromDataLabel(label, this.MakeLabelThumbnailImage(label.RoadieId));
row.Thumbnail = this.MakeLabelThumbnailImage(label.RoadieId); row.Thumbnail = this.MakeLabelThumbnailImage(label.RoadieId);
row.SortName = label.SortName ?? label.Name; row.SortName = label.SortName ?? label.Name;
break; break;

View file

@ -186,24 +186,9 @@ namespace Roadie.Api.Services
} }
var result = (from c in collections var result = (from c in collections
where (request.FilterValue.Length == 0 || (request.FilterValue.Length > 0 && c.Name.Contains(request.Filter))) where (request.FilterValue.Length == 0 || (request.FilterValue.Length > 0 && c.Name.Contains(request.Filter)))
select new CollectionList select CollectionList.FromDataCollection(c, (from crc in this.DbContext.CollectionReleases
{ where crc.CollectionId == c.Id
DatabaseId = c.Id, select crc.Id).Count(), this.MakeCollectionThumbnailImage(c.RoadieId)));
Collection = new DataToken
{
Text = c.Name,
Value = c.RoadieId.ToString()
},
Id = c.RoadieId,
CollectionCount = c.CollectionCount,
CollectionType = (c.CollectionType ?? CollectionType.Unknown).ToString(),
CollectionFoundCount = (from crc in this.DbContext.CollectionReleases
where crc.CollectionId == c.Id
select crc.Id).Count(),
CreatedDate = c.CreatedDate,
LastUpdated = c.LastUpdated,
Thumbnail = MakeCollectionThumbnailImage(c.RoadieId)
});
var sortBy = string.IsNullOrEmpty(request.Sort) ? request.OrderValue(new Dictionary<string, string> { { "Collection.Text", "ASC" } }) : request.OrderValue(null); var sortBy = string.IsNullOrEmpty(request.Sort) ? request.OrderValue(new Dictionary<string, string> { { "Collection.Text", "ASC" } }) : request.OrderValue(null);
var rowCount = result.Count(); var rowCount = result.Count();
var rows = result.OrderBy(sortBy).Skip(request.SkipValue).Take(request.LimitValue).ToArray(); var rows = result.OrderBy(sortBy).Skip(request.SkipValue).Take(request.LimitValue).ToArray();

View file

@ -15,5 +15,6 @@ namespace Roadie.Api.Services
Task<OperationResult<short>> SetTrackRating(Guid trackId, User roadieUser, short rating); Task<OperationResult<short>> SetTrackRating(Guid trackId, User roadieUser, short rating);
Task<OperationResult<bool>> SetArtistFavorite(Guid artistId, User roadieUser, bool isFavorite); Task<OperationResult<bool>> SetArtistFavorite(Guid artistId, User roadieUser, bool isFavorite);
Task<OperationResult<bool>> SetReleaseFavorite(Guid releaseId, User roadieUser, bool isFavorite); Task<OperationResult<bool>> SetReleaseFavorite(Guid releaseId, User roadieUser, bool isFavorite);
Task<OperationResult<bool>> SetArtistBookmark(Guid artistId, User roadieUser, bool isBookmarked);
} }
} }

View file

@ -116,34 +116,18 @@ namespace Roadie.Api.Services
from trackArtist in tas.DefaultIfEmpty() from trackArtist in tas.DefaultIfEmpty()
select new PlaylistTrack select new PlaylistTrack
{ {
ListNumber = plt.pltr.ListNumber, ListNumber = plt.pltr.ListNumber,
Track = new TrackList Track = TrackList.FromDataTrack(plt.t,
{ rm.MediaNumber,
DatabaseId = plt.t.Id, r,
Id = plt.t.RoadieId, releaseArtist,
Track = new DataToken trackArtist,
{ this.HttpContext.BaseUrl,
Text = plt.t.Title, this.MakeTrackThumbnailImage(plt.t.RoadieId),
Value = plt.t.RoadieId.ToString() this.MakeReleaseThumbnailImage(r.RoadieId),
}, this.MakeArtistThumbnailImage(releaseArtist.RoadieId),
Release = ReleaseList.FromDataRelease(r, releaseArtist, this.HttpContext.BaseUrl, this.MakeArtistThumbnailImage(releaseArtist.RoadieId), this.MakeReleaseThumbnailImage(r.RoadieId)), this.MakeArtistThumbnailImage(trackArtist == null ? null : (Guid?)trackArtist.RoadieId))
LastPlayed = plt.t.LastPlayed, }).ToArray();
Artist = ArtistList.FromDataArtist(releaseArtist, this.MakeArtistThumbnailImage(releaseArtist.RoadieId)),
TrackArtist = trackArtist == null ? null : ArtistList.FromDataArtist(trackArtist, this.MakeArtistThumbnailImage(trackArtist.RoadieId)),
TrackNumber = plt.t.TrackNumber,
MediaNumber = rm.MediaNumber,
CreatedDate = plt.t.CreatedDate,
LastUpdated = plt.t.LastUpdated,
Duration = plt.t.Duration,
FileSize = plt.t.FileSize,
ReleaseDate = r.ReleaseDate,
PlayedCount = plt.t.PlayedCount,
Rating = plt.t.Rating,
Title = plt.t.Title,
TrackPlayUrl = $"{ this.HttpContext.BaseUrl }/play/track/{ plt.t.RoadieId }.mp3",
Thumbnail = this.MakeTrackThumbnailImage(plt.t.RoadieId)
}
}).ToArray();
} }
} }
@ -196,31 +180,8 @@ namespace Roadie.Api.Services
where (request.FilterToArtistId == null || playlistWithArtistTrackIds.Contains(pl.Id)) where (request.FilterToArtistId == null || playlistWithArtistTrackIds.Contains(pl.Id))
where (request.FilterToReleaseId == null || playlistReleaseTrackIds.Contains(pl.Id)) where (request.FilterToReleaseId == null || playlistReleaseTrackIds.Contains(pl.Id))
where ((roadieUser == null && pl.IsPublic) || (roadieUser != null && u.RoadieId == roadieUser.UserId || pl.IsPublic)) where ((roadieUser == null && pl.IsPublic) || (roadieUser != null && u.RoadieId == roadieUser.UserId || pl.IsPublic))
where (request.FilterValue.Length == 0 || (request.FilterValue.Length > 0 && (pl.Name != null && pl.Name.Contains(request.FilterValue)) where (request.FilterValue.Length == 0 || (request.FilterValue.Length > 0 && (pl.Name != null && pl.Name.Contains(request.FilterValue))))
)) select PlaylistList.FromDataPlaylist(pl, u, this.MakePlaylistThumbnailImage(pl.RoadieId), this.MakeUserThumbnailImage(u.RoadieId)));
select new PlaylistList
{
Playlist = new DataToken
{
Text = pl.Name,
Value = pl.RoadieId.ToString()
},
User = new DataToken
{
Text = u.UserName,
Value = u.RoadieId.ToString()
},
PlaylistCount = this.DbContext.PlaylistTracks.Where(x => x.PlayListId == pl.Id).Count(),
IsPublic = pl.IsPublic,
Duration = pl.Duration,
TrackCount = pl.TrackCount,
CreatedDate = pl.CreatedDate,
LastUpdated = pl.LastUpdated,
UserThumbnail = MakeUserThumbnailImage(u.RoadieId),
Id = pl.RoadieId,
Thumbnail = MakePlaylistThumbnailImage(pl.RoadieId)
});
var sortBy = string.IsNullOrEmpty(request.Sort) ? request.OrderValue(new Dictionary<string, string> { { "Playlist.Text", "ASC" } }) : request.OrderValue(null); var sortBy = string.IsNullOrEmpty(request.Sort) ? request.OrderValue(new Dictionary<string, string> { { "Playlist.Text", "ASC" } }) : request.OrderValue(null);
var rowCount = result.Count(); var rowCount = result.Count();
var rows = result.OrderBy(sortBy).Skip(request.SkipValue).Take(request.LimitValue).ToArray(); var rows = result.OrderBy(sortBy).Skip(request.SkipValue).Take(request.LimitValue).ToArray();

View file

@ -222,9 +222,13 @@ namespace Roadie.Api.Services
}, ApplicationUser.CacheRegionUrn(id.Value)); }, ApplicationUser.CacheRegionUrn(id.Value));
} }
protected Image MakeArtistThumbnailImage(Guid id) protected Image MakeArtistThumbnailImage(Guid? id)
{ {
return MakeThumbnailImage(id, "artist"); if(!id.HasValue)
{
return null;
}
return MakeThumbnailImage(id.Value, "artist");
} }
protected Image MakeCollectionThumbnailImage(Guid id) protected Image MakeCollectionThumbnailImage(Guid id)

View file

@ -27,9 +27,7 @@ namespace Roadie.Api.Services
IHttpContext httpContext, IHttpContext httpContext,
data.IRoadieDbContext context, data.IRoadieDbContext context,
ICacheManager cacheManager, ICacheManager cacheManager,
ILogger<ArtistService> logger, ILogger<ArtistService> logger)
ICollectionService collectionService,
IPlaylistService playlistService)
: base(configuration, httpEncoder, context, cacheManager, logger, httpContext) : base(configuration, httpEncoder, context, cacheManager, logger, httpContext)
{ {
} }
@ -204,5 +202,55 @@ namespace Roadie.Api.Services
return await base.ToggleReleaseFavorite(releaseId, user, isFavorite); return await base.ToggleReleaseFavorite(releaseId, user, isFavorite);
} }
public async Task<OperationResult<bool>> SetArtistBookmark(Guid artistId, User roadieUser, bool isBookmarked)
{
var user = this.GetUser(roadieUser.UserId);
if (user == null)
{
return new OperationResult<bool>(true, $"Invalid User [{ roadieUser }]");
}
var artist = this.GetArtist(artistId);
if (artist == null)
{
return new OperationResult<bool>(true, $"Invalid Artist [{ artistId }]");
}
var bookmark = this.DbContext.Bookmarks.FirstOrDefault(x => x.BookmarkTargetId == artist.Id &&
x.BookmarkType == Library.Enums.BookmarkType.Artist &&
x.UserId == roadieUser.Id);
if (isBookmarked)
{
// Remove bookmark
if(bookmark != null)
{
this.DbContext.Bookmarks.Remove(bookmark);
await this.DbContext.SaveChangesAsync();
}
}
else
{
// Add bookmark
if(bookmark == null)
{
this.DbContext.Bookmarks.Add(new data.Bookmark
{
UserId = roadieUser.Id,
BookmarkTargetId = artist.Id,
BookmarkType = Library.Enums.BookmarkType.Artist,
CreatedDate = DateTime.UtcNow,
Status = Library.Enums.Statuses.Ok
});
await this.DbContext.SaveChangesAsync();
}
}
this.CacheManager.ClearRegion(user.CacheRegion);
this.CacheManager.ClearRegion(artist.CacheRegion);
return new OperationResult<bool>
{
IsSuccess = true,
Data = true
};
}
} }
} }

View file

@ -11,10 +11,10 @@ namespace Roadie.Library.Data
[Column("bookmarkTargetId")] [Column("bookmarkTargetId")]
public int BookmarkTargetId { get; set; } public int BookmarkTargetId { get; set; }
[Column("bookmarkType")]
public short? Type { get; set; }
// [Column("bookmarkType")] // public short? Type { get; set; }
[Column("bookmarkType")]
public BookmarkType? BookmarkType { get; set; } public BookmarkType? BookmarkType { get; set; }
public ApplicationUser User { get; set; } public ApplicationUser User { get; set; }

View file

@ -1,5 +1,8 @@
using Newtonsoft.Json; using Newtonsoft.Json;
using Roadie.Library.Enums; using Roadie.Library.Enums;
using Roadie.Library.Models.Collections;
using Roadie.Library.Models.Playlists;
using Roadie.Library.Models.Releases;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
@ -13,9 +16,22 @@ namespace Roadie.Library.Models
public DataToken Bookmark { get; set; } public DataToken Bookmark { get; set; }
public Image Thumbnail { get; set; } public Image Thumbnail { get; set; }
public BookmarkType? Type { get; set; } public BookmarkType? Type { get; set; }
public string BookmarkType
{
get
{
return this.Type.ToString();
}
}
[JsonIgnore] [JsonIgnore]
public int BookmarkTargetId { get; set; } public int BookmarkTargetId { get; set; }
public string Comment { get; set; } public string Comment { get; set; }
public int? Position { get; set; } public int? Position { get; set; }
public ArtistList Artist { get; set; }
public ReleaseList Release { get; set; }
public TrackList Track { get; set; }
public PlaylistList Playlist { get; set; }
public CollectionList Collection { get; set; }
public LabelList Label { get; set; }
} }
} }

View file

@ -27,5 +27,25 @@ namespace Roadie.Library.Models.Collections
return (int)Math.Floor((decimal)this.CollectionFoundCount / (decimal)this.CollectionCount * 100); return (int)Math.Floor((decimal)this.CollectionFoundCount / (decimal)this.CollectionCount * 100);
} }
} }
public static CollectionList FromDataCollection(Data.Collection collection, int foundCount, Image collectionThumbnail)
{
return new CollectionList
{
DatabaseId = collection.Id,
Collection = new DataToken
{
Text = collection.Name,
Value = collection.RoadieId.ToString()
},
Id = collection.RoadieId,
CollectionCount = collection.CollectionCount,
CollectionType = (collection.CollectionType ?? Roadie.Library.Enums.CollectionType.Unknown).ToString(),
CollectionFoundCount = foundCount,
CreatedDate = collection.CreatedDate,
LastUpdated = collection.LastUpdated,
Thumbnail = collectionThumbnail
};
}
} }
} }

View file

@ -13,5 +13,25 @@ namespace Roadie.Library.Models
public int? ArtistCount { get; set; } public int? ArtistCount { get; set; }
public int? ReleaseCount { get; set; } public int? ReleaseCount { get; set; }
public int? TrackCount { get; set; } public int? TrackCount { get; set; }
public static LabelList FromDataLabel(Data.Label label, Image labelThumbnail)
{
return new LabelList
{
Id = label.RoadieId,
Label = new DataToken
{
Text = label.Name,
Value = label.RoadieId.ToString()
},
SortName = label.SortName,
CreatedDate = label.CreatedDate,
LastUpdated = label.LastUpdated,
ArtistCount = label.ArtistCount,
ReleaseCount = label.ReleaseCount,
TrackCount = label.TrackCount,
Thumbnail = labelThumbnail
};
}
} }
} }

View file

@ -1,4 +1,5 @@
using Roadie.Library.Utility; using Roadie.Library.Identity;
using Roadie.Library.Utility;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
@ -29,5 +30,32 @@ namespace Roadie.Library.Models.Playlists
} }
public short TrackCount { get; set; } public short TrackCount { get; set; }
public static PlaylistList FromDataPlaylist(Data.Playlist playlist, ApplicationUser user, Image playlistThumbnail, Image userThumbnail)
{
return new PlaylistList
{
Playlist = new DataToken
{
Text = playlist.Name,
Value = playlist.RoadieId.ToString()
},
User = new DataToken
{
Text = user.UserName,
Value = user.RoadieId.ToString()
},
PlaylistCount = playlist.TrackCount,
IsPublic = playlist.IsPublic,
Duration = playlist.Duration,
TrackCount = playlist.TrackCount,
CreatedDate = playlist.CreatedDate,
LastUpdated = playlist.LastUpdated,
UserThumbnail = userThumbnail,
Id = playlist.RoadieId,
Thumbnail = playlistThumbnail
};
}
} }
} }

View file

@ -76,5 +76,46 @@ namespace Roadie.Library.Models
} }
public int? FileSize { get; set; } public int? FileSize { get; set; }
public static TrackList FromDataTrack(Data.Track track,
int releaseMediaNumber,
Data.Release release,
Data.Artist artist,
Data.Artist trackArtist,
string baseUrl,
Image trackThumbnail,
Image releaseThumbnail,
Image artistThumbnail,
Image trackArtistThumbnail)
{
return new TrackList
{
DatabaseId = track.Id,
Id = track.RoadieId,
Track = new DataToken
{
Text = track.Title,
Value = track.RoadieId.ToString()
},
Release = ReleaseList.FromDataRelease(release, artist, baseUrl, artistThumbnail, releaseThumbnail),
LastPlayed = track.LastPlayed,
Artist = ArtistList.FromDataArtist(artist, artistThumbnail),
TrackArtist = trackArtist == null ? null : ArtistList.FromDataArtist(trackArtist, trackArtistThumbnail),
TrackNumber = track.TrackNumber,
MediaNumber = releaseMediaNumber,
CreatedDate = track.CreatedDate,
LastUpdated = track.LastUpdated,
Duration = track.Duration,
FileSize = track.FileSize,
ReleaseDate = release.ReleaseDate,
PlayedCount = track.PlayedCount,
Rating = track.Rating,
Title = track.Title,
TrackPlayUrl = $"{ baseUrl }/play/track/{ track.RoadieId }.mp3",
Thumbnail = trackThumbnail
};
}
} }
} }