Serve the bench before the catalog and never await ffmpeg on /thumb.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -187,6 +187,7 @@ interface Catalog {
|
||||
}
|
||||
|
||||
const writeChains = new Map<string, Promise<unknown>>()
|
||||
const catalogCache = new Map<string, { catalog: Catalog; mtimeMs: number }>()
|
||||
|
||||
export function libraryRoot() {
|
||||
const config = useRuntimeConfig()
|
||||
@@ -355,6 +356,13 @@ function ensureOwner(owner: string) {
|
||||
function readCatalog(owner: string): Catalog {
|
||||
ensureOwner(owner)
|
||||
const path = catalogPath(owner)
|
||||
let mtimeMs = 0
|
||||
try {
|
||||
mtimeMs = existsSync(path) ? statSync(path).mtimeMs : 0
|
||||
} catch { mtimeMs = 0 }
|
||||
const hit = catalogCache.get(owner)
|
||||
if (hit && hit.mtimeMs === mtimeMs && mtimeMs > 0) return hit.catalog
|
||||
|
||||
let catalog: Catalog
|
||||
try {
|
||||
catalog = normalizeCatalog(JSON.parse(readFileSync(path, 'utf8')))
|
||||
@@ -364,8 +372,11 @@ function readCatalog(owner: string): Catalog {
|
||||
}
|
||||
catalog = emptyCatalog()
|
||||
writeFileSync(path, JSON.stringify(catalog, null, 2))
|
||||
try { mtimeMs = statSync(path).mtimeMs } catch { mtimeMs = Date.now() }
|
||||
catalogCache.set(owner, { catalog, mtimeMs })
|
||||
return catalog
|
||||
}
|
||||
catalogCache.set(owner, { catalog, mtimeMs })
|
||||
return catalog
|
||||
}
|
||||
|
||||
@@ -374,6 +385,14 @@ function writeCatalog(owner: string, catalog: Catalog) {
|
||||
const tmp = catalogPath(owner) + '.tmp'
|
||||
writeFileSync(tmp, JSON.stringify(catalog, null, 2))
|
||||
renameSync(tmp, catalogPath(owner))
|
||||
let mtimeMs = Date.now()
|
||||
try { mtimeMs = statSync(catalogPath(owner)).mtimeMs } catch { /* ignore */ }
|
||||
catalogCache.set(owner, { catalog, mtimeMs })
|
||||
}
|
||||
|
||||
function invalidateCatalogCache(owner?: string) {
|
||||
if (owner) catalogCache.delete(owner)
|
||||
else catalogCache.clear()
|
||||
}
|
||||
|
||||
function mutate<T>(owner: string, fn: (catalog: Catalog) => T): Promise<T> {
|
||||
@@ -1252,6 +1271,17 @@ export function stillThumbFile(owner: string, id: string) {
|
||||
return join(ownerRoot(owner), 'stills', `${id}.thumb.jpg`)
|
||||
}
|
||||
|
||||
/** Sync check — never kicks ffmpeg. Empty string when thumb is missing or stale. */
|
||||
export function existingStillThumbPath(owner: string, id: string) {
|
||||
const source = stillPath(owner, id)
|
||||
const dest = stillThumbFile(owner, id)
|
||||
if (!existsSync(source) || !existsSync(dest)) return ''
|
||||
try {
|
||||
if (statSync(dest).mtimeMs >= statSync(source).mtimeMs) return dest
|
||||
} catch { return '' }
|
||||
return ''
|
||||
}
|
||||
|
||||
function removeStillFiles(owner: string, id: string) {
|
||||
rmSync(stillPath(owner, id), { force: true })
|
||||
rmSync(stillThumbFile(owner, id), { force: true })
|
||||
|
||||
Reference in New Issue
Block a user