Skip to content

Commit

Permalink
Support hearing impaired flag for external files
Browse files Browse the repository at this point in the history
  • Loading branch information
1337joe committed Mar 11, 2022
1 parent be769a0 commit 2be7491
Show file tree
Hide file tree
Showing 6 changed files with 53 additions and 9 deletions.
12 changes: 12 additions & 0 deletions Emby.Naming/Common/NamingOptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -281,6 +281,13 @@ public NamingOptions()
"default"
};

MediaHearingImpairedFlags = new[]
{
"cc",
"hi",
"sdh"
};

EpisodeExpressions = new[]
{
// *** Begin Kodi Standard Naming
Expand Down Expand Up @@ -728,6 +735,11 @@ public NamingOptions()
/// </summary>
public string[] MediaDefaultFlags { get; set; }

/// <summary>
/// Gets or sets list of external media hearing impaired flags.
/// </summary>
public string[] MediaHearingImpairedFlags { get; set; }

/// <summary>
/// Gets or sets list of album stacking prefixes.
/// </summary>
Expand Down
12 changes: 12 additions & 0 deletions Emby.Naming/ExternalFiles/ExternalPathParser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,18 @@ public ExternalPathParser(NamingOptions namingOptions, ILocalizationManager loca
pathInfo.Language = culture.ThreeLetterISOLanguageName;
extraString = extraString.Replace(currentSlice, string.Empty, StringComparison.OrdinalIgnoreCase);
}
else if (culture != null && pathInfo.Language == "hin")
{
// Hindi language code "hi" collides with a hearing impaired flag - use as Hindi only if no other language is set
pathInfo.IsHearingImpaired = true;
pathInfo.Language = culture.ThreeLetterISOLanguageName;
extraString = extraString.Replace(currentSlice, string.Empty, StringComparison.OrdinalIgnoreCase);
}
else if (_namingOptions.MediaHearingImpairedFlags.Any(s => currentSliceWithoutSeparator.Contains(s, StringComparison.OrdinalIgnoreCase)))
{
pathInfo.IsHearingImpaired = true;
extraString = extraString.Replace(currentSlice, string.Empty, StringComparison.OrdinalIgnoreCase);
}
else
{
titleString = currentSlice + titleString;
Expand Down
10 changes: 9 additions & 1 deletion Emby.Naming/ExternalFiles/ExternalPathParserResult.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,13 @@ public class ExternalPathParserResult
/// <param name="path">Path to file.</param>
/// <param name="isDefault">Is default.</param>
/// <param name="isForced">Is forced.</param>
public ExternalPathParserResult(string path, bool isDefault = false, bool isForced = false)
/// <param name="isHearingImpaired">For the hearing impaired.</param>
public ExternalPathParserResult(string path, bool isDefault = false, bool isForced = false, bool isHearingImpaired = false)
{
Path = path;
IsDefault = isDefault;
IsForced = isForced;
IsHearingImpaired = isHearingImpaired;
}

/// <summary>
Expand Down Expand Up @@ -47,5 +49,11 @@ public ExternalPathParserResult(string path, bool isDefault = false, bool isForc
/// </summary>
/// <value><c>true</c> if this instance is forced; otherwise, <c>false</c>.</value>
public bool IsForced { get; set; }

/// <summary>
/// Gets or sets a value indicating whether this instance is for the hearing impaired.
/// </summary>
/// <value><c>true</c> if this instance is for the hearing impaired; otherwise, <c>false</c>.</value>
public bool IsHearingImpaired { get; set; }
}
}
1 change: 1 addition & 0 deletions MediaBrowser.Providers/MediaInfo/MediaInfoResolver.cs
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ public abstract class MediaInfoResolver
mediaStream.Index = startIndex++;
mediaStream.IsDefault = pathInfo.IsDefault || mediaStream.IsDefault;
mediaStream.IsForced = pathInfo.IsForced || mediaStream.IsForced;
mediaStream.IsHearingImpaired = pathInfo.IsHearingImpaired || mediaStream.IsHearingImpaired;

mediaStreams.Add(MergeMetadata(mediaStream, pathInfo));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,15 @@ public ExternalPathParserTests()
{
var englishCultureDto = new CultureDto("English", "English", "en", new[] { "eng" });
var frenchCultureDto = new CultureDto("French", "French", "fr", new[] { "fre", "fra" });
var hindiCultureDto = new CultureDto("Hindi", "Hindi", "hi", new[] { "hin" });

var localizationManager = new Mock<ILocalizationManager>(MockBehavior.Loose);
localizationManager.Setup(lm => lm.FindLanguageInfo(It.IsRegex(@"en.*", RegexOptions.IgnoreCase)))
.Returns(englishCultureDto);
localizationManager.Setup(lm => lm.FindLanguageInfo(It.IsRegex(@"fr.*", RegexOptions.IgnoreCase)))
.Returns(frenchCultureDto);
localizationManager.Setup(lm => lm.FindLanguageInfo(It.IsRegex(@"hi.*", RegexOptions.IgnoreCase)))
.Returns(hindiCultureDto);

_audioPathParser = new ExternalPathParser(new NamingOptions(), localizationManager.Object, DlnaProfileType.Audio);
_subtitlePathParser = new ExternalPathParser(new NamingOptions(), localizationManager.Object, DlnaProfileType.Subtitle);
Expand Down Expand Up @@ -89,14 +92,19 @@ public void ParseFile_SubtitleExtensionsMatched_ReturnsPath(string path)
[InlineData(".DEFAULT.FORCED", null, null, true, true)]
[InlineData(".en", null, "eng")]
[InlineData(".EN", null, "eng")]
[InlineData(".hi", null, "hin")]
[InlineData(".fr.en", "fr", "eng")]
[InlineData(".en.fr", "en", "fre")]
[InlineData(".title.en.fr", "title.en", "fre")]
[InlineData(".Title Goes Here", "Title Goes Here", null)]
[InlineData(".Title.with.Separator", "Title.with.Separator", null)]
[InlineData(".title.en.default.forced", "title", "eng", true, true)]
[InlineData(".forced.default.en.title", "title", "eng", true, true)]
public void ParseFile_ExtraTokens_ParseToValues(string tokens, string? title, string? language, bool isDefault = false, bool isForced = false)
[InlineData(".sdh.en.title", "title", "eng", false, false, true)]
[InlineData(".en.cc.title", "title", "eng", false, false, true)]
[InlineData(".hi.en.title", "title", "eng", false, false, true)]
[InlineData(".en.hi.title", "title", "eng", false, false, true)]
public void ParseFile_ExtraTokens_ParseToValues(string tokens, string? title, string? language, bool isDefault = false, bool isForced = false, bool isHearingImpaired = false)
{
var path = "My.Video" + tokens + ".srt";

Expand All @@ -107,5 +115,6 @@ public void ParseFile_ExtraTokens_ParseToValues(string tokens, string? title, st
Assert.Equal(language, actual.Language);
Assert.Equal(isDefault, actual.IsDefault);
Assert.Equal(isForced, actual.IsForced);
Assert.Equal(isHearingImpaired, actual.IsHearingImpaired);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,7 @@ public async void GetExternalStreams_BadPaths_ReturnsNoSubtitles(string path)
});

// filename has metadata
file = "My.Video.Title1.default.forced.en.srt";
file = "My.Video.Title1.default.forced.sdh.en.srt";
data.Add(
file,
new[]
Expand All @@ -235,7 +235,7 @@ public async void GetExternalStreams_BadPaths_ReturnsNoSubtitles(string path)
},
new[]
{
CreateMediaStream(VideoDirectoryPath + "/" + file, "eng", "Title1", 0, true, true)
CreateMediaStream(VideoDirectoryPath + "/" + file, "eng", "Title1", 0, true, true, true)
});

// single stream with metadata
Expand All @@ -244,15 +244,15 @@ public async void GetExternalStreams_BadPaths_ReturnsNoSubtitles(string path)
file,
new[]
{
CreateMediaStream(VideoDirectoryPath + "/" + file, "eng", "Title", 0, true, true)
CreateMediaStream(VideoDirectoryPath + "/" + file, "eng", "Title", 0, true, true, true)
},
new[]
{
CreateMediaStream(VideoDirectoryPath + "/" + file, "eng", "Title", 0, true, true)
CreateMediaStream(VideoDirectoryPath + "/" + file, "eng", "Title", 0, true, true, true)
});

