feat(media): add Convex media archive with backfill and mixed-media library

This commit is contained in:
2026-04-10 15:15:44 +02:00
parent ddb2412349
commit a1df097f9c
26 changed files with 2664 additions and 122 deletions

View File

@@ -15,6 +15,16 @@ describe("media-preview-utils", () => {
expect(ids).toEqual(["preview-1", "orig-1", "orig-2"]);
});
it("collects only available storage ids for mixed archive items", () => {
const ids = collectMediaStorageIdsForResolution([
{ previewUrl: "https://cdn.example.com/preview-only.jpg" },
{ previewStorageId: "preview-2" },
{ storageId: "orig-2" },
]);
expect(ids).toEqual(["preview-2", "orig-2"]);
});
it("resolves preview url first and falls back to original url", () => {
const previewFirst = resolveMediaPreviewUrl(
{ storageId: "orig-1", previewStorageId: "preview-1" },
@@ -35,4 +45,32 @@ describe("media-preview-utils", () => {
expect(fallbackToOriginal).toBe("https://cdn.example.com/original.jpg");
});
it("resolves direct remote preview URLs before storage map", () => {
const directPreview = resolveMediaPreviewUrl(
{
previewUrl: "https://cdn.example.com/direct-preview.webp",
storageId: "orig-1",
previewStorageId: "preview-1",
},
{
"preview-1": "https://cdn.example.com/preview.webp",
"orig-1": "https://cdn.example.com/original.jpg",
},
);
expect(directPreview).toBe("https://cdn.example.com/direct-preview.webp");
});
it("falls back to direct remote original URLs when storage ids are missing", () => {
const previewUrl = resolveMediaPreviewUrl(
{
kind: "video",
originalUrl: "https://cdn.example.com/video.mp4",
},
{},
);
expect(previewUrl).toBe("https://cdn.example.com/video.mp4");
});
});