Browse Source

more subtitles fixes (#1823)

pull/1824/head
Jason Dove 1 year ago committed by GitHub
parent
commit
fb63116b36
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 2
      CHANGELOG.md
  2. 14
      ErsatzTV.Application/Channels/Commands/CreateChannelHandler.cs
  3. 2
      ErsatzTV.Infrastructure/Data/Repositories/MediaItemRepository.cs
  4. 2
      ErsatzTV.Infrastructure/Extensions/LanguageCodeQueryableExtensions.cs
  5. 23
      ErsatzTV.Scanner/Core/Metadata/LocalSubtitlesProvider.cs

2
CHANGELOG.md

@ -46,6 +46,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- This allows a single Plex server to connect to multiple ETV instances - This allows a single Plex server to connect to multiple ETV instances
- Include *all* language codes from media library in preferred audio and subtitle language options - Include *all* language codes from media library in preferred audio and subtitle language options
- Language codes where an English name cannot be found will be at the bottom of the list - Language codes where an English name cannot be found will be at the bottom of the list
- Fix local libraries to detect external subtitle files with unrecognized language codes
- Fix playback selection of subtitles with unrecognized language codes
### Changed ### Changed
- Remove some unnecessary API calls related to media server scanning and paging - Remove some unnecessary API calls related to media server scanning and paging

14
ErsatzTV.Application/Channels/Commands/CreateChannelHandler.cs

@ -1,5 +1,4 @@
using System.Globalization; using System.Text.RegularExpressions;
using System.Text.RegularExpressions;
using System.Threading.Channels; using System.Threading.Channels;
using ErsatzTV.Core; using ErsatzTV.Core;
using ErsatzTV.Core.Domain; using ErsatzTV.Core.Domain;
@ -39,7 +38,6 @@ public class CreateChannelHandler(
private static async Task<Validation<BaseError, Channel>> Validate(TvContext dbContext, CreateChannel request) => private static async Task<Validation<BaseError, Channel>> Validate(TvContext dbContext, CreateChannel request) =>
(ValidateName(request), await ValidateNumber(dbContext, request), (ValidateName(request), await ValidateNumber(dbContext, request),
await FFmpegProfileMustExist(dbContext, request), await FFmpegProfileMustExist(dbContext, request),
ValidatePreferredSubtitleLanguage(request),
await WatermarkMustExist(dbContext, request), await WatermarkMustExist(dbContext, request),
await FillerPresetMustExist(dbContext, request)) await FillerPresetMustExist(dbContext, request))
.Apply( .Apply(
@ -47,7 +45,6 @@ public class CreateChannelHandler(
name, name,
number, number,
ffmpegProfileId, ffmpegProfileId,
preferredSubtitleLanguageCode,
watermarkId, watermarkId,
fillerPresetId) => fillerPresetId) =>
{ {
@ -76,7 +73,7 @@ public class CreateChannelHandler(
Artwork = artwork, Artwork = artwork,
PreferredAudioLanguageCode = request.PreferredAudioLanguageCode, PreferredAudioLanguageCode = request.PreferredAudioLanguageCode,
PreferredAudioTitle = request.PreferredAudioTitle, PreferredAudioTitle = request.PreferredAudioTitle,
PreferredSubtitleLanguageCode = preferredSubtitleLanguageCode, PreferredSubtitleLanguageCode = request.PreferredSubtitleLanguageCode,
SubtitleMode = request.SubtitleMode, SubtitleMode = request.SubtitleMode,
MusicVideoCreditsMode = request.MusicVideoCreditsMode, MusicVideoCreditsMode = request.MusicVideoCreditsMode,
MusicVideoCreditsTemplate = request.MusicVideoCreditsTemplate MusicVideoCreditsTemplate = request.MusicVideoCreditsTemplate
@ -99,13 +96,6 @@ public class CreateChannelHandler(
createChannel.NotEmpty(c => c.Name) createChannel.NotEmpty(c => c.Name)
.Bind(_ => createChannel.NotLongerThan(50)(c => c.Name)); .Bind(_ => createChannel.NotLongerThan(50)(c => c.Name));
private static Validation<BaseError, string> ValidatePreferredSubtitleLanguage(CreateChannel createChannel) =>
Optional(createChannel.PreferredSubtitleLanguageCode ?? string.Empty)
.Filter(
lc => string.IsNullOrWhiteSpace(lc) || CultureInfo.GetCultures(CultureTypes.NeutralCultures).Any(
ci => string.Equals(ci.ThreeLetterISOLanguageName, lc, StringComparison.OrdinalIgnoreCase)))
.ToValidation<BaseError>("Preferred subtitle language code is invalid");
private static async Task<Validation<BaseError, string>> ValidateNumber( private static async Task<Validation<BaseError, string>> ValidateNumber(
TvContext dbContext, TvContext dbContext,
CreateChannel createChannel) CreateChannel createChannel)

2
ErsatzTV.Infrastructure/Data/Repositories/MediaItemRepository.cs

@ -217,6 +217,8 @@ public class MediaItemRepository : IMediaItemRepository
@"SELECT LanguageCode FROM @"SELECT LanguageCode FROM
(SELECT Language AS LanguageCode (SELECT Language AS LanguageCode
FROM MediaStream WHERE Language IS NOT NULL FROM MediaStream WHERE Language IS NOT NULL
UNION ALL SELECT Language AS LanguageCode
FROM Subtitle WHERE Language IS NOT NULL
UNION ALL SELECT PreferredAudioLanguageCode AS LanguageCode UNION ALL SELECT PreferredAudioLanguageCode AS LanguageCode
FROM Channel WHERE PreferredAudioLanguageCode IS NOT NULL) AS A FROM Channel WHERE PreferredAudioLanguageCode IS NOT NULL) AS A
GROUP BY LanguageCode GROUP BY LanguageCode

2
ErsatzTV.Infrastructure/Extensions/LanguageCodeQueryableExtensions.cs

@ -55,7 +55,7 @@ public static class LanguageCodeQueryableExtensions
.Filter(lc => validCodes.Contains(lc.ThreeCode1) || validCodes.Contains(lc.ThreeCode2)) .Filter(lc => validCodes.Contains(lc.ThreeCode1) || validCodes.Contains(lc.ThreeCode2))
.ToListAsync(); .ToListAsync();
var result = new System.Collections.Generic.HashSet<string>(); var result = new System.Collections.Generic.HashSet<string>(validCodes);
foreach (LanguageCode language in maybeLanguages) foreach (LanguageCode language in maybeLanguages)
{ {
if (!string.IsNullOrWhiteSpace(language.ThreeCode1)) if (!string.IsNullOrWhiteSpace(language.ThreeCode1))

23
ErsatzTV.Scanner/Core/Metadata/LocalSubtitlesProvider.cs

@ -156,6 +156,29 @@ public class LocalSubtitlesProvider : ILocalSubtitlesProvider
Option<CultureInfo> maybeCulture = languageCodes.Find( Option<CultureInfo> maybeCulture = languageCodes.Find(
ci => ci.TwoLetterISOLanguageName == language || ci.ThreeLetterISOLanguageName == language); ci => ci.TwoLetterISOLanguageName == language || ci.ThreeLetterISOLanguageName == language);
if (maybeCulture.IsNone)
{
_logger.LogDebug(
"Located {Attribute} with unknown language code {Code} at {Path}",
"External Subtitles",
language,
file);
result.Add(
new Subtitle
{
SubtitleKind = SubtitleKind.Sidecar,
Codec = codec,
Default = false,
Forced = forced,
SDH = sdh,
Language = language,
Path = saveFullPath ? file : Path.GetFileName(file),
DateAdded = DateTime.UtcNow,
DateUpdated = _localFileSystem.GetLastWriteTime(file)
});
}
foreach (CultureInfo culture in maybeCulture) foreach (CultureInfo culture in maybeCulture)
{ {
_logger.LogDebug("Located {Attribute} at {Path}", "External Subtitles", file); _logger.LogDebug("Located {Attribute} at {Path}", "External Subtitles", file);

Loading…
Cancel
Save