using System.Globalization;
using MediaBrowser.Controller.Configuration;
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 void TryAdd(Dictionary dictionary, TKey key, TValue value)
{
if (dictionary.ContainsKey(key))
{
return;
}
dictionary.Add(key, value);
}
///
/// 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);
//}
}
}