// stream wins for title/language, filename wins for flags when conflicting
file = "My.Video.Title2.default.forced.en.srt";
file = "My.Video.Title2.default.forced.sdh.en.srt";
data.Add(
file,
new[]
Expand All @@ -261,7 +261,7 @@ public async void GetExternalStreams_BadPaths_ReturnsNoSubtitles(string path)
},
new[]
{
CreateMediaStream(VideoDirectoryPath + "/" + file, "fra", "Metadata", 0, true, true)
CreateMediaStream(VideoDirectoryPath + "/" + file, "fra", "Metadata", 0, true, true, true)
});

// multiple stream with metadata - filename flags ignored but other data filled in when missing from stream
Expand Down Expand Up @@ -323,6 +323,7 @@ public async void GetExternalStreams_MergeMetadata_HandlesOverridesCorrectly(str
Assert.Equal(expected.Path, actual.Path);
Assert.Equal(expected.IsDefault, actual.IsDefault);
Assert.Equal(expected.IsForced, actual.IsForced);
Assert.Equal(expected.IsHearingImpaired, actual.IsHearingImpaired);
Assert.Equal(expected.Language, actual.Language);
Assert.Equal(expected.Title, actual.Title);
}
Expand Down Expand Up @@ -392,7 +393,7 @@ List<MediaStream> GenerateMediaStreams()
}
}

private static MediaStream CreateMediaStream(string path, string? language, string? title, int index, bool isForced = false, bool isDefault = false)
private static MediaStream CreateMediaStream(string path, string? language, string? title, int index, bool isForced = false, bool isDefault = false, bool isHearingImpaired = false)
{
return new MediaStream
{
Expand All @@ -401,6 +402,7 @@ private static MediaStream CreateMediaStream(string path, string? language, stri
Path = path,
IsDefault = isDefault,
IsForced = isForced,
IsHearingImpaired = isHearingImpaired,
Language = language,
Title = title
};
Expand Down

0 comments on commit 2be7491

Please sign in to comment.