From 92c76de2ba01608e37a3f7ba311d2711b2230dc8 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Mon, 20 Jan 2014 14:55:49 -0500 Subject: [PATCH] #680 - improve name comparisons --- MediaBrowser.Model/LiveTv/ChannelInfoDto.cs | 11 ++++ MediaBrowser.Model/LiveTv/ProgramInfoDto.cs | 11 ++++ MediaBrowser.Model/LiveTv/RecordingInfoDto.cs | 11 ++++ .../LiveTv/SeriesTimerInfoDto.cs | 19 +++++++ MediaBrowser.Model/LiveTv/TimerInfoDto.cs | 3 ++ .../FileOrganization/TvFileSorter.cs | 50 +++++++++++++++++-- 6 files changed, 101 insertions(+), 4 deletions(-) diff --git a/MediaBrowser.Model/LiveTv/ChannelInfoDto.cs b/MediaBrowser.Model/LiveTv/ChannelInfoDto.cs index 35045e7ef5..170d7eb734 100644 --- a/MediaBrowser.Model/LiveTv/ChannelInfoDto.cs +++ b/MediaBrowser.Model/LiveTv/ChannelInfoDto.cs @@ -1,5 +1,6 @@ using System.ComponentModel; using System.Diagnostics; +using System.Runtime.Serialization; using MediaBrowser.Model.Dto; using MediaBrowser.Model.Entities; using System; @@ -91,6 +92,16 @@ namespace MediaBrowser.Model.LiveTv /// The original primary image aspect ratio. public double? OriginalPrimaryImageAspectRatio { get; set; } + /// + /// Gets a value indicating whether this instance has primary image. + /// + /// true if this instance has primary image; otherwise, false. + [IgnoreDataMember] + public bool HasPrimaryImage + { + get { return ImageTags != null && ImageTags.ContainsKey(ImageType.Primary); } + } + public ChannelInfoDto() { ImageTags = new Dictionary(); diff --git a/MediaBrowser.Model/LiveTv/ProgramInfoDto.cs b/MediaBrowser.Model/LiveTv/ProgramInfoDto.cs index 26b5820a81..d761e88e67 100644 --- a/MediaBrowser.Model/LiveTv/ProgramInfoDto.cs +++ b/MediaBrowser.Model/LiveTv/ProgramInfoDto.cs @@ -1,5 +1,6 @@ using System.ComponentModel; using System.Diagnostics; +using System.Runtime.Serialization; using MediaBrowser.Model.Dto; using MediaBrowser.Model.Entities; using System; @@ -190,6 +191,16 @@ namespace MediaBrowser.Model.LiveTv /// true if this instance is premiere; otherwise, false. public bool IsPremiere { get; set; } + /// + /// Gets a value indicating whether this instance has primary image. + /// + /// true if this instance has primary image; otherwise, false. + [IgnoreDataMember] + public bool HasPrimaryImage + { + get { return ImageTags != null && ImageTags.ContainsKey(ImageType.Primary); } + } + public ProgramInfoDto() { Genres = new List(); diff --git a/MediaBrowser.Model/LiveTv/RecordingInfoDto.cs b/MediaBrowser.Model/LiveTv/RecordingInfoDto.cs index 969aa1b8fa..6df9ef7256 100644 --- a/MediaBrowser.Model/LiveTv/RecordingInfoDto.cs +++ b/MediaBrowser.Model/LiveTv/RecordingInfoDto.cs @@ -1,4 +1,5 @@ using System.Diagnostics; +using System.Runtime.Serialization; using MediaBrowser.Model.Dto; using MediaBrowser.Model.Entities; using System; @@ -224,6 +225,16 @@ namespace MediaBrowser.Model.LiveTv /// The user data. public UserItemDataDto UserData { get; set; } + /// + /// Gets a value indicating whether this instance has primary image. + /// + /// true if this instance has primary image; otherwise, false. + [IgnoreDataMember] + public bool HasPrimaryImage + { + get { return ImageTags != null && ImageTags.ContainsKey(ImageType.Primary); } + } + /// /// Gets or sets the type. /// diff --git a/MediaBrowser.Model/LiveTv/SeriesTimerInfoDto.cs b/MediaBrowser.Model/LiveTv/SeriesTimerInfoDto.cs index a2de3e5d87..0198cc3995 100644 --- a/MediaBrowser.Model/LiveTv/SeriesTimerInfoDto.cs +++ b/MediaBrowser.Model/LiveTv/SeriesTimerInfoDto.cs @@ -2,6 +2,8 @@ using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; +using System.Runtime.Serialization; +using MediaBrowser.Model.Entities; namespace MediaBrowser.Model.LiveTv { @@ -133,8 +135,25 @@ namespace MediaBrowser.Model.LiveTv /// true if this instance is post padding required; otherwise, false. public bool IsPostPaddingRequired { get; set; } + /// + /// Gets or sets the image tags. + /// + /// The image tags. + public Dictionary ImageTags { get; set; } + + /// + /// Gets a value indicating whether this instance has primary image. + /// + /// true if this instance has primary image; otherwise, false. + [IgnoreDataMember] + public bool HasPrimaryImage + { + get { return ImageTags != null && ImageTags.ContainsKey(ImageType.Primary); } + } + public SeriesTimerInfoDto() { + ImageTags = new Dictionary(); Days = new List(); } diff --git a/MediaBrowser.Model/LiveTv/TimerInfoDto.cs b/MediaBrowser.Model/LiveTv/TimerInfoDto.cs index 32580d3e3c..a330f44d8e 100644 --- a/MediaBrowser.Model/LiveTv/TimerInfoDto.cs +++ b/MediaBrowser.Model/LiveTv/TimerInfoDto.cs @@ -130,6 +130,9 @@ namespace MediaBrowser.Model.LiveTv /// The program information. public ProgramInfoDto ProgramInfo { get; set; } + /// + /// Occurs when a property value changes. + /// public event PropertyChangedEventHandler PropertyChanged; } } diff --git a/MediaBrowser.Server.Implementations/FileOrganization/TvFileSorter.cs b/MediaBrowser.Server.Implementations/FileOrganization/TvFileSorter.cs index 72f0da207f..e0efa0c3f2 100644 --- a/MediaBrowser.Server.Implementations/FileOrganization/TvFileSorter.cs +++ b/MediaBrowser.Server.Implementations/FileOrganization/TvFileSorter.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Common.IO; +using System.Text; +using MediaBrowser.Common.IO; using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.FileOrganization; using MediaBrowser.Controller.IO; @@ -429,9 +430,7 @@ namespace MediaBrowser.Server.Implementations.FileOrganization { var score = 0; - // TODO: Improve this - should ignore spaces, periods, underscores, most likely all symbols and - // possibly remove sorting words like "the", "and", etc. - if (string.Equals(sortedName, series.Name, StringComparison.OrdinalIgnoreCase)) + if (IsNameMatch(sortedName, series.Name)) { score++; @@ -452,6 +451,49 @@ namespace MediaBrowser.Server.Implementations.FileOrganization return new Tuple(series, score); } + private bool IsNameMatch(string name1, string name2) + { + name1 = GetComparableName(name1); + name2 = GetComparableName(name2); + + return string.Equals(name1, name2, StringComparison.OrdinalIgnoreCase); + } + + private 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); + + name = " " + name.ToLower() + " "; + + name = name.Replace(".", " ") + .Replace("_", " ") + .Replace("&", " ") + .Replace("!", " ") + .Replace(",", " ") + .Replace(" a ", string.Empty) + .Replace(" the ", string.Empty) + .Replace(" ", string.Empty); + + return name.Trim(); + } + + /// + /// Removes the diacritics. + /// + /// The text. + /// System.String. + private string RemoveDiacritics(string text) + { + return string.Concat( + text.Normalize(NormalizationForm.FormD) + .Where(ch => CharUnicodeInfo.GetUnicodeCategory(ch) != + UnicodeCategory.NonSpacingMark) + ).Normalize(NormalizationForm.FormC); + } + /// /// Deletes the left over files. ///