using MediaBrowser.Common.Extensions; using MediaBrowser.Controller.Configuration; using MediaBrowser.Model.Logging; using System.Collections.Generic; using System.IO; using System.Linq; namespace MediaBrowser.Controller.Localization { /// /// Class Ratings /// public static class Ratings { public static IServerConfigurationManager ConfigurationManager; /// /// The ratings def /// private static RatingsDefinition ratingsDef; /// /// The _ratings dict /// private static Dictionary _ratingsDict; /// /// Gets the ratings dict. /// /// The ratings dict. public static Dictionary RatingsDict { get { return _ratingsDict ?? (_ratingsDict = Initialize(false, ConfigurationManager)); } } /// /// The ratings strings /// private static readonly Dictionary ratingsStrings = new Dictionary(); /// /// Tries the add. /// /// The type of the T key. /// The type of the T value. /// The dictionary. /// The key. /// The value. /// true if XXXX, false otherwise private static bool TryAdd(Dictionary dictionary, TKey key, TValue value) { if (dictionary.ContainsKey(key)) { return false; } dictionary.Add(key, value); return true; } /// /// Initializes the specified block unrated. /// /// if set to true [block unrated]. /// Dictionary{System.StringSystem.Int32}. public static Dictionary Initialize(bool blockUnrated, IServerConfigurationManager configurationManager) { //build our ratings dictionary from the combined local one and us one ratingsDef = new RatingsDefinition(Path.Combine(configurationManager.ApplicationPaths.LocalizationPath, "Ratings-" + configurationManager.Configuration.MetadataCountryCode + ".txt"), configurationManager); //global value of None var dict = new Dictionary {{"None", -1}}; foreach (var pair in ratingsDef.RatingsDict) { TryAdd(dict, pair.Key, pair.Value); } if (configurationManager.Configuration.MetadataCountryCode.ToUpper() != "US") { foreach (var pair in new USRatingsDictionary()) { TryAdd(dict, pair.Key, pair.Value); } } //global values of CS TryAdd(dict, "CS", 1000); TryAdd(dict, "", blockUnrated ? 1000 : 0); //and rating reverse lookup dictionary (non-redundant ones) ratingsStrings.Clear(); var lastLevel = -10; ratingsStrings.Add(-1,LocalizedStrings.Instance.GetString("Any")); foreach (var pair in ratingsDef.RatingsDict.OrderBy(p => p.Value)) { if (pair.Value > lastLevel) { lastLevel = pair.Value; TryAdd(ratingsStrings, pair.Value, pair.Key); } } TryAdd(ratingsStrings, 999, "CS"); return dict; } /// /// Switches the unrated. /// /// if set to true [block]. public static void SwitchUnrated(bool block) { RatingsDict.Remove(""); RatingsDict.Add("", block ? 1000 : 0); } /// /// Levels the specified rating STR. /// /// The rating STR. /// System.Int32. public static int Level(string ratingStr) { if (ratingStr == null) ratingStr = ""; if (RatingsDict.ContainsKey(ratingStr)) return RatingsDict[ratingStr]; string stripped = StripCountry(ratingStr); if (RatingsDict.ContainsKey(stripped)) return RatingsDict[stripped]; return RatingsDict[""]; //return "unknown" level } /// /// Strips the country. /// /// The rating. /// System.String. private static string StripCountry(string rating) { int start = rating.IndexOf('-'); return start > 0 ? rating.Substring(start + 1) : rating; } /// /// Returns a that represents this instance. /// /// The level. /// A that represents this instance. public static string ToString(int level) { //return the closest one while (level > 0) { if (ratingsStrings.ContainsKey(level)) return ratingsStrings[level]; level--; } return ratingsStrings.Values.FirstOrDefault(); //default to first one } /// /// To the strings. /// /// List{System.String}. public static List ToStrings() { //return the whole list of ratings strings return ratingsStrings.Values.ToList(); } /// /// To the values. /// /// List{System.Int32}. public static List ToValues() { //return the whole list of ratings values return ratingsStrings.Keys.ToList(); } //public Microsoft.MediaCenter.UI.Image RatingImage(string rating) //{ // return Helper.GetMediaInfoImage("Rated_" + rating); //} } }