diff options
Diffstat (limited to 'MediaBrowser.Server.Implementations/Localization')
5 files changed, 197 insertions, 5 deletions
diff --git a/MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs b/MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs index 8705d912f..1965531af 100644 --- a/MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs +++ b/MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs @@ -1,10 +1,15 @@ -using MediaBrowser.Controller.Localization; +using MediaBrowser.Common.IO; +using MediaBrowser.Controller.Configuration; +using MediaBrowser.Controller.Localization; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Globalization; using MoreLinq; +using System; using System.Collections.Generic; using System.Globalization; +using System.IO; using System.Linq; +using System.Threading.Tasks; namespace MediaBrowser.Server.Implementations.Localization { @@ -14,6 +19,37 @@ namespace MediaBrowser.Server.Implementations.Localization public class LocalizationManager : ILocalizationManager { /// <summary> + /// The _configuration manager + /// </summary> + private readonly IServerConfigurationManager _configurationManager; + + /// <summary> + /// The us culture + /// </summary> + private static readonly CultureInfo UsCulture = new CultureInfo("en-US"); + + /// <summary> + /// Initializes a new instance of the <see cref="LocalizationManager"/> class. + /// </summary> + /// <param name="configurationManager">The configuration manager.</param> + public LocalizationManager(IServerConfigurationManager configurationManager) + { + _configurationManager = configurationManager; + } + + /// <summary> + /// Gets the localization path. + /// </summary> + /// <value>The localization path.</value> + public string LocalizationPath + { + get + { + return Path.Combine(_configurationManager.ApplicationPaths.ProgramDataPath, "localization"); + } + } + + /// <summary> /// Gets the cultures. /// </summary> /// <returns>IEnumerable{CultureDto}.</returns> @@ -56,10 +92,125 @@ namespace MediaBrowser.Server.Implementations.Localization /// <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); + var path = GetRatingsFile(); + + return File.ReadAllLines(path).Select(i => + { + if (!string.IsNullOrWhiteSpace(i)) + { + var parts = i.Split(','); + + if (parts.Length == 2) + { + int value; + + if (int.TryParse(parts[1], NumberStyles.Integer, UsCulture, out value)) + { + return new ParentalRating { Name = parts[0], Value = value }; + } + } + } + + return null; + + }) + .Where(i => i != null) + .OrderBy(p => p.Value); + } + + /// <summary> + /// Gets the ratings file. + /// </summary> + /// <returns>System.String.</returns> + private string GetRatingsFile() + { + var countryCode = _configurationManager.Configuration.MetadataCountryCode; + + if (string.IsNullOrEmpty(countryCode)) + { + countryCode = "us"; + } + + return GetRatingsFile(countryCode).Result ?? GetRatingsFile("us").Result; + } + + /// <summary> + /// Gets the ratings file. + /// </summary> + /// <param name="countryCode">The country code.</param> + /// <returns>Task{System.String}.</returns> + private async Task<string> GetRatingsFile(string countryCode) + { + countryCode = countryCode.ToLower(); + + var path = Path.Combine(LocalizationPath, "ratings-" + countryCode + ".txt"); + + if (!File.Exists(path)) + { + // Extract embedded resource + + var type = GetType(); + var resourcePath = type.Namespace + ".Ratings." + countryCode + ".txt"; + + using (var stream = type.Assembly.GetManifestResourceStream(resourcePath)) + { + if (stream == null) + { + return null; + } + + var parentPath = Path.GetDirectoryName(path); + + if (!Directory.Exists(parentPath)) + { + Directory.CreateDirectory(parentPath); + } + + using (var fs = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.Read, StreamDefaults.DefaultFileStreamBufferSize, true)) + { + await stream.CopyToAsync(fs).ConfigureAwait(false); + } + } + } + + return path; + } + + /// <summary> + /// Gets the rating level. + /// </summary> + /// <param name="rating">The rating.</param> + /// <returns>System.Int32.</returns> + /// <exception cref="System.ArgumentNullException">rating</exception> + public int? GetRatingLevel(string rating) + { + if (string.IsNullOrEmpty(rating)) + { + throw new ArgumentNullException("rating"); + } + + var ratingsDictionary = GetParentalRatings().ToDictionary(i => i.Name); + + if (ratingsDictionary.ContainsKey(rating)) + return ratingsDictionary[rating].Value; + + var stripped = StripCountry(rating); + + if (ratingsDictionary.ContainsKey(stripped)) + return ratingsDictionary[stripped].Value; + + return null; + } + + /// <summary> + /// Strips the country. + /// </summary> + /// <param name="rating">The rating.</param> + /// <returns>System.String.</returns> + private static string StripCountry(string rating) + { + int start = rating.IndexOf('-'); + return start > 0 ? rating.Substring(start + 1) : rating; } } } diff --git a/MediaBrowser.Server.Implementations/Localization/Ratings/au.txt b/MediaBrowser.Server.Implementations/Localization/Ratings/au.txt new file mode 100644 index 000000000..a68a3f5f3 --- /dev/null +++ b/MediaBrowser.Server.Implementations/Localization/Ratings/au.txt @@ -0,0 +1,6 @@ +AU-G,1 +AU-PG,5 +AU-M,6 +AU-M15+,8 +AU-R18+,9 +AU-X18+,10
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Ratings/gb.txt b/MediaBrowser.Server.Implementations/Localization/Ratings/gb.txt new file mode 100644 index 000000000..91d9c87cd --- /dev/null +++ b/MediaBrowser.Server.Implementations/Localization/Ratings/gb.txt @@ -0,0 +1,7 @@ +GB-U,1 +GB-PG,5 +GB-12,6 +GB-12A,7 +GB-15,8 +GB-18,9 +GB-R18,15
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Ratings/nl.txt b/MediaBrowser.Server.Implementations/Localization/Ratings/nl.txt new file mode 100644 index 000000000..f69cc2bcc --- /dev/null +++ b/MediaBrowser.Server.Implementations/Localization/Ratings/nl.txt @@ -0,0 +1,6 @@ +NL-AL,1 +NL-MG6,2 +NL-6,3 +NL-9,5 +NL-12,6 +NL-16,8
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Ratings/us.txt b/MediaBrowser.Server.Implementations/Localization/Ratings/us.txt new file mode 100644 index 000000000..3f5311e0e --- /dev/null +++ b/MediaBrowser.Server.Implementations/Localization/Ratings/us.txt @@ -0,0 +1,22 @@ +G,1 +E,1 +EC,1 +TV-G,1 +TV-Y,2 +TV-Y7,3 +TV-Y7-FV,4 +PG,5 +TV-PG,5 +PG-13,7 +T,7 +TV-14,8 +R,9 +M,9 +TV-MA,9 +NC-17,10 +AO,15 +RP,15 +UR,15 +NR,15 +X,15 +XXX,100
\ No newline at end of file |
