36 lines
1.1 KiB
JavaScript
36 lines
1.1 KiB
JavaScript
|
|
// Loads imdb2movie.json / imdb2tv.json into memory and reloads on mtime change.
|
||
|
|
|
||
|
|
import { readFile, stat } from 'node:fs/promises';
|
||
|
|
import { join } from 'node:path';
|
||
|
|
import { TMDBINTEGRAL_DIR } from '../config.js';
|
||
|
|
|
||
|
|
const cache = { movie: null, tv: null };
|
||
|
|
const mtimes = { movie: 0, tv: 0 };
|
||
|
|
|
||
|
|
async function loadOne(type) {
|
||
|
|
const file = join(TMDBINTEGRAL_DIR, `imdb2${type}.json`);
|
||
|
|
const st = await stat(file);
|
||
|
|
if (cache[type] && st.mtimeMs === mtimes[type]) return cache[type];
|
||
|
|
const obj = JSON.parse(await readFile(file, 'utf8'));
|
||
|
|
cache[type] = new Map(Object.entries(obj).map(([k, v]) => [k, Number(v)]));
|
||
|
|
mtimes[type] = st.mtimeMs;
|
||
|
|
return cache[type];
|
||
|
|
}
|
||
|
|
|
||
|
|
export async function lookupImdb(imdbId) {
|
||
|
|
// Try movie first, then tv (matches PHP behaviour of exhaustive lookup).
|
||
|
|
try {
|
||
|
|
const movieMap = await loadOne('movie');
|
||
|
|
if (movieMap.has(imdbId)) return { type: 'movie', tmdb: movieMap.get(imdbId) };
|
||
|
|
} catch {
|
||
|
|
/* file may be missing on a fresh install */
|
||
|
|
}
|
||
|
|
try {
|
||
|
|
const tvMap = await loadOne('tv');
|
||
|
|
if (tvMap.has(imdbId)) return { type: 'tv', tmdb: tvMap.get(imdbId) };
|
||
|
|
} catch {
|
||
|
|
/* same */
|
||
|
|
}
|
||
|
|
return null;
|
||
|
|
}
|