fix: prefer header mime for media extensions
This commit is contained in:
38
src/media/store.header-ext.test.ts
Normal file
38
src/media/store.header-ext.test.ts
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
import fs from "node:fs/promises";
|
||||||
|
import path from "node:path";
|
||||||
|
import { afterAll, beforeAll, describe, expect, it, vi } from "vitest";
|
||||||
|
|
||||||
|
const realOs = await vi.importActual<typeof import("node:os")>("node:os");
|
||||||
|
const HOME = path.join(realOs.tmpdir(), "clawdis-home-header-ext-test");
|
||||||
|
|
||||||
|
vi.mock("node:os", () => ({
|
||||||
|
default: { homedir: () => HOME, tmpdir: () => realOs.tmpdir() },
|
||||||
|
homedir: () => HOME,
|
||||||
|
tmpdir: () => realOs.tmpdir(),
|
||||||
|
}));
|
||||||
|
|
||||||
|
vi.mock("./mime.js", async () => {
|
||||||
|
const actual = await vi.importActual<typeof import("./mime.js")>("./mime.js");
|
||||||
|
return {
|
||||||
|
...actual,
|
||||||
|
detectMime: vi.fn(async () => "audio/opus"),
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
const store = await import("./store.js");
|
||||||
|
|
||||||
|
describe("media store header extensions", () => {
|
||||||
|
beforeAll(async () => {
|
||||||
|
await fs.rm(HOME, { recursive: true, force: true });
|
||||||
|
});
|
||||||
|
|
||||||
|
afterAll(async () => {
|
||||||
|
await fs.rm(HOME, { recursive: true, force: true });
|
||||||
|
});
|
||||||
|
|
||||||
|
it("prefers header mime extension when sniffed mime lacks mapping", async () => {
|
||||||
|
const buf = Buffer.from("fake-audio");
|
||||||
|
const saved = await store.saveMediaBuffer(buf, "audio/ogg; codecs=opus");
|
||||||
|
expect(path.extname(saved.path)).toBe(".ogg");
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -169,8 +169,11 @@ export async function saveMediaBuffer(
|
|||||||
const dir = path.join(MEDIA_DIR, subdir);
|
const dir = path.join(MEDIA_DIR, subdir);
|
||||||
await fs.mkdir(dir, { recursive: true });
|
await fs.mkdir(dir, { recursive: true });
|
||||||
const baseId = crypto.randomUUID();
|
const baseId = crypto.randomUUID();
|
||||||
|
const headerExt = extensionForMime(
|
||||||
|
contentType?.split(";")[0]?.trim() ?? undefined,
|
||||||
|
);
|
||||||
const mime = await detectMime({ buffer, headerMime: contentType });
|
const mime = await detectMime({ buffer, headerMime: contentType });
|
||||||
const ext = extensionForMime(mime);
|
const ext = headerExt ?? extensionForMime(mime);
|
||||||
const id = ext ? `${baseId}${ext}` : baseId;
|
const id = ext ? `${baseId}${ext}` : baseId;
|
||||||
const dest = path.join(dir, id);
|
const dest = path.join(dir, id);
|
||||||
await fs.writeFile(dest, buffer);
|
await fs.writeFile(dest, buffer);
|
||||||
|
|||||||
Reference in New Issue
Block a user