PeopleHelper.cs 3.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. #pragma warning disable CS1591
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using MediaBrowser.Model.Entities;
  6. namespace MediaBrowser.Controller.Entities
  7. {
  8. public static class PeopleHelper
  9. {
  10. public static void AddPerson(List<PersonInfo> people, PersonInfo person)
  11. {
  12. ArgumentNullException.ThrowIfNull(person);
  13. ArgumentException.ThrowIfNullOrEmpty(person.Name);
  14. // Normalize
  15. if (string.Equals(person.Role, PersonType.GuestStar, StringComparison.OrdinalIgnoreCase))
  16. {
  17. person.Type = PersonType.GuestStar;
  18. }
  19. else if (string.Equals(person.Role, PersonType.Director, StringComparison.OrdinalIgnoreCase))
  20. {
  21. person.Type = PersonType.Director;
  22. }
  23. else if (string.Equals(person.Role, PersonType.Producer, StringComparison.OrdinalIgnoreCase))
  24. {
  25. person.Type = PersonType.Producer;
  26. }
  27. else if (string.Equals(person.Role, PersonType.Writer, StringComparison.OrdinalIgnoreCase))
  28. {
  29. person.Type = PersonType.Writer;
  30. }
  31. // If the type is GuestStar and there's already an Actor entry, then update it to avoid dupes
  32. if (string.Equals(person.Type, PersonType.GuestStar, StringComparison.OrdinalIgnoreCase))
  33. {
  34. var existing = people.FirstOrDefault(p => p.Name.Equals(person.Name, StringComparison.OrdinalIgnoreCase) && p.Type.Equals(PersonType.Actor, StringComparison.OrdinalIgnoreCase));
  35. if (existing is not null)
  36. {
  37. existing.Type = PersonType.GuestStar;
  38. MergeExisting(existing, person);
  39. return;
  40. }
  41. }
  42. if (string.Equals(person.Type, PersonType.Actor, StringComparison.OrdinalIgnoreCase))
  43. {
  44. // If the actor already exists without a role and we have one, fill it in
  45. 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)));
  46. if (existing is null)
  47. {
  48. // Wasn't there - add it
  49. people.Add(person);
  50. }
  51. else
  52. {
  53. // Was there, if no role and we have one - fill it in
  54. if (string.IsNullOrEmpty(existing.Role) && !string.IsNullOrEmpty(person.Role))
  55. {
  56. existing.Role = person.Role;
  57. }
  58. MergeExisting(existing, person);
  59. }
  60. }
  61. else
  62. {
  63. var existing = people.FirstOrDefault(p =>
  64. string.Equals(p.Name, person.Name, StringComparison.OrdinalIgnoreCase) &&
  65. string.Equals(p.Type, person.Type, StringComparison.OrdinalIgnoreCase));
  66. // Check for dupes based on the combination of Name and Type
  67. if (existing is null)
  68. {
  69. people.Add(person);
  70. }
  71. else
  72. {
  73. MergeExisting(existing, person);
  74. }
  75. }
  76. }
  77. private static void MergeExisting(PersonInfo existing, PersonInfo person)
  78. {
  79. existing.SortOrder = person.SortOrder ?? existing.SortOrder;
  80. existing.ImageUrl = person.ImageUrl ?? existing.ImageUrl;
  81. foreach (var id in person.ProviderIds)
  82. {
  83. existing.SetProviderId(id.Key, id.Value);
  84. }
  85. }
  86. }
  87. }