2015-01-17 20:12:02 +00:00
|
|
|
|
using MediaBrowser.Model.Extensions;
|
2014-02-23 05:52:30 +00:00
|
|
|
|
using MediaBrowser.Controller.Entities;
|
2014-01-22 17:05:06 +00:00
|
|
|
|
using System;
|
|
|
|
|
using System.Globalization;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Text;
|
|
|
|
|
|
|
|
|
|
namespace MediaBrowser.Server.Implementations.FileOrganization
|
|
|
|
|
{
|
|
|
|
|
public static class NameUtils
|
|
|
|
|
{
|
|
|
|
|
private static readonly CultureInfo UsCulture = new CultureInfo("en-US");
|
|
|
|
|
|
|
|
|
|
internal static Tuple<T, int> GetMatchScore<T>(string sortedName, int? year, T series)
|
|
|
|
|
where T : BaseItem
|
|
|
|
|
{
|
|
|
|
|
var score = 0;
|
|
|
|
|
|
|
|
|
|
var seriesNameWithoutYear = series.Name;
|
|
|
|
|
if (series.ProductionYear.HasValue)
|
|
|
|
|
{
|
|
|
|
|
seriesNameWithoutYear = seriesNameWithoutYear.Replace(series.ProductionYear.Value.ToString(UsCulture), String.Empty);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (IsNameMatch(sortedName, seriesNameWithoutYear))
|
|
|
|
|
{
|
|
|
|
|
score++;
|
|
|
|
|
|
|
|
|
|
if (year.HasValue && series.ProductionYear.HasValue)
|
|
|
|
|
{
|
|
|
|
|
if (year.Value == series.ProductionYear.Value)
|
|
|
|
|
{
|
|
|
|
|
score++;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
// Regardless of name, return a 0 score if the years don't match
|
|
|
|
|
return new Tuple<T, int>(series, 0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return new Tuple<T, int>(series, score);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static bool IsNameMatch(string name1, string name2)
|
|
|
|
|
{
|
|
|
|
|
name1 = GetComparableName(name1);
|
|
|
|
|
name2 = GetComparableName(name2);
|
|
|
|
|
|
|
|
|
|
return String.Equals(name1, name2, StringComparison.OrdinalIgnoreCase);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static string GetComparableName(string name)
|
|
|
|
|
{
|
|
|
|
|
// TODO: Improve this - should ignore spaces, periods, underscores, most likely all symbols and
|
|
|
|
|
// possibly remove sorting words like "the", "and", etc.
|
|
|
|
|
|
|
|
|
|
name = RemoveDiacritics(name);
|
|
|
|
|
|
2014-02-23 05:52:30 +00:00
|
|
|
|
name = " " + name + " ";
|
2014-01-22 17:05:06 +00:00
|
|
|
|
|
|
|
|
|
name = name.Replace(".", " ")
|
|
|
|
|
.Replace("_", " ")
|
2014-10-04 01:42:38 +00:00
|
|
|
|
.Replace(" and ", " ")
|
|
|
|
|
.Replace(".and.", " ")
|
2014-01-22 17:05:06 +00:00
|
|
|
|
.Replace("&", " ")
|
|
|
|
|
.Replace("!", " ")
|
|
|
|
|
.Replace("(", " ")
|
|
|
|
|
.Replace(")", " ")
|
2014-03-22 18:25:03 +00:00
|
|
|
|
.Replace(":", " ")
|
2014-01-22 17:05:06 +00:00
|
|
|
|
.Replace(",", " ")
|
|
|
|
|
.Replace("-", " ")
|
2014-09-20 15:48:23 +00:00
|
|
|
|
.Replace("'", " ")
|
|
|
|
|
.Replace("[", " ")
|
|
|
|
|
.Replace("]", " ")
|
2014-02-23 05:52:30 +00:00
|
|
|
|
.Replace(" a ", String.Empty, StringComparison.OrdinalIgnoreCase)
|
|
|
|
|
.Replace(" the ", String.Empty, StringComparison.OrdinalIgnoreCase)
|
2014-01-22 17:05:06 +00:00
|
|
|
|
.Replace(" ", String.Empty);
|
|
|
|
|
|
|
|
|
|
return name.Trim();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Removes the diacritics.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="text">The text.</param>
|
|
|
|
|
/// <returns>System.String.</returns>
|
|
|
|
|
private static string RemoveDiacritics(string text)
|
|
|
|
|
{
|
|
|
|
|
return String.Concat(
|
|
|
|
|
text.Normalize(NormalizationForm.FormD)
|
|
|
|
|
.Where(ch => CharUnicodeInfo.GetUnicodeCategory(ch) !=
|
|
|
|
|
UnicodeCategory.NonSpacingMark)
|
|
|
|
|
).Normalize(NormalizationForm.FormC);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|