feat: normalize release-cardinal fields out of track into a Release entity (Phase 8 §8.0)

This commit is contained in:
daniel-c-harvey
2026-06-11 12:51:21 -04:00
parent 16f356a760
commit f767d288c5
33 changed files with 1032 additions and 297 deletions
+4 -4
View File
@@ -33,11 +33,11 @@
<div class="album-card"
role="button"
tabindex="0"
@onclick="@(() => OpenAlbum(album.Album))">
@if (!string.IsNullOrEmpty(album.CoverImageKey))
@onclick="@(() => OpenAlbum(album.Title))">
@if (!string.IsNullOrEmpty(album.ImagePath))
{
<div class="album-card-cover"
style="background-image: url('api/image/@Uri.EscapeDataString(album.CoverImageKey)');">
style="background-image: url('api/image/@Uri.EscapeDataString(album.ImagePath)');">
</div>
}
else
@@ -47,7 +47,7 @@
<div class="album-card-body">
<MudText Typo="Typo.subtitle1" Class="album-card-title text-truncate">
@album.Album
@album.Title
</MudText>
<MudText Typo="Typo.caption" Class="album-card-count">
@album.TrackCount @(album.TrackCount == 1 ? "track" : "tracks")
@@ -10,7 +10,7 @@ public partial class AlbumsView : ComponentBase
[Inject] public required NavigationManager Navigation { get; set; }
private bool _loading = true;
private List<AlbumSummaryDto> _albums = [];
private List<ReleaseDto> _albums = [];
protected override async Task OnInitializedAsync()
{
+12 -10
View File
@@ -43,7 +43,9 @@ else if (ViewModel.Track is not null)
var isThisTrackPlaying = PlayerService.CurrentTrack?.Id == track.Id
&& PlayerService.IsPlaying
&& !PlayerService.IsPaused;
var hasMeta = track.Album is not null || track.Genre is not null || track.ReleaseDate is not null;
var release = track.Release;
var hasMeta = release is not null
&& (release.Title is not null || release.Genre is not null || release.ReleaseDate is not null);
<div class="deepdrft-track-detail-container">
@@ -54,7 +56,7 @@ else if (ViewModel.Track is not null)
<MudStack Row AlignItems="AlignItems.Start" Justify="Justify.SpaceBetween" Style="margin: 2rem 0 1.5rem;">
<div class="deepdrft-track-detail-masthead">
<MudText Typo="Typo.h3">@track.TrackName</MudText>
<MudText Typo="Typo.h6" Color="Color.Primary">@track.Artist</MudText>
<MudText Typo="Typo.h6" Color="Color.Primary">@release?.Artist</MudText>
</div>
<MudStack Row AlignItems="AlignItems.Center" Spacing="1">
@@ -64,10 +66,10 @@ else if (ViewModel.Track is not null)
</MudStack>
<div class="deepdrft-track-detail-cover">
@if (!string.IsNullOrEmpty(track.ImagePath))
@if (!string.IsNullOrEmpty(release?.ImagePath))
{
<MudPaper Elevation="2" Class="deepdrft-track-detail-cover-art"
Style="@($"background-image: url('api/image/{Uri.EscapeDataString(track.ImagePath)}');")" />
Style="@($"background-image: url('api/image/{Uri.EscapeDataString(release.ImagePath)}');")" />
}
else
{
@@ -82,31 +84,31 @@ else if (ViewModel.Track is not null)
<MudDivider />
<div class="deepdrft-track-detail-meta">
@if (track.Album is not null)
@if (release?.Title is not null)
{
<div>
<MudText Typo="Typo.overline">Album</MudText>
<MudText Typo="Typo.body1">@track.Album</MudText>
<MudText Typo="Typo.body1">@release.Title</MudText>
</div>
}
@if (track.Genre is not null)
@if (release?.Genre is not null)
{
<div>
<MudChip T="string"
Variant="Variant.Outlined"
Color="Color.Tertiary"
Class="deepdrft-genre-chip">
@track.Genre
@release.Genre
</MudChip>
</div>
}
@if (track.ReleaseDate is not null)
@if (release?.ReleaseDate is not null)
{
<div>
<MudText Typo="Typo.overline">Released</MudText>
<MudText Typo="Typo.body1">@track.ReleaseDate.Value.ToString("MMMM yyyy")</MudText>
<MudText Typo="Typo.body1">@release.ReleaseDate.Value.ToString("MMMM yyyy")</MudText>
</div>
}
</div>