feat: enhance PDF metadata extraction and refactor book cover storage

This commit is contained in:
neon
2026-04-08 20:32:38 -06:00
parent a8b203ef4a
commit 9f6b7d4f2b
31 changed files with 792 additions and 155 deletions
@@ -1,4 +1,4 @@
import { mkdir, writeFile } from 'fs/promises';
import { mkdir, readFile, writeFile } from 'fs/promises';
import { dirname, join } from 'path';
import { afterEach } from 'vitest';
@@ -7,6 +7,7 @@ import { Permission, type BookBucketFile, type BookBucketFinalizeResult } from '
import * as schema from '../src/db/schema';
import { buildFb2Fixture } from './e2e/book-bucket/book-bucket-fixture-builder';
import { createPdfFixture } from './e2e/metadata-write/metadata-write-fixture-builder';
import {
authHeader,
closeBookBucketE2EContext,
@@ -141,6 +142,27 @@ describe('Book Bucket ingest + finalize (e2e)', () => {
expect(summaryResponse.json()).toMatchObject({ total: 1, ready: 1 });
});
it('ingests pdf uploads and persists extracted cover files', async () => {
const fixturePath = await createPdfFixture(context.fixture.rootPath, 'fixtures/book-bucket-cover.pdf', 'Book Bucket PDF Title');
const pdfBytes = await readFile(fixturePath);
const uploadResponse = await uploadBookBucketFile(context, {
token: context.adminToken,
fileName: 'book-bucket-cover.pdf',
content: pdfBytes,
contentType: 'application/pdf',
});
expect(uploadResponse.statusCode).toBe(201);
const uploaded = uploadResponse.json() as BookBucketFile;
const ready = await waitForBookBucketStatus(context, uploaded.id, ['ready']);
expect(ready.embeddedMetadata?.title).toBe('Book Bucket PDF Title');
expect(ready.coverPath).toEqual(expect.stringContaining('.jpg'));
expect(ready.coverPath).not.toBeNull();
expect(await fileExists(ready.coverPath!)).toBe(true);
});
it('bulk set-target selectAll with status=pending includes pending, extracting, and fetching', async () => {
const destination = await createLibraryWithFolder(context);
const pendingRow = await createBookBucketRow(context, { fileName: 'pending-target.fb2', status: 'pending' });