mirror of
https://github.com/jellyfin/jellyfin.git
synced 2025-12-16 14:03:03 +03:00
fixed ratings. moved them to static text files
This commit is contained in:
@@ -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
|
||||
{
|
||||
@@ -13,6 +18,37 @@ namespace MediaBrowser.Server.Implementations.Localization
|
||||
/// </summary>
|
||||
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>
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user