|
@@ -0,0 +1,281 @@
|
|
|
+import RawName from 'src/interfaces/misc/rawName';
|
|
|
+
|
|
|
+const cleanName = (rawData: RawName) => {
|
|
|
+ const {
|
|
|
+ props: {
|
|
|
+ pageProps: { aboveTheFold: main, mainColumnData: misc },
|
|
|
+ },
|
|
|
+ } = rawData;
|
|
|
+
|
|
|
+ const cleanData = {
|
|
|
+ nameId: main.id,
|
|
|
+ basic: {
|
|
|
+ id: main.id,
|
|
|
+ name: main.nameText.text,
|
|
|
+ nameSuffix: main.disambiguator?.text ?? null,
|
|
|
+ knownFor: {
|
|
|
+ title: main.knownFor.edges[0].node.title.titleText.text,
|
|
|
+ role: main.knownFor.edges[0].node.summary.principalCategory.text,
|
|
|
+ },
|
|
|
+ ...(main.primaryImage && {
|
|
|
+ poster: {
|
|
|
+ url: main.primaryImage.url,
|
|
|
+ id: main.primaryImage.id,
|
|
|
+ caption: main.primaryImage.caption.plainText,
|
|
|
+ },
|
|
|
+ }),
|
|
|
+ primaryProfessions: main.primaryProfessions.map(profession => profession.category.text),
|
|
|
+ bio: {
|
|
|
+ full: main.bio.text.plaidHtml,
|
|
|
+ short: main.bio.text.plainText.slice(0, 600),
|
|
|
+ },
|
|
|
+ birthDate: main.birthDate?.displayableProperty.value.plainText ?? null,
|
|
|
+ deathStatus: main.deathStatus,
|
|
|
+ deathDate: main.deathDate?.displayableProperty.value.plainText ?? null,
|
|
|
+ ...(main.meterRanking && {
|
|
|
+ ranking: {
|
|
|
+ position: main.meterRanking.currentRank,
|
|
|
+ change: main.meterRanking.rankChange.difference,
|
|
|
+ direction: main.meterRanking.rankChange.changeDirection,
|
|
|
+ },
|
|
|
+ }),
|
|
|
+ },
|
|
|
+ media: {
|
|
|
+ ...(main.primaryVideos.edges.length && {
|
|
|
+ trailer: {
|
|
|
+ id: main.primaryVideos.edges[0].node.id,
|
|
|
+ isMature: main.primaryVideos.edges[0].node.isMature,
|
|
|
+ thumbnail: main.primaryVideos.edges[0].node.thumbnail.url,
|
|
|
+ runtime: main.primaryVideos.edges[0].node.runtime.value,
|
|
|
+ caption: main.primaryVideos.edges[0].node.description?.value ?? null,
|
|
|
+ urls: main.primaryVideos.edges[0].node.playbackURLs.map(url => ({
|
|
|
+ resolution: url.displayName.value,
|
|
|
+ mimeType: url.mimeType,
|
|
|
+ url: url.url,
|
|
|
+ })),
|
|
|
+ },
|
|
|
+ }),
|
|
|
+ images: {
|
|
|
+ total: misc.images.total,
|
|
|
+ images: misc.images.edges.map(image => ({
|
|
|
+ id: image.node.id,
|
|
|
+ url: image.node.url,
|
|
|
+ caption: image.node.caption,
|
|
|
+ })),
|
|
|
+ },
|
|
|
+ videos: {
|
|
|
+ total: misc.videos.total,
|
|
|
+ videos: misc.videos.edges.map(video => ({
|
|
|
+ id: video.node.id,
|
|
|
+ type: video.node.contentType.displayName.value,
|
|
|
+ caption: video.node.name.value,
|
|
|
+ runtime: video.node.runtime.value,
|
|
|
+ thumbnail: video.node.thumbnail.url,
|
|
|
+ })),
|
|
|
+ },
|
|
|
+ },
|
|
|
+ accolades: {
|
|
|
+ wins: misc.wins.total,
|
|
|
+ nominations: misc.nominations.total,
|
|
|
+ ...(misc.prestigiousAwardSummary && {
|
|
|
+ awards: {
|
|
|
+ name: misc.prestigiousAwardSummary.award.text,
|
|
|
+ id: misc.prestigiousAwardSummary.award.id,
|
|
|
+ event: misc.prestigiousAwardSummary.award.event.id,
|
|
|
+ nominations: misc.prestigiousAwardSummary.nominations,
|
|
|
+ wins: misc.prestigiousAwardSummary.wins,
|
|
|
+ },
|
|
|
+ }),
|
|
|
+ },
|
|
|
+ knownFor: misc.knownFor.edges.map(item => ({
|
|
|
+ id: item.node.title.id,
|
|
|
+ title: item.node.title.titleText.text,
|
|
|
+ ...(item.node.title.primaryImage && {
|
|
|
+ poster: {
|
|
|
+ id: item.node.title.primaryImage.id,
|
|
|
+ url: item.node.title.primaryImage.url,
|
|
|
+ caption: item.node.title.primaryImage.caption.plainText,
|
|
|
+ },
|
|
|
+ }),
|
|
|
+ type: {
|
|
|
+ id: item.node.title.titleType.id,
|
|
|
+ text: item.node.title.titleType.text,
|
|
|
+ },
|
|
|
+ certificate: item.node.title.certificate?.rating ?? null,
|
|
|
+ ...(item.node.title.releaseYear && {
|
|
|
+ releaseYear: {
|
|
|
+ start: item.node.title.releaseYear.year,
|
|
|
+ end: item.node.title.releaseYear.endYear ?? null,
|
|
|
+ },
|
|
|
+ }),
|
|
|
+ runtime: item.node.title.runtime?.seconds ?? null,
|
|
|
+ ratings: {
|
|
|
+ avg: item.node.title.ratingsSummary.aggregateRating ?? null,
|
|
|
+ numVotes: item.node.title.ratingsSummary.voteCount,
|
|
|
+ },
|
|
|
+ genres: item.node.title.titleGenres.genres.map(genre => genre.genre.text),
|
|
|
+
|
|
|
+ summary: {
|
|
|
+ numEpisodes: item.node.summary.episodeCount ?? null,
|
|
|
+ years: {
|
|
|
+ start: item.node.summary.yearRange.year,
|
|
|
+ end: item.node.summary.yearRange.endYear ?? null,
|
|
|
+ },
|
|
|
+ characters: item.node.summary.principalCharacters?.map(character => character.name) ?? null,
|
|
|
+ jobs: item.node.summary.principalJobs?.map(job => job.text) ?? null,
|
|
|
+ },
|
|
|
+ })),
|
|
|
+ credits: {
|
|
|
+ total: misc.totalCredits.total,
|
|
|
+ summary: {
|
|
|
+ titleType: misc.creditSummary.titleTypeCategories.map(cat => ({
|
|
|
+ total: cat.total,
|
|
|
+ id: cat.titleTypeCategory.id,
|
|
|
+ label: cat.titleTypeCategory.text,
|
|
|
+ })),
|
|
|
+ genres: misc.creditSummary.genres.map(genre => ({
|
|
|
+ total: genre.total,
|
|
|
+ name: genre.genre.displayableProperty.value.plainText,
|
|
|
+ })),
|
|
|
+ },
|
|
|
+ released: getCredits(misc.releasedPrimaryCredits),
|
|
|
+ unreleased: getCredits<'unreleased'>(misc.unreleasedPrimaryCredits),
|
|
|
+ },
|
|
|
+ personalDetails: {
|
|
|
+ officialSites: misc.personalDetailsExternalLinks.edges.map(item => ({
|
|
|
+ name: item.node.label,
|
|
|
+ url: item.node.url,
|
|
|
+ })),
|
|
|
+ alsoKnownAs: misc.akas.edges.map(item => item.node.displayableProperty.value.plainText),
|
|
|
+ height: misc.height?.displayableProperty.value.plainText ?? null,
|
|
|
+ birth: {
|
|
|
+ location: misc.birthLocation?.text ?? null,
|
|
|
+ date: main.birthDate?.displayableProperty.value.plainText ?? null,
|
|
|
+ },
|
|
|
+ death: {
|
|
|
+ location: misc.deathLocation?.displayableProperty.value.plainText ?? null,
|
|
|
+ cause: misc.deathCause?.displayableProperty.value.plainText ?? null,
|
|
|
+ date: main.deathDate?.displayableProperty.value.plainText ?? null,
|
|
|
+ },
|
|
|
+ spouses:
|
|
|
+ misc.personalDetailsSpouses?.map(spouse => ({
|
|
|
+ name: spouse.spouse.asMarkdown.plainText,
|
|
|
+ id: spouse.spouse.name?.id ?? null,
|
|
|
+ range: spouse.timeRange.displayableProperty.value.plaidHtml,
|
|
|
+ attributes: spouse.attributes.map(attr => attr.text),
|
|
|
+ })) ?? null,
|
|
|
+ children: misc.children.edges.map(child => ({
|
|
|
+ name: child.node.relationName.displayableProperty.value.plainText,
|
|
|
+ id: child.node.relationName.name?.id ?? null,
|
|
|
+ })),
|
|
|
+ parents: misc.parents.edges.map(parent => ({
|
|
|
+ name: parent.node.relationName.displayableProperty.value.plainText,
|
|
|
+ id: parent.node.relationName.name?.id ?? null,
|
|
|
+ })),
|
|
|
+ relatives: misc.others.edges.map(relative => ({
|
|
|
+ relation: relative.node.relationshipType.text,
|
|
|
+ id: relative.node.relationName.name?.id ?? null,
|
|
|
+ name: relative.node.relationName.displayableProperty.value.plainText,
|
|
|
+ })),
|
|
|
+ otherWorks: misc.otherWorks.edges.map(work => ({
|
|
|
+ summary: work.node.category?.text ?? null,
|
|
|
+ text: work.node.text.plaidHtml,
|
|
|
+ })),
|
|
|
+ publicity: {
|
|
|
+ total: misc.publicityListings.total,
|
|
|
+ filmBiographies: misc.nameFilmBiography.total,
|
|
|
+ printBiographies: misc.namePrintBiography.total,
|
|
|
+ interviews: misc.publicityInterview.total,
|
|
|
+ articles: misc.publicityArticle.total,
|
|
|
+ magazines: misc.publicityMagazineCover.total,
|
|
|
+ pictorials: misc.publicityPictorial.total,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ didYouKnow: {
|
|
|
+ ...(misc.trivia.edges.length && {
|
|
|
+ trivia: {
|
|
|
+ total: misc.triviaTotal.total,
|
|
|
+ html: misc.trivia.edges[0].node.displayableArticle.body.plaidHtml,
|
|
|
+ },
|
|
|
+ }),
|
|
|
+ ...(misc.trademarks.edges.length && {
|
|
|
+ trademark: {
|
|
|
+ total: misc.trademarksTotal.total,
|
|
|
+ html: misc.trademarks.edges[0].node.displayableArticle.body.plaidHtml,
|
|
|
+ },
|
|
|
+ }),
|
|
|
+ ...(misc.quotes.edges.length && {
|
|
|
+ quotes: {
|
|
|
+ total: misc.quotesTotal.total,
|
|
|
+ html: misc.quotes.edges[0].node.displayableArticle.body.plaidHtml,
|
|
|
+ },
|
|
|
+ }),
|
|
|
+ nicknames: misc.nickNames.map(name => name.displayableProperty.value.plainText),
|
|
|
+ ...(misc.titleSalaries.edges.length && {
|
|
|
+ salary: {
|
|
|
+ total: misc.titleSalariesTotal.total,
|
|
|
+ value: misc.titleSalaries.edges[0].node.displayableProperty.value.plainText,
|
|
|
+ title: {
|
|
|
+ id: misc.titleSalaries.edges[0].node.title.id,
|
|
|
+ year: misc.titleSalaries.edges[0].node.title.releaseYear?.year ?? null,
|
|
|
+ text: misc.titleSalaries.edges[0].node.title.titleText.text,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ }),
|
|
|
+ },
|
|
|
+ };
|
|
|
+
|
|
|
+ return cleanData;
|
|
|
+};
|
|
|
+
|
|
|
+type RawReleased = RawName['props']['pageProps']['mainColumnData']['releasedPrimaryCredits'];
|
|
|
+type RawUnreleased = RawName['props']['pageProps']['mainColumnData']['unreleasedPrimaryCredits'];
|
|
|
+const getCredits = <T extends 'released' | 'unreleased' = 'released'>(
|
|
|
+ credits: T extends 'released' ? RawReleased : RawUnreleased
|
|
|
+) =>
|
|
|
+ credits.map(creditItem => ({
|
|
|
+ category: creditItem.category,
|
|
|
+ total: creditItem.credits.total,
|
|
|
+ titles: creditItem.credits.edges.map(item => ({
|
|
|
+ id: item.node.title.id,
|
|
|
+ title: item.node.title.titleText.text,
|
|
|
+ ...(item.node.title.primaryImage && {
|
|
|
+ poster: {
|
|
|
+ id: item.node.title.primaryImage.id,
|
|
|
+ url: item.node.title.primaryImage.url,
|
|
|
+ caption: item.node.title.primaryImage.caption.plainText,
|
|
|
+ },
|
|
|
+ }),
|
|
|
+ type: {
|
|
|
+ id: item.node.title.titleType.id,
|
|
|
+ text: item.node.title.titleType.text,
|
|
|
+ },
|
|
|
+ certificate: item.node.title.certificate?.rating ?? null,
|
|
|
+ ...(item.node.title.releaseYear && {
|
|
|
+ releaseYear: {
|
|
|
+ start: item.node.title.releaseYear.year,
|
|
|
+ end: item.node.title.releaseYear.endYear ?? null,
|
|
|
+ },
|
|
|
+ }),
|
|
|
+ runtime: item.node.title.runtime?.seconds ?? null,
|
|
|
+ ratings: {
|
|
|
+ avg: item.node.title.ratingsSummary.aggregateRating ?? null,
|
|
|
+ numVotes: item.node.title.ratingsSummary.voteCount,
|
|
|
+ },
|
|
|
+ test: JSON.stringify(item.node.title),
|
|
|
+ genres: item.node.title.titleGenres.genres.map(genre => genre.genre.text),
|
|
|
+ productionStatus: item.node.title.productionStatus.currentProductionStage.text,
|
|
|
+
|
|
|
+ summary: {
|
|
|
+ numEpisodes: item.node.episodeCredits.total,
|
|
|
+ years: {
|
|
|
+ start: item.node.episodeCredits.yearRange?.year ?? null,
|
|
|
+ end: item.node.episodeCredits.yearRange?.endYear ?? null,
|
|
|
+ },
|
|
|
+ characters: item.node.characters?.map(char => char.name) ?? null,
|
|
|
+ jobs: item.node.jobs?.map(job => job.text) ?? null,
|
|
|
+ },
|
|
|
+ })),
|
|
|
+ }));
|
|
|
+
|
|
|
+export default cleanName;
|