diff options
| author | Luke Pulverenti <luke.pulverenti@gmail.com> | 2013-06-06 10:33:11 -0400 |
|---|---|---|
| committer | Luke Pulverenti <luke.pulverenti@gmail.com> | 2013-06-06 10:33:11 -0400 |
| commit | 1ddc193e588f6231c327a769b580f48cba03a77f (patch) | |
| tree | 3c00a0e259828d375cf6423f664a7430e1c3825b | |
| parent | 0f33dfe7027806c82b2b792b073e825be22364f7 (diff) | |
support xbmc naming convention for subtitles
7 files changed, 159 insertions, 48 deletions
diff --git a/MediaBrowser.Api/LocalizationService.cs b/MediaBrowser.Api/LocalizationService.cs index aa01f3f13..d52f94b3c 100644 --- a/MediaBrowser.Api/LocalizationService.cs +++ b/MediaBrowser.Api/LocalizationService.cs @@ -1,10 +1,8 @@ using MediaBrowser.Controller.Localization; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Globalization; -using MoreLinq; using ServiceStack.ServiceHost; using System.Collections.Generic; -using System.Globalization; using System.Linq; namespace MediaBrowser.Api @@ -42,16 +40,27 @@ namespace MediaBrowser.Api public class LocalizationService : BaseApiService { /// <summary> + /// The _localization + /// </summary> + private readonly ILocalizationManager _localization; + + /// <summary> + /// Initializes a new instance of the <see cref="LocalizationService"/> class. + /// </summary> + /// <param name="localization">The localization.</param> + public LocalizationService(ILocalizationManager localization) + { + _localization = localization; + } + + /// <summary> /// Gets the specified request. /// </summary> /// <param name="request">The request.</param> /// <returns>System.Object.</returns> public object Get(GetParentalRatings request) { - var ratings = - Ratings.RatingsDict.Select(k => new ParentalRating { Name = k.Key, Value = k.Value }); - - var result = ratings.OrderBy(p => p.Value).Where(p => p.Value > 0).ToList(); + var result = _localization.GetParentalRatings().ToList(); return ToOptimizedResult(result); } @@ -63,22 +72,7 @@ namespace MediaBrowser.Api /// <returns>System.Object.</returns> public object Get(GetCountries request) { - var result = CultureInfo.GetCultures(CultureTypes.SpecificCultures) - - .Select(c => new RegionInfo(c.LCID)) - .OrderBy(c => c.DisplayName) - - // Try to eliminate dupes - .DistinctBy(c => c.TwoLetterISORegionName) - - .Select(c => new CountryInfo - { - Name = c.Name, - DisplayName = c.DisplayName, - TwoLetterISORegionName = c.TwoLetterISORegionName, - ThreeLetterISORegionName = c.ThreeLetterISORegionName - }) - .ToList(); + var result = _localization.GetCountries().ToList(); return ToOptimizedResult(result); } @@ -90,20 +84,7 @@ namespace MediaBrowser.Api /// <returns>System.Object.</returns> public object Get(GetCultures request) { - var result = CultureInfo.GetCultures(CultureTypes.AllCultures) - .OrderBy(c => c.DisplayName) - - // Try to eliminate dupes - .DistinctBy(c => c.TwoLetterISOLanguageName + c.ThreeLetterISOLanguageName) - - .Select(c => new CultureDto - { - Name = c.Name, - DisplayName = c.DisplayName, - ThreeLetterISOLanguageName = c.ThreeLetterISOLanguageName, - TwoLetterISOLanguageName = c.TwoLetterISOLanguageName - }) - .ToList(); + var result = _localization.GetCultures().ToList(); return ToOptimizedResult(result); } diff --git a/MediaBrowser.Controller/Localization/ILocalizationManager.cs b/MediaBrowser.Controller/Localization/ILocalizationManager.cs new file mode 100644 index 000000000..487c4a48e --- /dev/null +++ b/MediaBrowser.Controller/Localization/ILocalizationManager.cs @@ -0,0 +1,28 @@ +using MediaBrowser.Model.Entities; +using MediaBrowser.Model.Globalization; +using System.Collections.Generic; + +namespace MediaBrowser.Controller.Localization +{ + /// <summary> + /// Interface ILocalizationManager + /// </summary> + public interface ILocalizationManager + { + /// <summary> + /// Gets the cultures. + /// </summary> + /// <returns>IEnumerable{CultureDto}.</returns> + IEnumerable<CultureDto> GetCultures(); + /// <summary> + /// Gets the countries. + /// </summary> + /// <returns>IEnumerable{CountryInfo}.</returns> + IEnumerable<CountryInfo> GetCountries(); + /// <summary> + /// Gets the parental ratings. + /// </summary> + /// <returns>IEnumerable{ParentalRating}.</returns> + IEnumerable<ParentalRating> GetParentalRatings(); + } +} diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj index cdcc45622..04e0a31ac 100644 --- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj +++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj @@ -76,6 +76,7 @@ <Compile Include="Entities\MusicVideo.cs" /> <Compile Include="Library\ILibraryPostScanTask.cs" /> <Compile Include="Library\ILibraryPrescanTask.cs" /> + <Compile Include="Localization\ILocalizationManager.cs" /> <Compile Include="Providers\Movies\FanArtMovieUpdatesPrescanTask.cs" /> <Compile Include="Providers\Movies\MovieDbImagesProvider.cs" /> <Compile Include="Providers\Music\ArtistsPostScanTask.cs" /> diff --git a/MediaBrowser.Controller/Providers/MediaInfo/FFProbeVideoInfoProvider.cs b/MediaBrowser.Controller/Providers/MediaInfo/FFProbeVideoInfoProvider.cs index c95f0771f..91fd29b24 100644 --- a/MediaBrowser.Controller/Providers/MediaInfo/FFProbeVideoInfoProvider.cs +++ b/MediaBrowser.Controller/Providers/MediaInfo/FFProbeVideoInfoProvider.cs @@ -3,6 +3,7 @@ using MediaBrowser.Common.MediaInfo; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Movies; +using MediaBrowser.Controller.Localization; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; using MediaBrowser.Model.MediaInfo; @@ -21,7 +22,7 @@ namespace MediaBrowser.Controller.Providers.MediaInfo /// </summary> public class FFProbeVideoInfoProvider : BaseFFProbeProvider<Video> { - public FFProbeVideoInfoProvider(IIsoManager isoManager, IBlurayExaminer blurayExaminer, IJsonSerializer jsonSerializer, ILogManager logManager, IServerConfigurationManager configurationManager, IMediaEncoder mediaEncoder) + public FFProbeVideoInfoProvider(IIsoManager isoManager, IBlurayExaminer blurayExaminer, IJsonSerializer jsonSerializer, ILogManager logManager, IServerConfigurationManager configurationManager, IMediaEncoder mediaEncoder, ILocalizationManager localization) : base(logManager, configurationManager, mediaEncoder, jsonSerializer) { if (isoManager == null) @@ -34,6 +35,7 @@ namespace MediaBrowser.Controller.Providers.MediaInfo } _blurayExaminer = blurayExaminer; + _localization = localization; _isoManager = isoManager; } @@ -48,6 +50,8 @@ namespace MediaBrowser.Controller.Providers.MediaInfo /// </summary> private readonly IIsoManager _isoManager; + private readonly ILocalizationManager _localization; + /// <summary> /// Returns true or false indicating if the provider should refresh when the contents of it's directory changes /// </summary> @@ -249,25 +253,52 @@ namespace MediaBrowser.Controller.Providers.MediaInfo var startIndex = video.MediaStreams == null ? 0 : video.MediaStreams.Count; var streams = new List<MediaStream>(); + var videoFileNameWithoutExtension = Path.GetFileNameWithoutExtension(video.Path); + foreach (var file in fileSystemChildren .Where(f => !f.Attributes.HasFlag(FileAttributes.Directory) && string.Equals(Path.GetExtension(f.FullName), ".srt", StringComparison.OrdinalIgnoreCase))) { var fullName = file.FullName; - // The subtitle filename must match video filename - if (!string.Equals(Path.GetFileNameWithoutExtension(video.Path), Path.GetFileNameWithoutExtension(fullName))) + var fileNameWithoutExtension = Path.GetFileNameWithoutExtension(fullName); + + // If the subtitle file matches the video file name + if (string.Equals(videoFileNameWithoutExtension, fileNameWithoutExtension, StringComparison.OrdinalIgnoreCase)) { - continue; + streams.Add(new MediaStream + { + Index = startIndex++, + Type = MediaStreamType.Subtitle, + IsExternal = true, + Path = fullName, + Codec = "srt" + }); } - - streams.Add(new MediaStream + else if (fileNameWithoutExtension.StartsWith(videoFileNameWithoutExtension + ".", StringComparison.OrdinalIgnoreCase)) { - Index = startIndex++, - Type = MediaStreamType.Subtitle, - IsExternal = true, - Path = fullName, - Codec = "srt" - }); + // Support xbmc naming conventions - 300.spanish.srt + var language = fileNameWithoutExtension.Split('.').LastOrDefault(); + + // Try to translate to three character code + // Be flexible and check against all properties + var culture = _localization.GetCultures() + .FirstOrDefault(i => string.Equals(i.DisplayName, language, StringComparison.OrdinalIgnoreCase) || string.Equals(i.Name, language, StringComparison.OrdinalIgnoreCase) || string.Equals(i.ThreeLetterISOLanguageName, language, StringComparison.OrdinalIgnoreCase) || string.Equals(i.TwoLetterISOLanguageName, language, StringComparison.OrdinalIgnoreCase)); + + if (culture != null) + { + language = culture.ThreeLetterISOLanguageName; + } + + streams.Add(new MediaStream + { + Index = startIndex++, + Type = MediaStreamType.Subtitle, + IsExternal = true, + Path = fullName, + Codec = "srt", + Language = language + }); + } } if (video.MediaStreams == null) diff --git a/MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs b/MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs new file mode 100644 index 000000000..8705d912f --- /dev/null +++ b/MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs @@ -0,0 +1,65 @@ +using MediaBrowser.Controller.Localization; +using MediaBrowser.Model.Entities; +using MediaBrowser.Model.Globalization; +using MoreLinq; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; + +namespace MediaBrowser.Server.Implementations.Localization +{ + /// <summary> + /// Class LocalizationManager + /// </summary> + public class LocalizationManager : ILocalizationManager + { + /// <summary> + /// Gets the cultures. + /// </summary> + /// <returns>IEnumerable{CultureDto}.</returns> + public IEnumerable<CultureDto> GetCultures() + { + return CultureInfo.GetCultures(CultureTypes.AllCultures) + .OrderBy(c => c.DisplayName) + .DistinctBy(c => c.TwoLetterISOLanguageName + c.ThreeLetterISOLanguageName) + .Select(c => new CultureDto + { + Name = c.Name, + DisplayName = c.DisplayName, + ThreeLetterISOLanguageName = c.ThreeLetterISOLanguageName, + TwoLetterISOLanguageName = c.TwoLetterISOLanguageName + }); + } + + /// <summary> + /// Gets the countries. + /// </summary> + /// <returns>IEnumerable{CountryInfo}.</returns> + public IEnumerable<CountryInfo> GetCountries() + { + return CultureInfo.GetCultures(CultureTypes.SpecificCultures) + .Select(c => new RegionInfo(c.LCID)) + .OrderBy(c => c.DisplayName) + .DistinctBy(c => c.TwoLetterISORegionName) + .Select(c => new CountryInfo + { + Name = c.Name, + DisplayName = c.DisplayName, + TwoLetterISORegionName = c.TwoLetterISORegionName, + ThreeLetterISORegionName = c.ThreeLetterISORegionName + }); + } + + /// <summary> + /// Gets the parental ratings. + /// </summary> + /// <returns>IEnumerable{ParentalRating}.</returns> + public IEnumerable<ParentalRating> GetParentalRatings() + { + return Ratings.RatingsDict + .Select(k => new ParentalRating {Name = k.Key, Value = k.Value}) + .OrderBy(p => p.Value) + .Where(p => p.Value > 0); + } + } +} diff --git a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj index ca68b6fd3..60afc8413 100644 --- a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj +++ b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj @@ -138,6 +138,7 @@ <Compile Include="Library\Resolvers\TV\SeriesResolver.cs" /> <Compile Include="Library\Resolvers\VideoResolver.cs" /> <Compile Include="Library\UserManager.cs" /> + <Compile Include="Localization\LocalizationManager.cs" /> <Compile Include="MediaEncoder\MediaEncoder.cs" /> <Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Providers\ProviderManager.cs" /> diff --git a/MediaBrowser.ServerApplication/ApplicationHost.cs b/MediaBrowser.ServerApplication/ApplicationHost.cs index 9e9ab7ff3..8f40c9eea 100644 --- a/MediaBrowser.ServerApplication/ApplicationHost.cs +++ b/MediaBrowser.ServerApplication/ApplicationHost.cs @@ -35,6 +35,7 @@ using MediaBrowser.Server.Implementations.Configuration; using MediaBrowser.Server.Implementations.HttpServer; using MediaBrowser.Server.Implementations.IO; using MediaBrowser.Server.Implementations.Library; +using MediaBrowser.Server.Implementations.Localization; using MediaBrowser.Server.Implementations.MediaEncoder; using MediaBrowser.Server.Implementations.Providers; using MediaBrowser.Server.Implementations.ServerManager; @@ -284,6 +285,9 @@ namespace MediaBrowser.ServerApplication ServerManager = new ServerManager(this, JsonSerializer, Logger, ServerConfigurationManager); RegisterSingleInstance(ServerManager); + var localizationManager = new LocalizationManager(); + RegisterSingleInstance<ILocalizationManager>(localizationManager); + var displayPreferencesTask = Task.Run(async () => await ConfigureDisplayPreferencesRepositories().ConfigureAwait(false)); var itemsTask = Task.Run(async () => await ConfigureItemRepositories().ConfigureAwait(false)); var userdataTask = Task.Run(async () => await ConfigureUserDataRepositories().ConfigureAwait(false)); |
