Implement preferred audio languages feature: update site settings to include preferred audio languages, modify related data structures and API endpoints, and enhance media processing to select audio tracks based on user preferences. Update frontend components for managing and displaying these settings.
This commit is contained in:
@@ -7,4 +7,10 @@ public interface ISiteSettings
|
||||
|
||||
/// <summary>Пишет значение в контекст (сохранение — за UnitOfWorkBehavior вызывающей команды).</summary>
|
||||
Task SetRegistrationEnabledAsync(bool enabled, CancellationToken cancellationToken);
|
||||
|
||||
/// <summary>Предпочитаемые языки аудиодорожек при обработке, через запятую в порядке приоритета
|
||||
/// (напр. «rus,eng»); пусто — без предпочтения.</summary>
|
||||
Task<string> GetPreferredAudioLanguagesAsync(CancellationToken cancellationToken);
|
||||
|
||||
Task SetPreferredAudioLanguagesAsync(string value, CancellationToken cancellationToken);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
namespace TeleWave.Application.Media;
|
||||
|
||||
/// <summary>
|
||||
/// Выбор аудиодорожки при обработке по предпочитаемым языкам. Чистая логика (без ffmpeg/БД) — общая
|
||||
/// точка для медиа-процессора и тестов.
|
||||
/// </summary>
|
||||
public static class AudioTrackSelector
|
||||
{
|
||||
/// <summary>
|
||||
/// Возвращает порядковый номер аудиодорожки (0:a:N) по предпочитаемым языкам: побеждает первый
|
||||
/// язык из списка <paramref name="preferred"/>, для которого есть дорожка (среди таких — первая по
|
||||
/// порядку). Нет совпадений / нет предпочтений / меньше двух дорожек — null (дефолтная эвристика
|
||||
/// ffmpeg: пусть выбирает сам).
|
||||
/// </summary>
|
||||
public static int? Select(
|
||||
IReadOnlyList<string?> audioLanguages,
|
||||
IReadOnlyList<string> preferred
|
||||
)
|
||||
{
|
||||
if (audioLanguages.Count < 2 || preferred.Count == 0)
|
||||
return null;
|
||||
|
||||
foreach (var lang in preferred)
|
||||
for (var i = 0; i < audioLanguages.Count; i++)
|
||||
if (string.Equals(audioLanguages[i], lang, StringComparison.OrdinalIgnoreCase))
|
||||
return i;
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -21,4 +21,20 @@ public static class AppSettingsReader
|
||||
|
||||
return value is not null && bool.TryParse(value, out var parsed) ? parsed : defaultValue;
|
||||
}
|
||||
|
||||
public static async Task<string> GetStringSettingAsync(
|
||||
this IAppDbContext db,
|
||||
string key,
|
||||
string defaultValue,
|
||||
CancellationToken cancellationToken
|
||||
)
|
||||
{
|
||||
var value = await db
|
||||
.AppSettings.AsNoTracking()
|
||||
.Where(s => s.Key == key)
|
||||
.Select(s => s.Value)
|
||||
.FirstOrDefaultAsync(cancellationToken);
|
||||
|
||||
return value ?? defaultValue;
|
||||
}
|
||||
}
|
||||
|
||||
+2
-1
@@ -12,6 +12,7 @@ public sealed class GetSiteSettingsQueryHandler(ISiteSettings siteSettings)
|
||||
)
|
||||
{
|
||||
var registrationEnabled = await siteSettings.IsRegistrationEnabledAsync(cancellationToken);
|
||||
return new SiteSettingsDto(registrationEnabled);
|
||||
var preferredAudio = await siteSettings.GetPreferredAudioLanguagesAsync(cancellationToken);
|
||||
return new SiteSettingsDto(registrationEnabled, preferredAudio);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,4 +5,8 @@ public static class SettingKeys
|
||||
{
|
||||
/// <summary>Разрешена ли открытая регистрация пользователей (по умолчанию — нет).</summary>
|
||||
public const string RegistrationEnabled = "registration.enabled";
|
||||
|
||||
/// <summary>Предпочитаемые языки аудиодорожек при обработке, через запятую в порядке приоритета
|
||||
/// (напр. «rus,eng»). При наличии дорожки с таким языком она выбирается первой; иначе — дефолт ffmpeg.</summary>
|
||||
public const string PreferredAudioLanguages = "media.preferredAudioLanguages";
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace TeleWave.Application.Settings;
|
||||
|
||||
/// <summary>Глобальные настройки сайта, управляемые администратором.</summary>
|
||||
public sealed record SiteSettingsDto(bool RegistrationEnabled);
|
||||
public sealed record SiteSettingsDto(bool RegistrationEnabled, string PreferredAudioLanguages);
|
||||
|
||||
+2
-1
@@ -3,4 +3,5 @@ using TeleWave.Application.Common.Models;
|
||||
|
||||
namespace TeleWave.Application.Settings.UpdateSiteSettings;
|
||||
|
||||
public sealed record UpdateSiteSettingsCommand(bool RegistrationEnabled) : ICommand<Result>;
|
||||
public sealed record UpdateSiteSettingsCommand(bool RegistrationEnabled, string PreferredAudioLanguages)
|
||||
: ICommand<Result>;
|
||||
|
||||
+8
@@ -17,6 +17,14 @@ public sealed class UpdateSiteSettingsCommandHandler(ISiteSettings siteSettings)
|
||||
command.RegistrationEnabled,
|
||||
cancellationToken
|
||||
);
|
||||
// Нормализуем список языков: без пробелов, в нижнем регистре, пустые отбрасываем.
|
||||
var languages = string.Join(
|
||||
',',
|
||||
(command.PreferredAudioLanguages ?? string.Empty)
|
||||
.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries)
|
||||
.Select(x => x.ToLowerInvariant())
|
||||
);
|
||||
await siteSettings.SetPreferredAudioLanguagesAsync(languages, cancellationToken);
|
||||
return Result.Success();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user