You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
94 lines
3.4 KiB
94 lines
3.4 KiB
import type { NormalizedOmdbData } from '../../../types';
|
|
import { createTargetHelpers, identity } from '../../../utils/objectHelpers';
|
|
import type { RawOmdbData } from './types';
|
|
|
|
const { createRequiredField, createOptionalField } =
|
|
createTargetHelpers<NormalizedOmdbData>([null, '', 'N/A']);
|
|
|
|
const stringToArray = (value: string) => value.split(', ');
|
|
const stringToNumber = (value: string) => parseInt(value, 10);
|
|
const stringToDuration = (value: string) => {
|
|
const match = /^(?<time>\d+)\smin$/.exec(value);
|
|
if (!match) {
|
|
throw new Error(`Cannot parse duration: "${value}"`);
|
|
}
|
|
|
|
// Both `groups` and `groups['time']` are guaranteed to be defined because of regex definition, but TS doesn't know that.
|
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
return stringToNumber(match.groups!['time']!);
|
|
};
|
|
const omdbRatingsToNormalizedRatings = (ratings: RawOmdbData['Ratings']) =>
|
|
ratings.map(({ Source, Value }) => ({ source: Source, value: Value }));
|
|
|
|
export const normalizeRawOmdbData = (
|
|
rawOmdbData: RawOmdbData,
|
|
): NormalizedOmdbData => {
|
|
const {
|
|
Actors,
|
|
Awards,
|
|
BoxOffice,
|
|
Country,
|
|
DVD,
|
|
Director,
|
|
Episode,
|
|
Genre,
|
|
Language: _language,
|
|
Metascore: _metascore,
|
|
Plot,
|
|
Poster,
|
|
Production: _production,
|
|
Rated,
|
|
Ratings,
|
|
Released,
|
|
Runtime,
|
|
Season,
|
|
Title,
|
|
Type,
|
|
Website,
|
|
Writer,
|
|
Year,
|
|
imdbID,
|
|
imdbRating: _imdbRating,
|
|
imdbVotes: _imdbVotes,
|
|
seriesID,
|
|
totalSeasons,
|
|
...rest
|
|
} = rawOmdbData;
|
|
|
|
const restKeys = Object.keys(rest);
|
|
if (restKeys.length) {
|
|
throw new Error(
|
|
`Unexpected fields in OMDB response: ${restKeys.join(', ')}`,
|
|
);
|
|
}
|
|
|
|
return {
|
|
...createRequiredField('actors', Actors, stringToArray),
|
|
...createOptionalField('awards', Awards, identity),
|
|
...createOptionalField('boxOffice', BoxOffice, identity),
|
|
...createOptionalField('contentRating', Rated, identity),
|
|
...createRequiredField('description', Plot, identity),
|
|
...createOptionalField('directors', Director, stringToArray),
|
|
...createRequiredField('duration', Runtime, stringToDuration),
|
|
...createOptionalField('dvdReleaseDate', DVD, identity),
|
|
...createOptionalField('episodeNumber', Episode, stringToNumber),
|
|
...createRequiredField('genres', Genre, stringToArray),
|
|
...createRequiredField('imdbId', imdbID, identity),
|
|
...createRequiredField('posterUrl', Poster, identity),
|
|
...createRequiredField('productionCountries', Country, stringToArray),
|
|
...createRequiredField('productionYear', Year, stringToNumber),
|
|
...createRequiredField(
|
|
'ratings',
|
|
Ratings,
|
|
omdbRatingsToNormalizedRatings,
|
|
),
|
|
...createRequiredField('releaseDate', Released, identity),
|
|
...createOptionalField('seasonNumber', Season, stringToNumber),
|
|
...createOptionalField('seriesImdbId', seriesID, identity),
|
|
...createRequiredField('title', Title, identity),
|
|
...createOptionalField('totalSeasons', totalSeasons, stringToNumber),
|
|
...createRequiredField('type', Type, identity),
|
|
...createOptionalField('website', Website, identity),
|
|
...createRequiredField('writers', Writer, stringToArray),
|
|
};
|
|
};
|
|
|