diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index 0479259e5..4c8c7f3b7 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -1169,11 +1169,18 @@ namespace MediaBrowser.Controller.Entities if (string.Equals(person.Type, PersonType.Actor, StringComparison.OrdinalIgnoreCase)) { - // Only add actors if there isn't an existing one of type Actor or GuestStar - if (!People.Any(p => p.Name.Equals(person.Name, StringComparison.OrdinalIgnoreCase) && (p.Type.Equals(PersonType.Actor, StringComparison.OrdinalIgnoreCase) || p.Type.Equals(PersonType.GuestStar, StringComparison.OrdinalIgnoreCase)))) + // If the actor already exists without a role and we have one, fill it in + var existing = People.FirstOrDefault(p => p.Name.Equals(person.Name, StringComparison.OrdinalIgnoreCase) && (p.Type.Equals(PersonType.Actor, StringComparison.OrdinalIgnoreCase) || p.Type.Equals(PersonType.GuestStar, StringComparison.OrdinalIgnoreCase))); + if (existing == null) { + // Wasn't there - add it People.Add(person); } + else + { + // Was there, if no role and we have one - fill it in + if (string.IsNullOrWhiteSpace(existing.Role) && !string.IsNullOrWhiteSpace(person.Role)) existing.Role = person.Role; + } } else { diff --git a/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs b/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs index 48281b6a9..65ec6899f 100644 --- a/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs +++ b/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs @@ -1,4 +1,5 @@ using System.Globalization; +using System.IO; using MediaBrowser.Controller.Entities; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; @@ -281,13 +282,26 @@ namespace MediaBrowser.Controller.Providers case "Actors": { - foreach (var p in SplitNames(reader.ReadElementContentAsString()).Select(v => new PersonInfo { Name = v.Trim(), Type = PersonType.Actor })) + + var actors = reader.ReadInnerXml(); + + if (actors.Contains("<")) { - if (string.IsNullOrWhiteSpace(p.Name)) + // This is one of the mis-named "Actors" full nodes created by MB2 + // Create a reader and pass it to the persons node processor + FetchDataFromPersonsNode(new XmlTextReader(new StringReader("" + actors + "")), item); + } + else + { + // Old-style piped string + foreach (var p in SplitNames(actors).Select(v => new PersonInfo { Name = v.Trim(), Type = PersonType.Actor })) { - continue; + if (string.IsNullOrWhiteSpace(p.Name)) + { + continue; + } + item.AddPerson(p); } - item.AddPerson(p); } break; } @@ -500,6 +514,7 @@ namespace MediaBrowser.Controller.Providers switch (reader.Name) { case "Person": + case "Actor": { foreach (var person in GetPersonsFromXmlNode(reader.ReadSubtree())) { @@ -619,7 +634,7 @@ namespace MediaBrowser.Controller.Providers private IEnumerable GetPersonsFromXmlNode(XmlReader reader) { var names = new List(); - var type = string.Empty; + var type = "Actor"; // If type is not specified assume actor var role = string.Empty; reader.MoveToContent(); diff --git a/MediaBrowser.sln b/MediaBrowser.sln index eb3251f74..f9f5e9436 100644 --- a/MediaBrowser.sln +++ b/MediaBrowser.sln @@ -173,7 +173,4 @@ Global GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection - GlobalSection(Performance) = preSolution - HasPerformanceSessions = true - EndGlobalSection EndGlobal