diff --git a/MediaBrowser.Api/BaseApiService.cs b/MediaBrowser.Api/BaseApiService.cs index 4465be97a2..66b2a314e4 100644 --- a/MediaBrowser.Api/BaseApiService.cs +++ b/MediaBrowser.Api/BaseApiService.cs @@ -259,7 +259,7 @@ namespace MediaBrowser.Api .GetRecursiveChildren(i => i is IHasArtist) .Cast() .SelectMany(i => i.AllArtists) - .Distinct(StringComparer.OrdinalIgnoreCase) + .DistinctNames() .FirstOrDefault(i => { i = _dashReplaceChars.Aggregate(i, (current, c) => current.Replace(c, SlugChar)); @@ -281,7 +281,7 @@ namespace MediaBrowser.Api return libraryManager.RootFolder.GetRecursiveChildren() .SelectMany(i => i.Genres) - .Distinct(StringComparer.OrdinalIgnoreCase) + .DistinctNames() .FirstOrDefault(i => { i = _dashReplaceChars.Aggregate(i, (current, c) => current.Replace(c, SlugChar)); @@ -301,7 +301,7 @@ namespace MediaBrowser.Api return libraryManager.RootFolder .GetRecursiveChildren(i => i is Game) .SelectMany(i => i.Genres) - .Distinct(StringComparer.OrdinalIgnoreCase) + .DistinctNames() .FirstOrDefault(i => { i = _dashReplaceChars.Aggregate(i, (current, c) => current.Replace(c, SlugChar)); @@ -324,7 +324,7 @@ namespace MediaBrowser.Api return libraryManager.RootFolder .GetRecursiveChildren() .SelectMany(i => i.Studios) - .Distinct(StringComparer.OrdinalIgnoreCase) + .DistinctNames() .FirstOrDefault(i => { i = _dashReplaceChars.Aggregate(i, (current, c) => current.Replace(c, SlugChar)); @@ -348,7 +348,7 @@ namespace MediaBrowser.Api .GetRecursiveChildren() .SelectMany(i => i.People) .Select(i => i.Name) - .Distinct(StringComparer.OrdinalIgnoreCase) + .DistinctNames() .FirstOrDefault(i => { i = _dashReplaceChars.Aggregate(i, (current, c) => current.Replace(c, SlugChar)); diff --git a/MediaBrowser.Api/FilterService.cs b/MediaBrowser.Api/FilterService.cs index fb51b2bdd4..6d1c5d868d 100644 --- a/MediaBrowser.Api/FilterService.cs +++ b/MediaBrowser.Api/FilterService.cs @@ -76,7 +76,7 @@ namespace MediaBrowser.Api .ToArray(); result.Genres = items.SelectMany(i => i.Genres) - .Distinct(StringComparer.OrdinalIgnoreCase) + .DistinctNames() .OrderBy(i => i) .ToArray(); diff --git a/MediaBrowser.Api/Movies/MoviesService.cs b/MediaBrowser.Api/Movies/MoviesService.cs index 07f5942c62..1a7f6d8f49 100644 --- a/MediaBrowser.Api/Movies/MoviesService.cs +++ b/MediaBrowser.Api/Movies/MoviesService.cs @@ -410,7 +410,7 @@ namespace MediaBrowser.Api.Movies return items .SelectMany(i => i.People.Where(p => !string.Equals(PersonType.Director, p.Type, StringComparison.OrdinalIgnoreCase)).Take(2)) .Select(i => i.Name) - .Distinct(StringComparer.OrdinalIgnoreCase); + .DistinctNames(); } private IEnumerable GetDirectors(IEnumerable items) @@ -419,7 +419,7 @@ namespace MediaBrowser.Api.Movies .Select(i => i.People.FirstOrDefault(p => string.Equals(PersonType.Director, p.Type, StringComparison.OrdinalIgnoreCase))) .Where(i => i != null) .Select(i => i.Name) - .Distinct(StringComparer.OrdinalIgnoreCase); + .DistinctNames(); } } } diff --git a/MediaBrowser.Api/Music/AlbumsService.cs b/MediaBrowser.Api/Music/AlbumsService.cs index a1c98addbe..37f79bf208 100644 --- a/MediaBrowser.Api/Music/AlbumsService.cs +++ b/MediaBrowser.Api/Music/AlbumsService.cs @@ -79,12 +79,12 @@ namespace MediaBrowser.Api.Music var artists1 = album1 .AllArtists - .Distinct(StringComparer.OrdinalIgnoreCase) + .DistinctNames() .ToList(); var artists2 = album2 .AllArtists - .Distinct(StringComparer.OrdinalIgnoreCase) + .DistinctNames() .ToDictionary(i => i, StringComparer.OrdinalIgnoreCase); return points + artists1.Where(artists2.ContainsKey).Sum(i => 5); diff --git a/MediaBrowser.Api/SimilarItemsHelper.cs b/MediaBrowser.Api/SimilarItemsHelper.cs index e061c391a2..fb04dd0301 100644 --- a/MediaBrowser.Api/SimilarItemsHelper.cs +++ b/MediaBrowser.Api/SimilarItemsHelper.cs @@ -170,7 +170,7 @@ namespace MediaBrowser.Api points += item1.Studios.Where(i => item2.Studios.Contains(i, StringComparer.OrdinalIgnoreCase)).Sum(i => 3); var item2PeopleNames = item2.People.Select(i => i.Name) - .Distinct(StringComparer.OrdinalIgnoreCase) + .DistinctNames() .ToDictionary(i => i, StringComparer.OrdinalIgnoreCase); points += item1.People.Where(i => item2PeopleNames.ContainsKey(i.Name)).Sum(i => diff --git a/MediaBrowser.Api/UserLibrary/ArtistsService.cs b/MediaBrowser.Api/UserLibrary/ArtistsService.cs index dd9825debd..9f3f174657 100644 --- a/MediaBrowser.Api/UserLibrary/ArtistsService.cs +++ b/MediaBrowser.Api/UserLibrary/ArtistsService.cs @@ -132,7 +132,7 @@ namespace MediaBrowser.Api.UserLibrary .Where(i => !i.IsFolder) .OfType() .SelectMany(i => i.AlbumArtists) - .Distinct(StringComparer.OrdinalIgnoreCase) + .DistinctNames() .Select(name => { try @@ -152,7 +152,7 @@ namespace MediaBrowser.Api.UserLibrary .Where(i => !i.IsFolder) .OfType() .SelectMany(i => i.AllArtists) - .Distinct(StringComparer.OrdinalIgnoreCase) + .DistinctNames() .Select(name => { try diff --git a/MediaBrowser.Api/UserLibrary/GameGenresService.cs b/MediaBrowser.Api/UserLibrary/GameGenresService.cs index 3063e19c72..2f7430d333 100644 --- a/MediaBrowser.Api/UserLibrary/GameGenresService.cs +++ b/MediaBrowser.Api/UserLibrary/GameGenresService.cs @@ -105,7 +105,7 @@ namespace MediaBrowser.Api.UserLibrary return itemsList .SelectMany(i => i.Genres) - .Distinct(StringComparer.OrdinalIgnoreCase) + .DistinctNames() .Select(name => LibraryManager.GetGameGenre(name)); } } diff --git a/MediaBrowser.Api/UserLibrary/GenresService.cs b/MediaBrowser.Api/UserLibrary/GenresService.cs index c659852de8..63c0575bff 100644 --- a/MediaBrowser.Api/UserLibrary/GenresService.cs +++ b/MediaBrowser.Api/UserLibrary/GenresService.cs @@ -108,7 +108,7 @@ namespace MediaBrowser.Api.UserLibrary { return items .SelectMany(i => i.Genres) - .Distinct(StringComparer.OrdinalIgnoreCase) + .DistinctNames() .Select(name => { try diff --git a/MediaBrowser.Api/UserLibrary/MusicGenresService.cs b/MediaBrowser.Api/UserLibrary/MusicGenresService.cs index 3733128f04..1fe9dfaaa3 100644 --- a/MediaBrowser.Api/UserLibrary/MusicGenresService.cs +++ b/MediaBrowser.Api/UserLibrary/MusicGenresService.cs @@ -105,7 +105,7 @@ namespace MediaBrowser.Api.UserLibrary return itemsList .SelectMany(i => i.Genres) - .Distinct(StringComparer.OrdinalIgnoreCase) + .DistinctNames() .Select(name => LibraryManager.GetMusicGenre(name)); } } diff --git a/MediaBrowser.Api/UserLibrary/PersonsService.cs b/MediaBrowser.Api/UserLibrary/PersonsService.cs index e9b3fa402f..08ee6e462e 100644 --- a/MediaBrowser.Api/UserLibrary/PersonsService.cs +++ b/MediaBrowser.Api/UserLibrary/PersonsService.cs @@ -127,7 +127,7 @@ namespace MediaBrowser.Api.UserLibrary return allPeople .Select(i => i.Name) - .Distinct(StringComparer.OrdinalIgnoreCase) + .DistinctNames() .Select(name => { diff --git a/MediaBrowser.Api/UserLibrary/StudiosService.cs b/MediaBrowser.Api/UserLibrary/StudiosService.cs index a4ebef6846..ae1da03468 100644 --- a/MediaBrowser.Api/UserLibrary/StudiosService.cs +++ b/MediaBrowser.Api/UserLibrary/StudiosService.cs @@ -109,7 +109,7 @@ namespace MediaBrowser.Api.UserLibrary return itemsList .SelectMany(i => i.Studios) - .Distinct(StringComparer.OrdinalIgnoreCase) + .DistinctNames() .Select(name => LibraryManager.GetStudio(name)); } } diff --git a/MediaBrowser.Controller/Entities/Audio/IHasAlbumArtist.cs b/MediaBrowser.Controller/Entities/Audio/IHasAlbumArtist.cs index 56921409ae..254f90376d 100644 --- a/MediaBrowser.Controller/Entities/Audio/IHasAlbumArtist.cs +++ b/MediaBrowser.Controller/Entities/Audio/IHasAlbumArtist.cs @@ -1,6 +1,5 @@ -using System; +using MediaBrowser.Controller.Library; using System.Collections.Generic; -using System.Linq; namespace MediaBrowser.Controller.Entities.Audio { @@ -20,11 +19,11 @@ namespace MediaBrowser.Controller.Entities.Audio { public static bool HasArtist(this IHasArtist hasArtist, string artist) { - return hasArtist.Artists.Contains(artist, StringComparer.OrdinalIgnoreCase); + return NameExtensions.EqualsAny(hasArtist.Artists, artist); } public static bool HasAnyArtist(this IHasArtist hasArtist, string artist) { - return hasArtist.AllArtists.Contains(artist, StringComparer.OrdinalIgnoreCase); + return NameExtensions.EqualsAny(hasArtist.AllArtists, artist); } } } diff --git a/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs b/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs index e0c14821e9..4185590ab3 100644 --- a/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs +++ b/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs @@ -2,7 +2,6 @@ using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Entities; -using MediaBrowser.Model.Querying; using MediaBrowser.Model.Users; using System; using System.Collections.Generic; diff --git a/MediaBrowser.Controller/Entities/UserViewBuilder.cs b/MediaBrowser.Controller/Entities/UserViewBuilder.cs index c01814bce2..5e5735d34c 100644 --- a/MediaBrowser.Controller/Entities/UserViewBuilder.cs +++ b/MediaBrowser.Controller/Entities/UserViewBuilder.cs @@ -283,7 +283,7 @@ namespace MediaBrowser.Controller.Entities var tasks = GetRecursiveChildren(parent, user, new[] { CollectionType.Music, CollectionType.MusicVideos }) .Where(i => !i.IsFolder) .SelectMany(i => i.Genres) - .Distinct(StringComparer.OrdinalIgnoreCase) + .DistinctNames() .Select(i => { try @@ -313,7 +313,7 @@ namespace MediaBrowser.Controller.Entities .Where(i => i.Genres.Contains(displayParent.Name, StringComparer.OrdinalIgnoreCase)) .OfType() .SelectMany(i => i.AlbumArtists) - .Distinct(StringComparer.OrdinalIgnoreCase) + .DistinctNames() .Select(i => { try @@ -337,7 +337,7 @@ namespace MediaBrowser.Controller.Entities .Where(i => !i.IsFolder) .OfType() .SelectMany(i => i.AlbumArtists) - .Distinct(StringComparer.OrdinalIgnoreCase) + .DistinctNames() .Select(i => { try @@ -361,7 +361,7 @@ namespace MediaBrowser.Controller.Entities .Where(i => !i.IsFolder) .OfType() .SelectMany(i => i.Artists) - .Distinct(StringComparer.OrdinalIgnoreCase) + .DistinctNames() .Select(i => { try @@ -385,7 +385,7 @@ namespace MediaBrowser.Controller.Entities .Where(i => !i.IsFolder) .OfType() .SelectMany(i => i.AlbumArtists) - .Distinct(StringComparer.OrdinalIgnoreCase) + .DistinctNames() .Select(i => { try @@ -552,7 +552,7 @@ namespace MediaBrowser.Controller.Entities var tasks = GetRecursiveChildren(parent, user, new[] { CollectionType.Movies, CollectionType.BoxSets, string.Empty }) .Where(i => i is Movie) .SelectMany(i => i.Genres) - .Distinct(StringComparer.OrdinalIgnoreCase) + .DistinctNames() .Select(i => { try @@ -724,7 +724,7 @@ namespace MediaBrowser.Controller.Entities var tasks = GetRecursiveChildren(parent, user, new[] { CollectionType.TvShows, string.Empty }) .OfType() .SelectMany(i => i.Genres) - .Distinct(StringComparer.OrdinalIgnoreCase) + .DistinctNames() .Select(i => { try @@ -776,7 +776,7 @@ namespace MediaBrowser.Controller.Entities var tasks = GetRecursiveChildren(parent, user, new[] { CollectionType.Games }) .OfType() .SelectMany(i => i.Genres) - .Distinct(StringComparer.OrdinalIgnoreCase) + .DistinctNames() .Select(i => { try diff --git a/MediaBrowser.Controller/Library/NameExtensions.cs b/MediaBrowser.Controller/Library/NameExtensions.cs new file mode 100644 index 0000000000..b2acdc7ea5 --- /dev/null +++ b/MediaBrowser.Controller/Library/NameExtensions.cs @@ -0,0 +1,41 @@ +using MediaBrowser.Common.Extensions; +using MoreLinq; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace MediaBrowser.Controller.Library +{ + public static class NameExtensions + { + public static bool AreEqual(string name1, string name2) + { + name1 = NormalizeForComparison(name1); + name2 = NormalizeForComparison(name2); + + return string.Equals(name1, name2, StringComparison.OrdinalIgnoreCase); + } + + public static bool EqualsAny(IEnumerable names, string name) + { + name = NormalizeForComparison(name); + + return names.Any(i => string.Equals(NormalizeForComparison(i), name, StringComparison.OrdinalIgnoreCase)); + } + + private static string NormalizeForComparison(string name) + { + if (string.IsNullOrWhiteSpace(name)) + { + return string.Empty; + } + + return name.RemoveDiacritics(); + } + + public static IEnumerable DistinctNames(this IEnumerable names) + { + return names.DistinctBy(NormalizeForComparison, StringComparer.OrdinalIgnoreCase); + } + } +} diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj index 37b108b446..ba0c266b23 100644 --- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj +++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj @@ -186,6 +186,7 @@ + diff --git a/MediaBrowser.Providers/Music/ArtistMetadataService.cs b/MediaBrowser.Providers/Music/ArtistMetadataService.cs index 2497cc1ec7..7905293717 100644 --- a/MediaBrowser.Providers/Music/ArtistMetadataService.cs +++ b/MediaBrowser.Providers/Music/ArtistMetadataService.cs @@ -54,7 +54,7 @@ namespace MediaBrowser.Providers.Music var currentList = item.Genres.ToList(); item.Genres = taggedItems.SelectMany(i => i.Genres) - .Distinct(StringComparer.OrdinalIgnoreCase) + .DistinctNames() .ToList(); if (currentList.Count != item.Genres.Count || !currentList.OrderBy(i => i).SequenceEqual(item.Genres.OrderBy(i => i), StringComparer.OrdinalIgnoreCase)) diff --git a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs index da3c0aa9c8..2e28f1a94e 100644 --- a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs +++ b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs @@ -926,10 +926,8 @@ namespace MediaBrowser.Server.Implementations.Library if (isArtist) { - var validFilename = _fileSystem.GetValidFilename(name).Trim(); - var existing = RootFolder - .GetRecursiveChildren(i => i is T && string.Equals(_fileSystem.GetValidFilename(i.Name).Trim(), validFilename, StringComparison.OrdinalIgnoreCase)) + .GetRecursiveChildren(i => i is T && NameExtensions.AreEqual(i.Name, name)) .Cast() .FirstOrDefault(); diff --git a/MediaBrowser.Server.Implementations/Library/SearchEngine.cs b/MediaBrowser.Server.Implementations/Library/SearchEngine.cs index 51cad7a35d..72bbefae45 100644 --- a/MediaBrowser.Server.Implementations/Library/SearchEngine.cs +++ b/MediaBrowser.Server.Implementations/Library/SearchEngine.cs @@ -122,7 +122,7 @@ namespace MediaBrowser.Server.Implementations.Library var artists = items.OfType