From 167f2d2614fb48cc8a843c0e15fa756a273f5c93 Mon Sep 17 00:00:00 2001 From: bugfixin Date: Fri, 17 Feb 2023 10:54:34 -0800 Subject: [PATCH 1/3] Show all Cast&Crew, not just Actors --- src/controllers/itemDetails/index.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/controllers/itemDetails/index.js b/src/controllers/itemDetails/index.js index f5cf971eba..90b2f3fabc 100644 --- a/src/controllers/itemDetails/index.js +++ b/src/controllers/itemDetails/index.js @@ -1804,9 +1804,7 @@ function renderSpecials(page, item, user) { } function renderCast(page, item) { - const people = (item.People || []).filter(function (p) { - return p.Type === 'Actor'; - }); + const people = item.People || []; if (!people.length) { page.querySelector('#castCollapsible').classList.add('hide'); From ebeeaa294856c283c245f00cf8f1e9942edffdee Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Wed, 8 May 2024 13:55:23 -0400 Subject: [PATCH 2/3] Fix guest stars being listed twice on details page --- src/controllers/itemDetails/index.js | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/controllers/itemDetails/index.js b/src/controllers/itemDetails/index.js index 90b2f3fabc..71aebc57a4 100644 --- a/src/controllers/itemDetails/index.js +++ b/src/controllers/itemDetails/index.js @@ -1,3 +1,4 @@ +import { PersonKind } from '@jellyfin/sdk/lib/generated-client/models/person-kind'; import { intervalToDuration } from 'date-fns'; import DOMPurify from 'dompurify'; import escapeHtml from 'escape-html'; @@ -822,8 +823,18 @@ function setInitialCollapsibleState(page, item, apiClient, context, user) { page.querySelector('#specialsCollapsible').classList.add('hide'); } - renderCast(page, item); - renderGuestCast(page, item); + const cast = []; + const guestCast = []; + (item.People || []).forEach(p => { + if (p.Type === PersonKind.GuestStar) { + guestCast.push(p); + } else { + cast.push(p); + } + }); + + renderCast(page, item, cast); + renderGuestCast(page, item, guestCast); if (item.PartCount && item.PartCount > 1) { page.querySelector('#additionalPartsCollapsible').classList.remove('hide'); @@ -1803,9 +1814,7 @@ function renderSpecials(page, item, user) { }); } -function renderCast(page, item) { - const people = item.People || []; - +function renderCast(page, item, people) { if (!people.length) { page.querySelector('#castCollapsible').classList.add('hide'); return; @@ -1825,9 +1834,7 @@ function renderCast(page, item) { }); } -function renderGuestCast(page, item) { - const people = (item.People || []).filter(p => p.Type === 'GuestStar'); - +function renderGuestCast(page, item, people) { if (!people.length) { page.querySelector('#guestCastCollapsible').classList.add('hide'); return; From f002d540a2b67489ec6798f6116b1bda40f49572 Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Wed, 8 May 2024 13:56:06 -0400 Subject: [PATCH 3/3] Fix role and type display on people cards --- src/components/cardbuilder/cardBuilder.js | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/components/cardbuilder/cardBuilder.js b/src/components/cardbuilder/cardBuilder.js index 352b38a6a1..6d0c73afe0 100644 --- a/src/components/cardbuilder/cardBuilder.js +++ b/src/components/cardbuilder/cardBuilder.js @@ -4,6 +4,7 @@ * @module components/cardBuilder/cardBuilder */ +import { PersonKind } from '@jellyfin/sdk/lib/generated-client/models/person-kind'; import escapeHtml from 'escape-html'; import browser from 'scripts/browser'; @@ -698,8 +699,26 @@ function getCardFooterText(item, apiClient, options, footerClass, progressHtml, } } - if (options.showPersonRoleOrType && item.Role) { - lines.push(globalize.translate('PersonRole', escapeHtml(item.Role))); + if (options.showPersonRoleOrType && item.Type) { + if (item.Role) { + if ([ PersonKind.Actor, PersonKind.GuestStar ].includes(item.Type)) { + // List actor roles formatted like "as Character Name" + lines.push(globalize.translate('PersonRole', escapeHtml(item.Role))); + } else if (item.Role.toLowerCase() === item.Type.toLowerCase()) { + // Role and Type are the same so use the localized Type + lines.push(escapeHtml(globalize.translate(item.Type))); + } else if (item.Role.toLowerCase().includes(item.Type.toLowerCase())) { + // Avoid duplication if the Role includes the Type (i.e. Executive Producer) + lines.push(escapeHtml(item.Role)); + } else { + // Type and Role are unique so list both (i.e. Writer | Novel) + lines.push(escapeHtml(globalize.translate(item.Type))); + lines.push(escapeHtml(item.Role)); + } + } else { + // No Role so use the localized Type + lines.push(escapeHtml(globalize.translate(item.Type))); + } } }