Add CMS waveform pre-processing panel with backfill endpoints
GET api/track/waveform-status and POST api/track/{id}/waveform (ApiKey);
CmsTrackService methods; TrackPreProcessing page with per-row and
sequential bulk generation; nav links from TrackList and Index.
This commit is contained in:
@@ -0,0 +1,91 @@
|
||||
@page "/tracks/preprocessing"
|
||||
@attribute [Authorize]
|
||||
|
||||
<PageTitle>Waveform Pre-Processing — DeepDrft CMS</PageTitle>
|
||||
|
||||
<MudContainer MaxWidth="MaxWidth.Large" Class="mt-8">
|
||||
<MudStack Row="true" AlignItems="AlignItems.Center" Justify="Justify.SpaceBetween" Class="mb-4">
|
||||
<MudStack Spacing="0">
|
||||
<MudText Typo="Typo.h3">Waveform Pre-Processing</MudText>
|
||||
<MudText Typo="Typo.body2" Class="mud-text-secondary">
|
||||
Generate loudness profiles for tracks that predate the waveform seeker.
|
||||
</MudText>
|
||||
</MudStack>
|
||||
<MudButton Variant="Variant.Filled"
|
||||
Color="Color.Primary"
|
||||
StartIcon="@Icons.Material.Filled.AutoFixHigh"
|
||||
Disabled="@(_bulkRunning || _missingCount == 0)"
|
||||
OnClick="GenerateAllMissing">
|
||||
@if (_bulkRunning)
|
||||
{
|
||||
<MudProgressCircular Class="mr-2" Size="Size.Small" Indeterminate="true" />
|
||||
<span>Generating @_bulkDone / @_bulkTotal…</span>
|
||||
}
|
||||
else
|
||||
{
|
||||
<span>Generate All Missing (@_missingCount)</span>
|
||||
}
|
||||
</MudButton>
|
||||
</MudStack>
|
||||
|
||||
<MudTable T="WaveformStatusDto"
|
||||
Items="_rows"
|
||||
Loading="_loading"
|
||||
Hover="true"
|
||||
Striped="true"
|
||||
Dense="true"
|
||||
Bordered="false"
|
||||
FixedHeader="true">
|
||||
<NoRecordsContent>
|
||||
<MudText Typo="Typo.body1">No tracks found.</MudText>
|
||||
</NoRecordsContent>
|
||||
<LoadingContent>
|
||||
<MudText Typo="Typo.body1">Loading waveform status…</MudText>
|
||||
</LoadingContent>
|
||||
<HeaderContent>
|
||||
<MudTh>Track Name</MudTh>
|
||||
<MudTh>Entry Key</MudTh>
|
||||
<MudTh Style="width: 1%; white-space: nowrap;">Profile</MudTh>
|
||||
<MudTh Style="width: 1%; white-space: nowrap;">Actions</MudTh>
|
||||
</HeaderContent>
|
||||
<RowTemplate>
|
||||
<MudTd DataLabel="Track Name">@context.TrackName</MudTd>
|
||||
<MudTd DataLabel="Entry Key">
|
||||
<MudText Typo="Typo.caption" Style="font-family: monospace;">@context.EntryKey</MudText>
|
||||
</MudTd>
|
||||
<MudTd DataLabel="Profile">
|
||||
@if (context.HasProfile)
|
||||
{
|
||||
<MudChip T="string" Size="Size.Small" Color="Color.Success" Variant="Variant.Text"
|
||||
Icon="@Icons.Material.Filled.CheckCircle">Stored</MudChip>
|
||||
}
|
||||
else
|
||||
{
|
||||
<MudChip T="string" Size="Size.Small" Color="Color.Warning" Variant="Variant.Text"
|
||||
Icon="@Icons.Material.Filled.Cancel">Missing</MudChip>
|
||||
}
|
||||
</MudTd>
|
||||
<MudTd DataLabel="Actions">
|
||||
@if (!context.HasProfile)
|
||||
{
|
||||
<MudButton Variant="Variant.Outlined"
|
||||
Size="Size.Small"
|
||||
Color="Color.Primary"
|
||||
StartIcon="@Icons.Material.Filled.GraphicEq"
|
||||
Disabled="@(_bulkRunning || IsGenerating(context.EntryKey))"
|
||||
OnClick="@(() => GenerateOne(context))">
|
||||
@if (IsGenerating(context.EntryKey))
|
||||
{
|
||||
<MudProgressCircular Class="mr-2" Size="Size.Small" Indeterminate="true" />
|
||||
<span>Generating…</span>
|
||||
}
|
||||
else
|
||||
{
|
||||
<span>Generate</span>
|
||||
}
|
||||
</MudButton>
|
||||
}
|
||||
</MudTd>
|
||||
</RowTemplate>
|
||||
</MudTable>
|
||||
</MudContainer>
|
||||
Reference in New Issue
Block a user