identify-media
Version:
Analyse file path and content to make search criteria for media APIs
79 lines (70 loc) • 2.53 kB
text/typescript
import {AnalysedMedia, isAnalysedMovie, isAnalysedTVShow} from "../../lib/analyseFilePath";
import {
isTmdbMovieResult,
TmdbFindResponse,
TmdbMovieResult,
TmdbSearchQuery,
TmdbSearchResponse,
TmdbTVShowResult
} from "./types";
import {Media, Movie, TVShow} from "../index";
export const mapAnalysedMedia = (media: AnalysedMedia, language?: string, page?: number): TmdbSearchQuery => {
if (typeof media === 'string') return {query: media, language, page};
if (isAnalysedMovie(media) || isAnalysedTVShow(media)) return {query: media.name, type: media.type, year: media.year, language, page};
throw new Error('media of unknown type: ' + JSON.stringify(media));
}
interface TmdbImages {
poster_path?: string | null;
backdrop_path?: string | null;
}
const makeImages = (images: TmdbImages): Record<string, string> => {
const retval = {} as Record<string, string>;
if (!!images.poster_path) {
retval['tmdb-poster'] = images.poster_path;
}
if (!!images.backdrop_path) {
retval['tmdb-backdrop'] = images.backdrop_path;
}
return retval;
}
const mapMovieResult = (result: TmdbMovieResult): Movie => ({
type: 'movie',
tmdbId: result.id,
title: result.title,
release: result.release_date,
mediaInfo: {
plot: result.overview,
images: makeImages(result),
}
});
const mapTvResult = (result: TmdbTVShowResult): TVShow => ({
type: 'tv',
tmdbId: result.id,
name: result.name,
firstAirDate: result.first_air_date,
mediaInfo: {
plot: result.overview,
images: makeImages(result),
}
});
export const mapSearchResult = (result: TmdbSearchResponse): Media[] => {
if (result.results.length === 0) throw new Error('No search result');
return result.results.map((result) => {
if (isTmdbMovieResult(result)) {
return mapMovieResult(result);
} else {
return mapTvResult(result);
}
})
}
export const mapFindResult = (result: TmdbFindResponse): Media[] => {
if ((result.tv_results?.length || 0) + (result.movie_results?.length || 0) === 0) throw new Error('No find result');
return (result.tv_results?.map(mapTvResult) || [] as Media[])
.concat(result.movie_results?.map(mapMovieResult) || []);
}
export const isSameQuery = (a: TmdbSearchQuery, b: TmdbSearchQuery): boolean =>
a.query === b.query
&& a.type === b.type
&& a.year === b.year
&& a.page === b.page
&& a.language === b.language