Skip to content

Commit 2c4fa91

Browse files
authored
fix: adopt @rendobar/sdk v3 upload API (#46)
SDK 3.0.0 removed uploads.upload(). Use uploads.create(), which presigns, uploads, and finalizes in one call and returns the asset. Reference the uploaded file by its stable content URL (asset.url) instead of the old { downloadUrl }.
1 parent 6a8a1d1 commit 2c4fa91

5 files changed

Lines changed: 23 additions & 23 deletions

File tree

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
"check:no-linked-sdk": "node scripts/check-no-linked-sdk.mjs"
2727
},
2828
"dependencies": {
29-
"@rendobar/sdk": "^2.0.0",
29+
"@rendobar/sdk": "^3.0.0",
3030
"citty": "^0.2.0",
3131
"picocolors": "^1.1.1",
3232
"@clack/prompts": "^1.2.0"

pnpm-lock.yaml

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/__tests__/ffmpeg-command.test.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ describe("ffmpeg command flow", () => {
3535
const rawArgs = ["-i", localPath, "-vf", "scale=640:480", "output.mp4"];
3636
const parsed = parseFfmpegArgs(rawArgs);
3737
const mockClient = {
38-
uploads: { upload: mock(() => Promise.resolve({ downloadUrl: "https://cdn.rendobar.com/uploads/abc.mp4" })) },
38+
uploads: { create: mock(() => Promise.resolve({ url: "https://cdn.rendobar.com/uploads/abc.mp4" })) },
3939
} as unknown as Parameters<typeof uploadLocalFiles>[2];
4040
const rewritten = await uploadLocalFiles(rawArgs, parsed.inputs, mockClient);
4141
const commandString = "ffmpeg " + rewritten.join(" ");
@@ -52,7 +52,7 @@ describe("ffmpeg command flow", () => {
5252
const rawArgs = ["-i", localPath, "-c:v", "libx264", "-crf", "23", "output.mp4"];
5353
const parsed = parseFfmpegArgs(rawArgs);
5454
const mockClient = {
55-
uploads: { upload: mock(() => Promise.resolve({ downloadUrl: "https://cdn.rendobar.com/uploads/xyz.mp4" })) },
55+
uploads: { create: mock(() => Promise.resolve({ url: "https://cdn.rendobar.com/uploads/xyz.mp4" })) },
5656
} as unknown as Parameters<typeof uploadLocalFiles>[2];
5757
const rewritten = await uploadLocalFiles(rawArgs, parsed.inputs, mockClient);
5858

@@ -78,16 +78,16 @@ describe("ffmpeg command flow", () => {
7878
let callIdx = 0;
7979
const mockClient = {
8080
uploads: {
81-
upload: mock(async () => {
81+
create: mock(async () => {
8282
callIdx++;
83-
return { downloadUrl: `https://cdn.rendobar.com/uploads/file${callIdx}.mp4` };
83+
return { url: `https://cdn.rendobar.com/uploads/file${callIdx}.mp4` };
8484
}),
8585
},
8686
} as unknown as Parameters<typeof uploadLocalFiles>[2];
8787

8888
const rewritten = await uploadLocalFiles(rawArgs, parsed.inputs, mockClient);
8989

90-
expect(mockClient.uploads.upload).toHaveBeenCalledTimes(2);
90+
expect(mockClient.uploads.create).toHaveBeenCalledTimes(2);
9191
expect(rewritten[1]).toContain("cdn.rendobar.com");
9292
expect(rewritten[3]).toContain("cdn.rendobar.com");
9393
// Filter complex preserved
@@ -103,13 +103,13 @@ describe("ffmpeg command flow", () => {
103103
expect(parsed.inputs[1]!.isLocal).toBe(true);
104104

105105
const mockClient = {
106-
uploads: { upload: mock(() => Promise.resolve({ downloadUrl: "https://cdn.rendobar.com/uploads/local.png" })) },
106+
uploads: { create: mock(() => Promise.resolve({ url: "https://cdn.rendobar.com/uploads/local.png" })) },
107107
} as unknown as Parameters<typeof uploadLocalFiles>[2];
108108

109109
const rewritten = await uploadLocalFiles(rawArgs, parsed.inputs, mockClient);
110110

111111
// Only one upload call (the local file)
112-
expect(mockClient.uploads.upload).toHaveBeenCalledTimes(1);
112+
expect(mockClient.uploads.create).toHaveBeenCalledTimes(1);
113113
// Remote URL preserved
114114
expect(rewritten[1]).toBe("https://example.com/bg.mp4");
115115
// Local file replaced

src/__tests__/upload.test.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ describe("uploadLocalFiles", () => {
2323

2424
it("uploads local files and replaces paths in args", async () => {
2525
const localPath = createTempFile("video.mp4");
26-
const mockUpload = mock(() => Promise.resolve({ downloadUrl: "https://cdn.rendobar.com/uploads/abc123.mp4" }));
27-
const mockClient = { uploads: { upload: mockUpload } } as unknown as Parameters<typeof uploadLocalFiles>[2];
26+
const mockUpload = mock(() => Promise.resolve({ url: "https://cdn.rendobar.com/uploads/abc123.mp4" }));
27+
const mockClient = { uploads: { create: mockUpload } } as unknown as Parameters<typeof uploadLocalFiles>[2];
2828

2929
const args = ["-i", localPath, "-vf", "scale=1280:720", "output.mp4"];
3030
const inputs = [{ index: 1, value: localPath, isLocal: true }];
@@ -43,9 +43,9 @@ describe("uploadLocalFiles", () => {
4343
let callCount = 0;
4444
const mockUpload = mock(async () => {
4545
callCount++;
46-
return { downloadUrl: `https://cdn.rendobar.com/uploads/file${callCount}.mp4` };
46+
return { url: `https://cdn.rendobar.com/uploads/file${callCount}.mp4` };
4747
});
48-
const mockClient = { uploads: { upload: mockUpload } } as unknown as Parameters<typeof uploadLocalFiles>[2];
48+
const mockClient = { uploads: { create: mockUpload } } as unknown as Parameters<typeof uploadLocalFiles>[2];
4949

5050
const args = ["-i", pathA, "-i", pathB, "output.mp4"];
5151
const inputs = [
@@ -61,8 +61,8 @@ describe("uploadLocalFiles", () => {
6161
});
6262

6363
it("skips URL inputs (no upload needed)", async () => {
64-
const mockUpload = mock(() => Promise.resolve({ downloadUrl: "" }));
65-
const mockClient = { uploads: { upload: mockUpload } } as unknown as Parameters<typeof uploadLocalFiles>[2];
64+
const mockUpload = mock(() => Promise.resolve({ url: "" }));
65+
const mockClient = { uploads: { create: mockUpload } } as unknown as Parameters<typeof uploadLocalFiles>[2];
6666

6767
const args = ["-i", "https://example.com/video.mp4", "output.mp4"];
6868
const inputs = [{ index: 1, value: "https://example.com/video.mp4", isLocal: false }];
@@ -74,8 +74,8 @@ describe("uploadLocalFiles", () => {
7474
});
7575

7676
it("throws when local file does not exist", async () => {
77-
const mockUpload = mock(() => Promise.resolve({ downloadUrl: "" }));
78-
const mockClient = { uploads: { upload: mockUpload } } as unknown as Parameters<typeof uploadLocalFiles>[2];
77+
const mockUpload = mock(() => Promise.resolve({ url: "" }));
78+
const mockClient = { uploads: { create: mockUpload } } as unknown as Parameters<typeof uploadLocalFiles>[2];
7979

8080
const args = ["-i", "/nonexistent/file.mp4", "output.mp4"];
8181
const inputs = [{ index: 1, value: "/nonexistent/file.mp4", isLocal: true }];

src/lib/upload.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,10 @@ export async function uploadLocalFiles(
3535
const filename = path.basename(input.value);
3636

3737
callbacks?.onFileStart?.(filename, file.size, i, total);
38-
const { downloadUrl } = await client.uploads.upload(new Uint8Array(buffer), { filename });
38+
const asset = await client.uploads.create(new Uint8Array(buffer), { filename });
3939
callbacks?.onFileDone?.(filename, i, total);
4040

41-
result[input.index] = downloadUrl;
41+
result[input.index] = asset.url;
4242
}
4343

4444
return result;

0 commit comments

Comments
 (0)