Skip to content

Commit

Permalink
Convert Person.Type to use PersonKind enum (jellyfin#9487)
Browse files Browse the repository at this point in the history
  • Loading branch information
crobibero authored Mar 25, 2023
1 parent 7ffe44d commit 89be3aa
Show file tree
Hide file tree
Showing 26 changed files with 235 additions and 138 deletions.
20 changes: 12 additions & 8 deletions Emby.Dlna/Didl/DidlBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
using System.Xml;
using Emby.Dlna.ContentDirectory;
using Jellyfin.Data.Entities;
using Jellyfin.Data.Enums;
using MediaBrowser.Controller.Channels;
using MediaBrowser.Controller.Drawing;
using MediaBrowser.Controller.Entities;
Expand Down Expand Up @@ -870,11 +871,11 @@ private void AddPeople(BaseItem item, XmlWriter writer)

var types = new[]
{
PersonType.Director,
PersonType.Writer,
PersonType.Producer,
PersonType.Composer,
"creator"
PersonKind.Director,
PersonKind.Writer,
PersonKind.Producer,
PersonKind.Composer,
PersonKind.Creator
};

// Seeing some LG models locking up due content with large lists of people
Expand All @@ -888,10 +889,13 @@ private void AddPeople(BaseItem item, XmlWriter writer)

foreach (var actor in people)
{
var type = types.FirstOrDefault(i => string.Equals(i, actor.Type, StringComparison.OrdinalIgnoreCase) || string.Equals(i, actor.Role, StringComparison.OrdinalIgnoreCase))
?? PersonType.Actor;
var type = types.FirstOrDefault(i => i == actor.Type || string.Equals(actor.Role, i.ToString(), StringComparison.OrdinalIgnoreCase));
if (type == PersonKind.Unknown)
{
type = PersonKind.Actor;
}

AddValue(writer, "upnp", type.ToLowerInvariant(), actor.Name, NsUpnp);
AddValue(writer, "upnp", type.ToString().ToLowerInvariant(), actor.Name, NsUpnp);
}
}

Expand Down
7 changes: 4 additions & 3 deletions Emby.Server.Implementations/Data/SqliteItemRepository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5540,7 +5540,7 @@ private void InsertPeople(byte[] idBlob, List<PersonInfo> people, IDatabaseConne

statement.TryBind("@Name" + index, person.Name);
statement.TryBind("@Role" + index, person.Role);
statement.TryBind("@PersonType" + index, person.Type);
statement.TryBind("@PersonType" + index, person.Type.ToString());
statement.TryBind("@SortOrder" + index, person.SortOrder);
statement.TryBind("@ListOrder" + index, listIndex);

Expand Down Expand Up @@ -5569,9 +5569,10 @@ private PersonInfo GetPerson(IReadOnlyList<ResultSetValue> reader)
item.Role = role;
}

if (reader.TryGetString(3, out var type))
if (reader.TryGetString(3, out var type)
&& Enum.TryParse(type, true, out PersonKind personKind))
{
item.Type = type;
item.Type = personKind;
}

