UNPKG

identify-media

Version:

Analyse file path and content to make search criteria for media APIs

79 lines (70 loc) 2.53 kB
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