diff --git a/ErsatzTV.Application/MediaItems/Queries/GetAllLanguageCodes.cs b/ErsatzTV.Application/MediaItems/Queries/GetAllLanguageCodes.cs new file mode 100644 index 00000000..c9145ea1 --- /dev/null +++ b/ErsatzTV.Application/MediaItems/Queries/GetAllLanguageCodes.cs @@ -0,0 +1,8 @@ +using System.Collections.Generic; +using System.Globalization; +using MediatR; + +namespace ErsatzTV.Application.MediaItems.Queries +{ + public record GetAllLanguageCodes : IRequest>; +} diff --git a/ErsatzTV.Application/MediaItems/Queries/GetAllLanguageCodesHandler.cs b/ErsatzTV.Application/MediaItems/Queries/GetAllLanguageCodesHandler.cs new file mode 100644 index 00000000..0202751b --- /dev/null +++ b/ErsatzTV.Application/MediaItems/Queries/GetAllLanguageCodesHandler.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Threading; +using System.Threading.Tasks; +using ErsatzTV.Core.Interfaces.Repositories; +using LanguageExt; +using MediatR; + +namespace ErsatzTV.Application.MediaItems.Queries +{ + public class GetAllLanguageCodesHandler : IRequestHandler> + { + private readonly IMediaItemRepository _mediaItemRepository; + + public GetAllLanguageCodesHandler(IMediaItemRepository mediaItemRepository) => + _mediaItemRepository = mediaItemRepository; + + public async Task> Handle(GetAllLanguageCodes request, CancellationToken cancellationToken) + { + var result = new List(); + + CultureInfo[] allCultures = CultureInfo.GetCultures(CultureTypes.AllCultures); + List allLanguageCodes = await _mediaItemRepository.GetAllLanguageCodes(); + foreach (string code in allLanguageCodes) + { + Option maybeCulture = allCultures.Find( + ci => string.Equals(code, ci.ThreeLetterISOLanguageName, StringComparison.OrdinalIgnoreCase)); + await maybeCulture.IfSomeAsync(cultureInfo => result.Add(cultureInfo)); + } + + return result; + } + } +} diff --git a/ErsatzTV.Core/Interfaces/Repositories/IMediaItemRepository.cs b/ErsatzTV.Core/Interfaces/Repositories/IMediaItemRepository.cs index 2d340bfd..42741d25 100644 --- a/ErsatzTV.Core/Interfaces/Repositories/IMediaItemRepository.cs +++ b/ErsatzTV.Core/Interfaces/Repositories/IMediaItemRepository.cs @@ -10,5 +10,6 @@ namespace ErsatzTV.Core.Interfaces.Repositories Task> Get(int id); Task> GetAll(); Task Update(MediaItem mediaItem); + Task> GetAllLanguageCodes(); } } diff --git a/ErsatzTV.Infrastructure/Data/Repositories/MediaItemRepository.cs b/ErsatzTV.Infrastructure/Data/Repositories/MediaItemRepository.cs index 003c7218..532ee3d6 100644 --- a/ErsatzTV.Infrastructure/Data/Repositories/MediaItemRepository.cs +++ b/ErsatzTV.Infrastructure/Data/Repositories/MediaItemRepository.cs @@ -1,6 +1,8 @@ using System.Collections.Generic; +using System.Data; using System.Linq; using System.Threading.Tasks; +using Dapper; using ErsatzTV.Core.Domain; using ErsatzTV.Core.Interfaces.Repositories; using LanguageExt; @@ -11,10 +13,14 @@ namespace ErsatzTV.Infrastructure.Data.Repositories { public class MediaItemRepository : IMediaItemRepository { + private readonly IDbConnection _dbConnection; private readonly IDbContextFactory _dbContextFactory; - public MediaItemRepository(IDbContextFactory dbContextFactory) => + public MediaItemRepository(IDbContextFactory dbContextFactory, IDbConnection dbConnection) + { _dbContextFactory = dbContextFactory; + _dbConnection = dbConnection; + } public async Task> Get(int id) { @@ -38,5 +44,16 @@ namespace ErsatzTV.Infrastructure.Data.Repositories context.MediaItems.Update(mediaItem); return await context.SaveChangesAsync() > 0; } + + public Task> GetAllLanguageCodes() => + _dbConnection.QueryAsync( + @"SELECT LanguageCode FROM + (SELECT Language AS LanguageCode + FROM MediaStream WHERE Language IS NOT NULL + UNION ALL SELECT PreferredLanguageCode AS LanguageCode + FROM Channel WHERE PreferredLanguageCode IS NOT NULL) + GROUP BY LanguageCode + ORDER BY COUNT(LanguageCode) DESC") + .Map(result => result.ToList()); } } diff --git a/ErsatzTV/Pages/ChannelEditor.razor b/ErsatzTV/Pages/ChannelEditor.razor index 6407b5b0..4e079ac6 100644 --- a/ErsatzTV/Pages/ChannelEditor.razor +++ b/ErsatzTV/Pages/ChannelEditor.razor @@ -4,6 +4,8 @@ @using ErsatzTV.Application.FFmpegProfiles @using ErsatzTV.Application.FFmpegProfiles.Queries @using ErsatzTV.Application.Images.Commands +@using ErsatzTV.Application.MediaItems.Queries +@using System.Globalization @using ErsatzTV.Application.Channels @using ErsatzTV.Application.Channels.Queries @inject NavigationManager NavigationManager @@ -34,7 +36,13 @@ @profile.Name } - + + (none) + @foreach (CultureInfo culture in _availableCultures) + { + @culture.EnglishName + } +