diff --git a/MediaBrowser.Providers/TV/RemoteEpisodeProvider.cs b/MediaBrowser.Providers/TV/RemoteEpisodeProvider.cs index ddc7c8e7d8..eb79075ffc 100644 --- a/MediaBrowser.Providers/TV/RemoteEpisodeProvider.cs +++ b/MediaBrowser.Providers/TV/RemoteEpisodeProvider.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Text.RegularExpressions; using System.Xml.Linq; using MediaBrowser.Common.Extensions; using MediaBrowser.Common.Net; @@ -313,9 +314,17 @@ namespace MediaBrowser.Providers.TV if (actors != null) { // Sometimes tvdb actors have leading spaces - foreach (var person in actors.Split(new[] {'|'}, StringSplitOptions.RemoveEmptyEntries) - .Where(i => !string.IsNullOrWhiteSpace(i)) - .Select(str => new PersonInfo {Type = PersonType.GuestStar, Name = str.Trim()})) + var persons = Regex.Matches(actors, @"([^|()]|\([^)]*\)*)+") + .Cast() + .Select(m => m.Value).Where(i => !string.IsNullOrWhiteSpace(i) && !string.IsNullOrEmpty(i)); + foreach (var person in persons.Select(str => { + var nameGroup = str.Split(new[] {'('}, 2, StringSplitOptions.RemoveEmptyEntries); + var name = nameGroup[0].Trim(); + var roles = nameGroup.Count() > 1 ? nameGroup[1].Trim() : null; + if (roles != null) + roles = roles.EndsWith(")") ? roles.Substring(0, roles.Length - 1) : roles; + return new PersonInfo {Type = PersonType.GuestStar, Name = name, Role = roles}; + })) { episode.AddPerson(person); } @@ -325,9 +334,18 @@ namespace MediaBrowser.Providers.TV var extraActors = xmlDocument.SafeGetString("//GuestStars"); if (extraActors == null) continue; // Sometimes tvdb actors have leading spaces - foreach (var person in extraActors.Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries) - .Where(i => !string.IsNullOrWhiteSpace(i)) - .Select(str => new PersonInfo { Type = PersonType.GuestStar, Name = str.Trim() }).Where(person => !episode.People.Any(x=>x.Type == person.Type && x.Name == person.Name))) + var persons = Regex.Matches(extraActors, @"([^|()]|\([^)]*\)*)+") + .Cast() + .Select(m => m.Value).Where(i => !string.IsNullOrWhiteSpace(i) && !string.IsNullOrEmpty(i)); + foreach (var person in persons.Select(str => { + var nameGroup = str.Split(new[] {'('}, 2, StringSplitOptions.RemoveEmptyEntries); + var name = nameGroup[0].Trim(); + var roles = nameGroup.Count() > 1 ? nameGroup[1].Trim() : null; + if (roles != null) + roles = roles.EndsWith(")") ? roles.Substring(0, roles.Length - 1) : roles; + return new PersonInfo {Type = PersonType.GuestStar, Name = name, Role = roles}; + }).Where(person => !episode.People.Any(x => x.Type == person.Type && x.Name == person.Name)) + ) { episode.AddPerson(person); }