if (reader.TryGetInt32(4, out var sortOrder))
Expand Down
12 changes: 6 additions & 6 deletions Emby.Server.Implementations/Dto/DtoService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -523,32 +523,32 @@ private void AttachPeople(BaseItemDto dto, BaseItem item, User user = null)
var people = _libraryManager.GetPeople(item).OrderBy(i => i.SortOrder ?? int.MaxValue)
.ThenBy(i =>
{
if (i.IsType(PersonType.Actor))
if (i.IsType(PersonKind.Actor))
{
return 0;
}

if (i.IsType(PersonType.GuestStar))
if (i.IsType(PersonKind.GuestStar))
{
return 1;
}

if (i.IsType(PersonType.Director))
if (i.IsType(PersonKind.Director))
{
return 2;
}

if (i.IsType(PersonType.Writer))
if (i.IsType(PersonKind.Writer))
{
return 3;
}

if (i.IsType(PersonType.Producer))
if (i.IsType(PersonKind.Producer))
{
return 4;
}

if (i.IsType(PersonType.Composer))
if (i.IsType(PersonKind.Composer))
{
return 4;
}
Expand Down
8 changes: 2 additions & 6 deletions Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2032,7 +2032,7 @@ await writer.WriteElementStringAsync(
var people = item.Id.Equals(default) ? new List<PersonInfo>() : _libraryManager.GetPeople(item);

var directors = people
.Where(i => IsPersonType(i, PersonType.Director))
.Where(i => i.IsType(PersonKind.Director))
.Select(i => i.Name)
.ToList();

Expand All @@ -2042,7 +2042,7 @@ await writer.WriteElementStringAsync(
}

var writers = people
.Where(i => IsPersonType(i, PersonType.Writer))
.Where(i => i.IsType(PersonKind.Writer))
.Select(i => i.Name)
.Distinct(StringComparer.OrdinalIgnoreCase)
.ToList();
Expand Down Expand Up @@ -2122,10 +2122,6 @@ await writer.WriteElementStringAsync(
}
}

private static bool IsPersonType(PersonInfo person, string type)
=> string.Equals(person.Type, type, StringComparison.OrdinalIgnoreCase)
|| string.Equals(person.Role, type, StringComparison.OrdinalIgnoreCase);

private LiveTvProgram GetProgramInfoFromCache(string programId)
{
var query = new InternalItemsQuery
Expand Down
97 changes: 97 additions & 0 deletions Jellyfin.Data/Enums/PersonKind.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
namespace Jellyfin.Data.Enums;

/// <summary>
/// The person kind.
/// </summary>
public enum PersonKind
{
/// <summary>
/// An unknown person kind.
/// </summary>
Unknown,

/// <summary>
/// A person whose profession is acting on the stage, in films, or on television.
/// </summary>
Actor,

/// <summary>
/// A person who supervises the actors and other staff in a film, play, or similar production.
/// </summary>
Director,

/// <summary>
/// A person who writes music, especially as a professional occupation.
/// </summary>
Composer,

/// <summary>
/// A writer of a book, article, or document. Can also be used as a generic term for music writer if there is a lack of specificity.
/// </summary>
Writer,

/// <summary>
/// A well-known actor or other performer who appears in a work in which they do not have a regular role.
/// </summary>
GuestStar,

/// <summary>
/// A person responsible for the financial and managerial aspects of the making of a film or broadcast or for staging a play, opera, etc.
/// </summary>
Producer,

/// <summary>
/// A person who directs the performance of an orchestra or choir.
/// </summary>
Conductor,

/// <summary>
/// A person who writes the words to a song or musical.
/// </summary>
Lyricist,

/// <summary>
/// A person who adapts a musical composition for performance.
/// </summary>
Arranger,

/// <summary>
/// An audio engineer who performed a general engineering role.
/// </summary>
Engineer,

/// <summary>
/// An engineer responsible for using a mixing console to mix a recorded track into a single piece of music suitable for release.
/// </summary>
Mixer,

/// <summary>
/// A person who remixed a recording by taking one or more other tracks, substantially altering them and mixing them together with other material.
/// </summary>
Remixer,

/// <summary>
/// A person who created the material.
/// </summary>
Creator,

/// <summary>
/// A person who was the artist.
/// </summary>
Artist,

/// <summary>
/// A person who was the album artist.
/// </summary>
AlbumArtist,

/// <summary>
/// A person who was the author.
/// </summary>
Author,

/// <summary>
/// A person who was the illustrator.
/// </summary>
Illustrator,
}
23 changes: 12 additions & 11 deletions MediaBrowser.Controller/Entities/PeopleHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Jellyfin.Data.Enums;
using MediaBrowser.Model.Entities;

namespace MediaBrowser.Controller.Entities
Expand All @@ -17,38 +18,38 @@ public static void AddPerson(List<PersonInfo> people, PersonInfo person)
// Normalize
if (string.Equals(person.Role, PersonType.GuestStar, StringComparison.OrdinalIgnoreCase))
{
person.Type = PersonType.GuestStar;
person.Type = PersonKind.GuestStar;
}
else if (string.Equals(person.Role, PersonType.Director, StringComparison.OrdinalIgnoreCase))
{
person.Type = PersonType.Director;
person.Type = PersonKind.Director;
}
else if (string.Equals(person.Role, PersonType.Producer, StringComparison.OrdinalIgnoreCase))
{
person.Type = PersonType.Producer;
person.Type = PersonKind.Producer;
}
else if (string.Equals(person.Role, PersonType.Writer, StringComparison.OrdinalIgnoreCase))
{
person.Type = PersonType.Writer;
person.Type = PersonKind.Writer;
}

// 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))
if (person.Type == PersonKind.GuestStar)
{
var existing = people.FirstOrDefault(p => p.Name.Equals(person.Name, StringComparison.OrdinalIgnoreCase) && p.Type.Equals(PersonType.Actor, StringComparison.OrdinalIgnoreCase));
var existing = people.FirstOrDefault(p => p.Name.Equals(person.Name, StringComparison.OrdinalIgnoreCase) && p.Type == PersonKind.Actor);

if (existing is not null)
{
existing.Type = PersonType.GuestStar;
existing.Type = PersonKind.GuestStar;
MergeExisting(existing, person);
return;
}
}

if (string.Equals(person.Type, PersonType.Actor, StringComparison.OrdinalIgnoreCase))
if (person.Type == PersonKind.Actor)
{
// 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)));
var existing = people.FirstOrDefault(p => p.Name.Equals(person.Name, StringComparison.OrdinalIgnoreCase) && (p.Type == PersonKind.Actor || p.Type == PersonKind.GuestStar));
if (existing is null)
{
// Wasn't there - add it
Expand All @@ -68,8 +69,8 @@ public static void AddPerson(List<PersonInfo> people, PersonInfo person)
else
{
var existing = people.FirstOrDefault(p =>
string.Equals(p.Name, person.Name, StringComparison.OrdinalIgnoreCase) &&
string.Equals(p.Type, person.Type, StringComparison.OrdinalIgnoreCase));
string.Equals(p.Name, person.Name, StringComparison.OrdinalIgnoreCase)
&& p.Type == person.Type);

// Check for dupes based on the combination of Name and Type
if (existing is null)
Expand Down
9 changes: 3 additions & 6 deletions MediaBrowser.Controller/Entities/PersonInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

using System;
using System.Collections.Generic;
using Jellyfin.Data.Enums;
using MediaBrowser.Model.Entities;

namespace MediaBrowser.Controller.Entities
Expand Down Expand Up @@ -36,7 +37,7 @@ public PersonInfo()
/// Gets or sets the type.
/// </summary>
/// <value>The type.</value>
public string Type { get; set; }
public PersonKind Type { get; set; }

/// <summary>
/// Gets or sets the ascending sort order.
Expand All @@ -57,10 +58,6 @@ public override string ToString()
return Name;
}

public bool IsType(string type)
{
return string.Equals(Type, type, StringComparison.OrdinalIgnoreCase)
|| string.Equals(Role, type, StringComparison.OrdinalIgnoreCase);
}
public bool IsType(PersonKind type) => Type == type || string.Equals(type.ToString(), Role, StringComparison.OrdinalIgnoreCase);
}
}
17 changes: 7 additions & 10 deletions MediaBrowser.LocalMetadata/Parsers/BaseItemXmlParser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
using System.Text;
using System.Threading;
using System.Xml;
using Jellyfin.Data.Enums;
using Jellyfin.Extensions;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Providers;
Expand Down Expand Up @@ -370,7 +371,7 @@ protected virtual void FetchDataFromXmlNode(XmlReader reader, MetadataResult<T>

case "Director":
{
foreach (var p in SplitNames(reader.ReadElementContentAsString()).Select(v => new PersonInfo { Name = v.Trim(), Type = PersonType.Director }))
foreach (var p in SplitNames(reader.ReadElementContentAsString()).Select(v => new PersonInfo { Name = v.Trim(), Type = PersonKind.Director }))
{
if (string.IsNullOrWhiteSpace(p.Name))
{
Expand All @@ -385,7 +386,7 @@ protected virtual void FetchDataFromXmlNode(XmlReader reader, MetadataResult<T>

case "Writer":
{
foreach (var p in SplitNames(reader.ReadElementContentAsString()).Select(v => new PersonInfo { Name = v.Trim(), Type = PersonType.Writer }))
foreach (var p in SplitNames(reader.ReadElementContentAsString()).Select(v => new PersonInfo { Name = v.Trim(), Type = PersonKind.Writer }))
{
if (string.IsNullOrWhiteSpace(p.Name))
{
Expand All @@ -412,7 +413,7 @@ protected virtual void FetchDataFromXmlNode(XmlReader reader, MetadataResult<T>
else
{
// Old-style piped string
foreach (var p in SplitNames(actors).Select(v => new PersonInfo { Name = v.Trim(), Type = PersonType.Actor }))
foreach (var p in SplitNames(actors).Select(v => new PersonInfo { Name = v.Trim(), Type = PersonKind.Actor }))
{
if (string.IsNullOrWhiteSpace(p.Name))
{
Expand All @@ -428,7 +429,7 @@ protected virtual void FetchDataFromXmlNode(XmlReader reader, MetadataResult<T>

case "GuestStars":
{
foreach (var p in SplitNames(reader.ReadElementContentAsString()).Select(v => new PersonInfo { Name = v.Trim(), Type = PersonType.GuestStar }))
foreach (var p in SplitNames(reader.ReadElementContentAsString()).Select(v => new PersonInfo { Name = v.Trim(), Type = PersonKind.GuestStar }))
{
if (string.IsNullOrWhiteSpace(p.Name))
{
Expand Down Expand Up @@ -1035,7 +1036,7 @@ private void FetchFromStudiosNode(XmlReader reader, T item)
private IEnumerable<PersonInfo> GetPersonsFromXmlNode(XmlReader reader)
{
var name = string.Empty;
var type = PersonType.Actor; // If type is not specified assume actor
var type = PersonKind.Actor; // If type is not specified assume actor
var role = string.Empty;
int? sortOrder = null;

Expand All @@ -1056,11 +1057,7 @@ private IEnumerable<PersonInfo> GetPersonsFromXmlNode(XmlReader reader)
case "Type":
{
var val = reader.ReadElementContentAsString();

if (!string.IsNullOrWhiteSpace(val))
{
type = val;
}
_ = Enum.TryParse(val, true, out type);

break;
}
Expand Down
Loading

0 comments on commit 89be3aa

Please sign in to comment.