Migration 0042_cache adds UNLOGGED kv_cache. PgCache mirrors MP
runtime/cache.py (region, per-key TTL, TLRU maxsize eviction, @cached as
cachedCall); only the storage moves from memory to PG. TMDB request
responses (MP TMDb.request @cached) and recognize results (MP TmdbCache:
same key, {id:0} negative cache with EMPTY_RESULT_CACHE_TTL, type-conflict
checks, backfill after manual assignment) live in kv_cache, shared by all
processes. Settings cache.tmdbTtlHours / tmdbMaxSize / emptyResultTtlSec
map to META_CACHE_EXPIRE / CONF.tmdb / EMPTY_RESULT_CACHE_TTL. TMDB
details now also store posterPath / backdropPath.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
37 lines
1.4 KiB
TypeScript
37 lines
1.4 KiB
TypeScript
import { DEFAULT_SETTINGS } from "@umt/contracts";
|
|
import { type PgCache, pgCacheFor } from "@umt/db";
|
|
import type { ServerContext } from "./modules/types.ts";
|
|
|
|
// 进程级共享缓存入口:PG kv_cache(移植 MP app/runtime/cache.py 的 TTLCache,存储换成 PG,三进程共享)。
|
|
// region 与 TTL 规则见 docs/runbook/cache.md 与 docs/porting/moviepilot-tmdb-cache.md。
|
|
|
|
export const CACHE_REGIONS = {
|
|
/** TMDB 请求响应(MP TMDb.request 的 @cached):key = path?query */
|
|
tmdbRequest: "tmdb.request",
|
|
/** TMDB 识别结果(MP TmdbCache):key = [类型][语言]{tmdbid 或名称}-{年份}-{季} */
|
|
tmdbRecognize: "tmdb.recognize",
|
|
} as const;
|
|
|
|
export function sharedCache(ctx: Pick<ServerContext, "db">): PgCache {
|
|
return pgCacheFor(ctx.db);
|
|
}
|
|
|
|
/** TMDB 缓存策略(MP:CONF.meta = META_CACHE_EXPIRE 小时、CONF.tmdb 条数、EMPTY_RESULT_CACHE_TTL 秒) */
|
|
export interface TmdbCachePolicy {
|
|
/** 秒 */
|
|
ttl: number;
|
|
maxsize: number;
|
|
/** 秒 */
|
|
emptyTtl: number;
|
|
}
|
|
|
|
export async function tmdbCachePolicy(ctx: Pick<ServerContext, "settings">): Promise<TmdbCachePolicy> {
|
|
const c = await ctx.settings.get("cache").catch(() => DEFAULT_SETTINGS.cache);
|
|
const d = DEFAULT_SETTINGS.cache;
|
|
return {
|
|
ttl: (c.tmdbTtlHours ?? d.tmdbTtlHours) * 3600,
|
|
maxsize: c.tmdbMaxSize ?? d.tmdbMaxSize,
|
|
emptyTtl: c.emptyResultTtlSec ?? d.emptyResultTtlSec,
|
|
};
|
|
}
|