diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index 805cb7bdfa..eca0ea4629 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -31,6 +31,7 @@ namespace MediaBrowser.Controller.Entities Studios = new List(); People = new List(); CriticReviews = new List(); + Taglines = new List(); } /// @@ -880,10 +881,10 @@ namespace MediaBrowser.Controller.Entities OfficialRating = null; CustomRating = null; Overview = null; - Taglines = null; + Taglines.Clear(); Language = null; - Studios = null; - Genres = null; + Studios.Clear(); + Genres.Clear(); CommunityRating = null; RunTimeTicks = null; AspectRatio = null; @@ -1052,24 +1053,6 @@ namespace MediaBrowser.Controller.Entities return (DateTime.UtcNow - DateCreated).TotalDays < ConfigurationManager.Configuration.RecentItemDays; } - /// - /// Adds people to the item - /// - /// The people. - /// - public void AddPeople(IEnumerable people) - { - if (people == null) - { - throw new ArgumentNullException(); - } - - foreach (var person in people) - { - AddPerson(person); - } - } - /// /// Adds a person to the item /// @@ -1087,12 +1070,6 @@ namespace MediaBrowser.Controller.Entities throw new ArgumentNullException(); } - if (People == null) - { - People = new List { person }; - return; - } - // If the type is GuestStar and there's already an Actor entry, then update it to avoid dupes if (string.Equals(person.Type, PersonType.GuestStar, StringComparison.OrdinalIgnoreCase)) { @@ -1123,24 +1100,6 @@ namespace MediaBrowser.Controller.Entities } } - /// - /// Adds studios to the item - /// - /// The studios. - /// - public void AddStudios(IEnumerable studios) - { - if (studios == null) - { - throw new ArgumentNullException(); - } - - foreach (var name in studios) - { - AddStudio(name); - } - } - /// /// Adds a studio to the item /// @@ -1153,11 +1112,6 @@ namespace MediaBrowser.Controller.Entities throw new ArgumentNullException("name"); } - if (Studios == null) - { - Studios = new List(); - } - if (!Studios.Contains(name, StringComparer.OrdinalIgnoreCase)) { Studios.Add(name); @@ -1176,11 +1130,6 @@ namespace MediaBrowser.Controller.Entities throw new ArgumentNullException("name"); } - if (Taglines == null) - { - Taglines = new List(); - } - if (!Taglines.Contains(name, StringComparer.OrdinalIgnoreCase)) { Taglines.Add(name); @@ -1222,11 +1171,6 @@ namespace MediaBrowser.Controller.Entities throw new ArgumentNullException("name"); } - if (Genres == null) - { - Genres = new List(); - } - if (!Genres.Contains(name, StringComparer.OrdinalIgnoreCase)) { Genres.Add(name); @@ -1256,24 +1200,6 @@ namespace MediaBrowser.Controller.Entities } } - /// - /// Adds genres to the item - /// - /// The genres. - /// - public void AddGenres(IEnumerable genres) - { - if (genres == null) - { - throw new ArgumentNullException(); - } - - foreach (var name in genres) - { - AddGenre(name); - } - } - /// /// Marks the item as either played or unplayed /// diff --git a/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs b/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs index 36fa7c4a81..48281b6a96 100644 --- a/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs +++ b/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs @@ -58,6 +58,11 @@ namespace MediaBrowser.Controller.Providers ValidationType = ValidationType.None }; + item.Taglines.Clear(); + item.Studios.Clear(); + item.Genres.Clear(); + item.People.Clear(); + // Use XmlReader for best performance using (var reader = XmlReader.Create(metadataFile, settings)) { @@ -496,7 +501,10 @@ namespace MediaBrowser.Controller.Providers { case "Person": { - item.AddPeople(GetPersonsFromXmlNode(reader.ReadSubtree())); + foreach (var person in GetPersonsFromXmlNode(reader.ReadSubtree())) + { + item.AddPerson(person); + } break; } diff --git a/MediaBrowser.Controller/Providers/MediaInfo/FFProbeAudioInfoProvider.cs b/MediaBrowser.Controller/Providers/MediaInfo/FFProbeAudioInfoProvider.cs index da4250d797..d55388acc1 100644 --- a/MediaBrowser.Controller/Providers/MediaInfo/FFProbeAudioInfoProvider.cs +++ b/MediaBrowser.Controller/Providers/MediaInfo/FFProbeAudioInfoProvider.cs @@ -171,7 +171,12 @@ namespace MediaBrowser.Controller.Providers.MediaInfo val.Split(new[] {'/', '|'}, StringSplitOptions.RemoveEmptyEntries) .Where(i => !string.Equals(i, audio.Artist, StringComparison.OrdinalIgnoreCase) && !string.Equals(i, audio.AlbumArtist, StringComparison.OrdinalIgnoreCase)); - audio.AddStudios(studios); + audio.Studios.Clear(); + + foreach (var studio in studios) + { + audio.AddStudio(studio); + } } } @@ -186,7 +191,12 @@ namespace MediaBrowser.Controller.Providers.MediaInfo if (!string.IsNullOrEmpty(val)) { - audio.AddGenres(val.Split(new[] { '/', '|' }, StringSplitOptions.RemoveEmptyEntries)); + audio.Genres.Clear(); + + foreach (var genre in val.Split(new[] { '/', '|' }, StringSplitOptions.RemoveEmptyEntries)) + { + audio.AddGenre(genre); + } } } diff --git a/MediaBrowser.Controller/Providers/Movies/MovieDbProvider.cs b/MediaBrowser.Controller/Providers/Movies/MovieDbProvider.cs index 69023c339c..d750c335af 100644 --- a/MediaBrowser.Controller/Providers/Movies/MovieDbProvider.cs +++ b/MediaBrowser.Controller/Providers/Movies/MovieDbProvider.cs @@ -909,7 +909,12 @@ namespace MediaBrowser.Controller.Providers.Movies movie.Budget = movieData.budget; movie.Revenue = movieData.revenue; - if (!string.IsNullOrEmpty(movieData.tagline)) movie.AddTagline(movieData.tagline); + if (!string.IsNullOrEmpty(movieData.tagline)) + { + movie.Taglines.Clear(); + movie.AddTagline(movieData.tagline); + } + movie.SetProviderId(MetadataProviders.Imdb, movieData.imdb_id); float rating; string voteAvg = movieData.vote_average.ToString(CultureInfo.InvariantCulture); @@ -957,16 +962,27 @@ namespace MediaBrowser.Controller.Providers.Movies //studios if (movieData.production_companies != null) { - //always clear so they don't double up - movie.AddStudios(movieData.production_companies.Select(c => c.name)); + movie.Studios.Clear(); + + foreach (var studio in movieData.production_companies.Select(c => c.name)) + { + movie.AddStudio(studio); + } } //genres if (movieData.genres != null) { - movie.AddGenres(movieData.genres.Select(g => g.name)); + movie.Genres.Clear(); + + foreach (var genre in movieData.genres.Select(g => g.name)) + { + movie.AddGenre(genre); + } } + movie.People.Clear(); + //Actors, Directors, Writers - all in People //actors come from cast if (movieData.cast != null) diff --git a/MediaBrowser.Controller/Providers/Music/LastfmHelper.cs b/MediaBrowser.Controller/Providers/Music/LastfmHelper.cs index 1a4cf407bf..52dfeb9f2d 100644 --- a/MediaBrowser.Controller/Providers/Music/LastfmHelper.cs +++ b/MediaBrowser.Controller/Providers/Music/LastfmHelper.cs @@ -61,6 +61,8 @@ namespace MediaBrowser.Controller.Providers.Music private static void AddGenres(BaseItem item, LastfmTags tags) { + item.Genres.Clear(); + foreach (var tag in tags.tag) { if (!string.IsNullOrEmpty(tag.name)) diff --git a/MediaBrowser.Controller/Providers/TV/RemoteEpisodeProvider.cs b/MediaBrowser.Controller/Providers/TV/RemoteEpisodeProvider.cs index 74cb1bfd4b..ba3df07b40 100644 --- a/MediaBrowser.Controller/Providers/TV/RemoteEpisodeProvider.cs +++ b/MediaBrowser.Controller/Providers/TV/RemoteEpisodeProvider.cs @@ -260,24 +260,35 @@ namespace MediaBrowser.Controller.Providers.TV episode.ProductionYear = airDate.Year; } + episode.People.Clear(); + var actors = doc.SafeGetString("//GuestStars"); if (actors != null) { - episode.AddPeople(actors.Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries).Select(str => new PersonInfo { Type = PersonType.GuestStar, Name = str })); + foreach (var person in actors.Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries).Select(str => new PersonInfo { Type = PersonType.GuestStar, Name = str })) + { + episode.AddPerson(person); + } } var directors = doc.SafeGetString("//Director"); if (directors != null) { - episode.AddPeople(directors.Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries).Select(str => new PersonInfo { Type = PersonType.Director, Name = str })); + foreach (var person in actors.Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries).Select(str => new PersonInfo { Type = PersonType.Director, Name = str })) + { + episode.AddPerson(person); + } } var writers = doc.SafeGetString("//Writer"); if (writers != null) { - episode.AddPeople(writers.Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries).Select(str => new PersonInfo { Type = PersonType.Writer, Name = str })); + foreach (var person in actors.Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries).Select(str => new PersonInfo { Type = PersonType.Writer, Name = str })) + { + episode.AddPerson(person); + } } if (ConfigurationManager.Configuration.SaveLocalMeta) diff --git a/MediaBrowser.Controller/Providers/TV/RemoteSeriesProvider.cs b/MediaBrowser.Controller/Providers/TV/RemoteSeriesProvider.cs index 5a68981bf5..0b35b561bf 100644 --- a/MediaBrowser.Controller/Providers/TV/RemoteSeriesProvider.cs +++ b/MediaBrowser.Controller/Providers/TV/RemoteSeriesProvider.cs @@ -232,8 +232,16 @@ namespace MediaBrowser.Controller.Providers.TV } string s = doc.SafeGetString("//Network"); + if (!string.IsNullOrWhiteSpace(s)) - series.AddStudios(new List(s.Trim().Split('|'))); + { + series.Studios.Clear(); + + foreach (var studio in s.Trim().Split('|')) + { + series.AddStudio(studio); + } + } series.OfficialRating = doc.SafeGetString("//ContentRating"); @@ -244,7 +252,12 @@ namespace MediaBrowser.Controller.Providers.TV string[] genres = g.Trim('|').Split('|'); if (g.Length > 0) { - series.AddGenres(genres); + series.Genres.Clear(); + + foreach (var genre in genres) + { + series.AddGenre(genre); + } } } @@ -305,7 +318,11 @@ namespace MediaBrowser.Controller.Providers.TV } var xmlNodeList = docActors.SelectNodes("Actors/Actor"); + if (xmlNodeList != null) + { + series.People.Clear(); + foreach (XmlNode p in xmlNodeList) { string actorName = p.SafeGetString("Name"); @@ -329,6 +346,7 @@ namespace MediaBrowser.Controller.Providers.TV } } + } } }