Add movies & TV tracker: movies schema, Netflix/Letterboxd/Plex/JSON/recs importers, TMDB matching, stats, owner visibility

This commit is contained in:
2026-10-26 00:31:23 +00:00
parent 75571bbfe0
commit 71e015d1d0
28 changed files with 42754 additions and 14 deletions

38
scripts/movies-tmdb.ts Normal file
View File

@@ -0,0 +1,38 @@
/**
* TMDB pass for the movies & TV tracker: match unmatched titles to TMDB ids, merge rows that turn
* out to be the same TMDB title, and cache posters, genres, year, runtime, cast and episode numbers.
* Needs TMDB_API_KEY (v3 key or v4 read token); scripts/movies-run.sh loads it from
* ~/.config/movies/tmdb.env. Without a key it exits 0 and changes nothing.
*
* scripts/movies-run.sh tmdb # pending titles + missing/old metadata
* scripts/movies-run.sh tmdb --retry-not-found # also retry titles TMDB didn't find before
* scripts/movies-run.sh tmdb --refresh-days 30 # refetch metadata older than 30 days (default 90)
*/
import postgres from 'postgres';
import { Tmdb, runTmdb } from '../src/lib/server/movies/tmdb';
const args = process.argv.slice(2);
const opt = (n: string) => {
const i = args.indexOf(`--${n}`);
return i >= 0 ? args[i + 1] : undefined;
};
if (!process.env.TMDB_API_KEY) {
console.log('No TMDB_API_KEY set: nothing to do');
process.exit(0);
}
if (!process.env.DB_URL)
throw new Error('DB_URL is required (use scripts/movies-run.sh on stan-ovh)');
const sql = postgres(process.env.DB_URL, { max: 1, onnotice: () => {} });
try {
const m = await runTmdb(sql, new Tmdb(process.env.TMDB_API_KEY), {
retryNotFound: args.includes('--retry-not-found'),
refreshDays: opt('refresh-days') ? Number(opt('refresh-days')) : undefined,
limit: opt('limit') ? Number(opt('limit')) : undefined,
log: (l) => console.log(` ${l}`)
});
console.log(
`TMDB: tried ${m.tried}, ${m.matched} matched, ${m.merged} merged, ${m.notFound} not found, ${m.refreshed} refreshed, ${m.errors} errors`
);
} finally {
await sql.end();
}