Implement media retry functionality and enhance error handling
Added endpoints for retrying failed media processing, allowing users to requeue media assets that encountered errors. Introduced error messages for scenarios where a media asset cannot be retried due to its status. Updated the MaintenanceBackgroundService to remove orphaned episodes and recompute group statistics, ensuring data integrity. Enhanced the frontend to support retry actions, including bulk retry options for failed media. Updated localization strings to reflect new features in both English and Russian.
This commit is contained in:
@@ -3,16 +3,21 @@ using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Hosting;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using TeleWave.Application.Common.Interfaces;
|
||||
using TeleWave.Application.Programming.Groups;
|
||||
|
||||
namespace TeleWave.Infrastructure.Broadcast;
|
||||
|
||||
/// <summary>
|
||||
/// Обслуживание, которое раньше не делалось вовсе: чистка отрендеренных заставок, на которые больше
|
||||
/// никто не ссылается. Они копятся при каждой смене пары шоу и при каждой правке блока заставки,
|
||||
/// а после перехода на длинное хранение расписания их станет заметно больше.
|
||||
/// никто не ссылается, снятие серий без ассета и пересчёт статистики групп.
|
||||
///
|
||||
/// Общее у этих трёх — их некому делать по событию: заставки копятся при каждой смене пары шоу,
|
||||
/// серия остаётся висеть после удаления ассета в обход админки, а статистика динамической группы
|
||||
/// устаревает молча — состав считает правило, и меняется он вместе с библиотекой, а не по правке
|
||||
/// группы.
|
||||
///
|
||||
/// Идёт по расписанию отдельно от генерации: та держит advisory-лок канала, и подмешивать в неё
|
||||
/// удаление по всей таблице не нужно.
|
||||
/// проходы по всей таблице не нужно.
|
||||
/// </summary>
|
||||
public sealed class MaintenanceBackgroundService(
|
||||
IServiceScopeFactory scopeFactory,
|
||||
@@ -65,5 +70,53 @@ public sealed class MaintenanceBackgroundService(
|
||||
|
||||
if (removed > 0)
|
||||
logger.LogInformation("Обслуживание: удалено осиротевших заставок — {Count}", removed);
|
||||
|
||||
await RemoveOrphanEpisodesAsync(db, cancellationToken);
|
||||
await RecomputeGroupStatsAsync(scope.ServiceProvider, db, cancellationToken);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Снимает серии, чей ассет исчез из базы. В норме их не бывает — удаление ассета снимает
|
||||
/// серию само, — но правка базы руками и удаления прежних версий такие строки оставили.
|
||||
/// Висячая серия в эфир не идёт и ничем себя не выдаёт: шоу просто числится длиннее, чем есть.
|
||||
/// </summary>
|
||||
private async Task RemoveOrphanEpisodesAsync(
|
||||
IAppDbContext db,
|
||||
CancellationToken cancellationToken
|
||||
)
|
||||
{
|
||||
var removed = await db
|
||||
.Shows.SelectMany(s => s.Episodes)
|
||||
.Where(e => !db.MediaAssets.Any(a => a.Id == e.MediaAssetId))
|
||||
.ExecuteDeleteAsync(cancellationToken);
|
||||
|
||||
if (removed > 0)
|
||||
logger.LogInformation("Обслуживание: снято серий без ассета — {Count}", removed);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Пересчитывает статистику групп. Кэш обновляется при правке состава, но состав динамической
|
||||
/// группы задан правилом: доехавший ассет или новое шоу меняют её молча, и карточка группы
|
||||
/// начинает врать — «55 единиц, 0 часов» там, где на деле 66 фильмов.
|
||||
/// </summary>
|
||||
private async Task RecomputeGroupStatsAsync(
|
||||
IServiceProvider services,
|
||||
IAppDbContext db,
|
||||
CancellationToken cancellationToken
|
||||
)
|
||||
{
|
||||
var stats = services.GetRequiredService<GroupStatsService>();
|
||||
var groups = await db.Groups.Include(g => g.Items).ToListAsync(cancellationToken);
|
||||
|
||||
foreach (var group in groups)
|
||||
await stats.RecomputeAsync(group, cancellationToken);
|
||||
|
||||
await db.SaveChangesAsync(cancellationToken);
|
||||
|
||||
if (groups.Count > 0)
|
||||
logger.LogInformation(
|
||||
"Обслуживание: пересчитана статистика групп — {Count}",
|
||||
groups.Count
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user