feat: 完善视频任务与 KOC 资源库

This commit is contained in:
巫凤萍
2026-08-15 03:53:09 +08:00
parent ad3dbdcc86
commit f37d05dd88
66 changed files with 6633 additions and 558 deletions

View File

@@ -0,0 +1,98 @@
import assert from "node:assert/strict";
import test from "node:test";
import sharp from "sharp";
import { normalizeWorkbookImage } from "../lib/workbook-image.ts";
test("bakes EXIF orientation into exported workbook image pixels", async () => {
const source = await sharp({
create: {
width: 8,
height: 4,
channels: 3,
background: "#e95420",
},
})
.jpeg()
.withMetadata({ orientation: 6 })
.toBuffer();
const normalized = await normalizeWorkbookImage({
bytes: new Uint8Array(source),
contentType: "image/jpeg",
width: 8,
height: 4,
description: "手机照片",
});
const metadata = await sharp(normalized.bytes).metadata();
assert.equal(normalized.contentType, "image/png");
assert.equal(normalized.width, 4);
assert.equal(normalized.height, 8);
assert.equal(metadata.width, 4);
assert.equal(metadata.height, 8);
assert.equal(metadata.orientation, undefined);
});
test("keeps unsupported image bytes unchanged", async () => {
const bytes = Uint8Array.from([1, 2, 3]);
const normalized = await normalizeWorkbookImage({
bytes,
contentType: "application/octet-stream",
description: "未知文件",
});
assert.equal(normalized.bytes, bytes);
assert.equal(normalized.contentType, "application/octet-stream");
});
test("normalizes recognizable images even when storage metadata has no image MIME type", async () => {
const source = await sharp({
create: {
width: 8,
height: 4,
channels: 3,
background: "#22c55e",
},
})
.jpeg()
.withMetadata({ orientation: 6 })
.toBuffer();
const normalized = await normalizeWorkbookImage({
bytes: new Uint8Array(source),
contentType: "application/octet-stream",
description: "方向元数据缺失测试",
});
assert.equal(normalized.contentType, "image/png");
assert.equal(normalized.width, 4);
assert.equal(normalized.height, 8);
});
test("can downsize full-resolution source images for compact workbook exports", async () => {
const source = await sharp({
create: {
width: 4000,
height: 3000,
channels: 3,
background: "#d4a72c",
},
})
.png({ compressionLevel: 0 })
.toBuffer();
const normalized = await normalizeWorkbookImage(
{
bytes: new Uint8Array(source),
contentType: "image/png",
width: 4000,
height: 3000,
description: "批量回填原图",
},
{ maxDimension: 1600, outputFormat: "jpeg", jpegQuality: 82 },
);
const metadata = await sharp(normalized.bytes).metadata();
assert.equal(normalized.contentType, "image/jpeg");
assert.equal(normalized.width, 1600);
assert.equal(normalized.height, 1200);
assert.equal(metadata.format, "jpeg");
assert.ok(normalized.bytes.byteLength < source.byteLength / 20);
});