@uploadbox/video 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,25 @@
1
+ import type { ProcessingHook } from "@uploadbox/core";
2
+ import type { TranscodingProvider } from "../provider.js";
3
+ /**
4
+ * Creates a processing hook that submits videos to Cloudflare Stream for transcoding.
5
+ *
6
+ * Unlike the FFmpeg hook, this does not probe the source video or filter quality
7
+ * presets — Cloudflare Stream handles adaptive bitrate automatically. The hook
8
+ * simply submits the video URL and returns the job ID for cron-based polling.
9
+ *
10
+ * @param provider - A Cloudflare Stream transcoding provider.
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * import { createCfStreamProcessingHook } from "@uploadbox/video/hooks/cf-stream-processing";
15
+ * import { createCloudflareStreamProvider } from "@uploadbox/video/providers/cloudflare-stream";
16
+ *
17
+ * const provider = createCloudflareStreamProvider({
18
+ * accountId: process.env.CLOUDFLARE_STREAM_ACCOUNT_ID!,
19
+ * apiToken: process.env.CLOUDFLARE_STREAM_API_TOKEN!,
20
+ * });
21
+ * const hook = createCfStreamProcessingHook(provider);
22
+ * ```
23
+ */
24
+ export declare function createCfStreamProcessingHook(provider: TranscodingProvider): ProcessingHook;
25
+ //# sourceMappingURL=cf-stream-processing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cf-stream-processing.d.ts","sourceRoot":"","sources":["../../src/hooks/cf-stream-processing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAA2C,MAAM,iBAAiB,CAAC;AAC/F,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAE1D;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,mBAAmB,GAC5B,cAAc,CA0ChB"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Creates a processing hook that submits videos to Cloudflare Stream for transcoding.
3
+ *
4
+ * Unlike the FFmpeg hook, this does not probe the source video or filter quality
5
+ * presets — Cloudflare Stream handles adaptive bitrate automatically. The hook
6
+ * simply submits the video URL and returns the job ID for cron-based polling.
7
+ *
8
+ * @param provider - A Cloudflare Stream transcoding provider.
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * import { createCfStreamProcessingHook } from "@uploadbox/video/hooks/cf-stream-processing";
13
+ * import { createCloudflareStreamProvider } from "@uploadbox/video/providers/cloudflare-stream";
14
+ *
15
+ * const provider = createCloudflareStreamProvider({
16
+ * accountId: process.env.CLOUDFLARE_STREAM_ACCOUNT_ID!,
17
+ * apiToken: process.env.CLOUDFLARE_STREAM_API_TOKEN!,
18
+ * });
19
+ * const hook = createCfStreamProcessingHook(provider);
20
+ * ```
21
+ */
22
+ export function createCfStreamProcessingHook(provider) {
23
+ return {
24
+ name: "cf-stream-processing",
25
+ timeoutMs: 60_000, // Only the submit call — transcoding is async
26
+ shouldRun(ctx) {
27
+ return ctx.file.type.startsWith("video/");
28
+ },
29
+ async run(ctx) {
30
+ try {
31
+ const { jobId } = await provider.submit({
32
+ sourceKey: ctx.file.key,
33
+ sourceBucket: ctx.config.bucket,
34
+ outputBucket: ctx.config.bucket,
35
+ options: {
36
+ s3OutputPrefix: "", // Not used by CF Stream — transcoding is external
37
+ },
38
+ s3Config: {
39
+ region: ctx.config.region,
40
+ endpoint: ctx.config.endpoint,
41
+ accessKeyId: ctx.config.accessKeyId,
42
+ secretAccessKey: ctx.config.secretAccessKey,
43
+ forcePathStyle: ctx.config.forcePathStyle,
44
+ },
45
+ });
46
+ return {
47
+ success: true,
48
+ data: {
49
+ jobId,
50
+ providerName: "cloudflare-stream",
51
+ },
52
+ };
53
+ }
54
+ catch (err) {
55
+ return {
56
+ success: false,
57
+ error: `CF Stream submission failed: ${err.message}`,
58
+ };
59
+ }
60
+ },
61
+ };
62
+ }
63
+ //# sourceMappingURL=cf-stream-processing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cf-stream-processing.js","sourceRoot":"","sources":["../../src/hooks/cf-stream-processing.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,4BAA4B,CAC1C,QAA6B;IAE7B,OAAO;QACL,IAAI,EAAE,sBAAsB;QAC5B,SAAS,EAAE,MAAM,EAAE,8CAA8C;QAEjE,SAAS,CAAC,GAAsB;YAC9B,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC5C,CAAC;QAED,KAAK,CAAC,GAAG,CAAC,GAAsB;YAC9B,IAAI,CAAC;gBACH,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;oBACtC,SAAS,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG;oBACvB,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM;oBAC/B,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM;oBAC/B,OAAO,EAAE;wBACP,cAAc,EAAE,EAAE,EAAE,kDAAkD;qBACvE;oBACD,QAAQ,EAAE;wBACR,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM;wBACzB,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ;wBAC7B,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,WAAW;wBACnC,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,eAAe;wBAC3C,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,cAAc;qBAC1C;iBACF,CAAC,CAAC;gBAEH,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,IAAI,EAAE;wBACJ,KAAK;wBACL,YAAY,EAAE,mBAAmB;qBAClC;iBACF,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,gCAAiC,GAAa,CAAC,OAAO,EAAE;iBAChE,CAAC;YACJ,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
package/dist/index.d.ts CHANGED
@@ -2,4 +2,6 @@ export type { VideoMetadata, TranscodingStatus, QualityPreset, TranscodingJob, T
2
2
  export { QUALITY_PRESETS, CDN_CACHE_HEADERS } from "./types.js";
3
3
  export type { TranscodingProvider, TranscodingSubmitInput, } from "./provider.js";
4
4
  export { extractVideoMetadata } from "./metadata.js";
5
+ export { createCloudflareStreamProvider } from "./providers/cloudflare-stream.js";
6
+ export { createCfStreamProcessingHook } from "./hooks/cf-stream-processing.js";
5
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,2BAA2B,GAC5B,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEhE,YAAY,EACV,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,2BAA2B,GAC5B,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEhE,YAAY,EACV,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAErD,OAAO,EAAE,8BAA8B,EAAE,MAAM,kCAAkC,CAAC;AAClF,OAAO,EAAE,4BAA4B,EAAE,MAAM,iCAAiC,CAAC"}
package/dist/index.js CHANGED
@@ -1,3 +1,5 @@
1
1
  export { QUALITY_PRESETS, CDN_CACHE_HEADERS } from "./types.js";
2
2
  export { extractVideoMetadata } from "./metadata.js";
3
+ export { createCloudflareStreamProvider } from "./providers/cloudflare-stream.js";
4
+ export { createCfStreamProcessingHook } from "./hooks/cf-stream-processing.js";
3
5
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAOhE,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAOhE,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAErD,OAAO,EAAE,8BAA8B,EAAE,MAAM,kCAAkC,CAAC;AAClF,OAAO,EAAE,4BAA4B,EAAE,MAAM,iCAAiC,CAAC"}
@@ -0,0 +1,29 @@
1
+ import type { TranscodingProvider } from "../provider.js";
2
+ interface CloudflareStreamProviderOptions {
3
+ /** Cloudflare account ID. */
4
+ accountId: string;
5
+ /** Cloudflare API token with Stream permissions. */
6
+ apiToken: string;
7
+ }
8
+ /**
9
+ * Cloudflare Stream transcoding provider.
10
+ *
11
+ * Delegates video transcoding to Cloudflare Stream — source video is ingested
12
+ * via a presigned S3 GET URL, transcoded on CF infrastructure, and served from
13
+ * the Cloudflare CDN (`videodelivery.net`).
14
+ *
15
+ * No local ffmpeg required. Adaptive bitrate is handled automatically.
16
+ *
17
+ * @example
18
+ * ```ts
19
+ * import { createCloudflareStreamProvider } from "@uploadbox/video/providers/cloudflare-stream";
20
+ *
21
+ * const provider = createCloudflareStreamProvider({
22
+ * accountId: process.env.CLOUDFLARE_STREAM_ACCOUNT_ID!,
23
+ * apiToken: process.env.CLOUDFLARE_STREAM_API_TOKEN!,
24
+ * });
25
+ * ```
26
+ */
27
+ export declare function createCloudflareStreamProvider(options: CloudflareStreamProviderOptions): TranscodingProvider;
28
+ export {};
29
+ //# sourceMappingURL=cloudflare-stream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudflare-stream.d.ts","sourceRoot":"","sources":["../../src/providers/cloudflare-stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAA0B,MAAM,gBAAgB,CAAC;AAIlF,UAAU,+BAA+B;IACvC,6BAA6B;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,oDAAoD;IACpD,QAAQ,EAAE,MAAM,CAAC;CAClB;AA4BD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,+BAA+B,GACvC,mBAAmB,CA8HrB"}
@@ -0,0 +1,126 @@
1
+ import { createS3Client } from "@uploadbox/core";
2
+ /**
3
+ * Cloudflare Stream transcoding provider.
4
+ *
5
+ * Delegates video transcoding to Cloudflare Stream — source video is ingested
6
+ * via a presigned S3 GET URL, transcoded on CF infrastructure, and served from
7
+ * the Cloudflare CDN (`videodelivery.net`).
8
+ *
9
+ * No local ffmpeg required. Adaptive bitrate is handled automatically.
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * import { createCloudflareStreamProvider } from "@uploadbox/video/providers/cloudflare-stream";
14
+ *
15
+ * const provider = createCloudflareStreamProvider({
16
+ * accountId: process.env.CLOUDFLARE_STREAM_ACCOUNT_ID!,
17
+ * apiToken: process.env.CLOUDFLARE_STREAM_API_TOKEN!,
18
+ * });
19
+ * ```
20
+ */
21
+ export function createCloudflareStreamProvider(options) {
22
+ const { accountId, apiToken } = options;
23
+ const baseUrl = `https://api.cloudflare.com/client/v4/accounts/${accountId}/stream`;
24
+ async function cfFetch(path, init) {
25
+ const res = await fetch(`${baseUrl}${path}`, {
26
+ ...init,
27
+ headers: {
28
+ Authorization: `Bearer ${apiToken}`,
29
+ "Content-Type": "application/json",
30
+ ...init?.headers,
31
+ },
32
+ });
33
+ if (!res.ok) {
34
+ const text = await res.text().catch(() => "");
35
+ throw new Error(`Cloudflare Stream API error ${res.status}: ${text}`);
36
+ }
37
+ return res.json();
38
+ }
39
+ return {
40
+ name: "cloudflare-stream",
41
+ async submit(input) {
42
+ // Create S3 client and generate a presigned GET URL for the source video
43
+ const { GetObjectCommand } = await import("@aws-sdk/client-s3");
44
+ const { getSignedUrl } = await import("@aws-sdk/s3-request-presigner");
45
+ const s3Client = createS3Client({
46
+ region: input.s3Config.region ?? "us-east-1",
47
+ bucket: input.sourceBucket,
48
+ accessKeyId: input.s3Config.accessKeyId,
49
+ secretAccessKey: input.s3Config.secretAccessKey,
50
+ endpoint: input.s3Config.endpoint,
51
+ forcePathStyle: input.s3Config.forcePathStyle,
52
+ });
53
+ const presignedUrl = await getSignedUrl(s3Client, new GetObjectCommand({
54
+ Bucket: input.sourceBucket,
55
+ Key: input.sourceKey,
56
+ }), { expiresIn: 3600 });
57
+ // Submit URL-based copy to CF Stream
58
+ const response = await cfFetch("/copy", {
59
+ method: "POST",
60
+ body: JSON.stringify({
61
+ url: presignedUrl,
62
+ meta: { name: input.sourceKey },
63
+ }),
64
+ });
65
+ if (!response.success || !response.result?.uid) {
66
+ const errMsg = response.errors?.[0]?.message ?? "Unknown CF Stream error";
67
+ throw new Error(`Cloudflare Stream copy failed: ${errMsg}`);
68
+ }
69
+ return { jobId: response.result.uid };
70
+ },
71
+ async getJobStatus(jobId) {
72
+ const response = await cfFetch(`/${jobId}`);
73
+ if (!response.success || !response.result) {
74
+ return {
75
+ jobId,
76
+ status: "failed",
77
+ progress: 0,
78
+ outputKeys: [],
79
+ error: response.errors?.[0]?.message ?? "Failed to fetch job status",
80
+ };
81
+ }
82
+ const { result } = response;
83
+ if (result.readyToStream) {
84
+ return {
85
+ jobId,
86
+ status: "completed",
87
+ progress: 100,
88
+ outputKeys: [],
89
+ playbackUrl: result.playback?.hls ?? undefined,
90
+ thumbnailUrl: result.thumbnail ?? undefined,
91
+ };
92
+ }
93
+ if (result.status?.state === "error") {
94
+ return {
95
+ jobId,
96
+ status: "failed",
97
+ progress: 0,
98
+ outputKeys: [],
99
+ error: result.status.errorReasonText ?? "Transcoding failed",
100
+ };
101
+ }
102
+ if (result.status?.state === "inprogress") {
103
+ const pct = result.status.pctComplete
104
+ ? parseFloat(result.status.pctComplete)
105
+ : 0;
106
+ return {
107
+ jobId,
108
+ status: "processing",
109
+ progress: Math.round(pct),
110
+ outputKeys: [],
111
+ };
112
+ }
113
+ // Queued / pending
114
+ return {
115
+ jobId,
116
+ status: "pending",
117
+ progress: 0,
118
+ outputKeys: [],
119
+ };
120
+ },
121
+ async cancel(jobId) {
122
+ await cfFetch(`/${jobId}`, { method: "DELETE" });
123
+ },
124
+ };
125
+ }
126
+ //# sourceMappingURL=cloudflare-stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudflare-stream.js","sourceRoot":"","sources":["../../src/providers/cloudflare-stream.ts"],"names":[],"mappings":"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"}
@@ -123,7 +123,7 @@ export function createFFmpegProvider(options = {}) {
123
123
  "-b:v", `${preset.videoBitrate}`,
124
124
  "-maxrate", `${Math.round(preset.videoBitrate * 1.2)}`,
125
125
  "-bufsize", `${Math.round(preset.videoBitrate * 2)}`,
126
- "-r", `${Math.min(preset.maxFrameRate, 60)}`,
126
+ "-r", `${preset.maxFrameRate}`,
127
127
  "-c:a", "aac",
128
128
  "-b:a", `${preset.audioBitrate}`,
129
129
  "-ac", "2",
@@ -1 +1 @@
1
- {"version":3,"file":"ffmpeg.js","sourceRoot":"","sources":["../../src/providers/ffmpeg.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ffmpeg.js","sourceRoot":"","sources":["../../src/providers/ffmpeg.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -51,6 +51,10 @@ export interface TranscodingJob {
51
51
  outputKeys: string[];
52
52
  /** Error message if status is "failed". */
53
53
  error?: string;
54
+ /** Externally-hosted playback URL (e.g. Cloudflare Stream HLS manifest). */
55
+ playbackUrl?: string;
56
+ /** Externally-hosted thumbnail URL. */
57
+ thumbnailUrl?: string;
54
58
  }
55
59
  /** Options controlling the transcoding output. */
56
60
  export interface TranscodingOptions {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,MAAM,WAAW,aAAa;IAC5B,6BAA6B;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,8BAA8B;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,2BAA2B;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,KAAK,CAAC,EAAE;QACN,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED,mCAAmC;AACnC,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,YAAY,GAAG,WAAW,GAAG,QAAQ,CAAC;AAElF,2DAA2D;AAC3D,MAAM,WAAW,aAAa;IAC5B,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,YAAY,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,YAAY,EAAE,MAAM,CAAC;IACrB,8DAA8D;IAC9D,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,oDAAoD;AACpD,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAiCzD,CAAC;AAEF,kCAAkC;AAClC,MAAM,WAAW,cAAc;IAC7B,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,sBAAsB;IACtB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,mCAAmC;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,uEAAuE;IACvE,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,2CAA2C;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,kDAAkD;AAClD,MAAM,WAAW,kBAAkB;IACjC,oEAAoE;IACpE,SAAS,CAAC,EAAE,aAAa,EAAE,CAAC;IAC5B,kDAAkD;IAClD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,4DAA4D;IAC5D,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,oEAAoE;IACpE,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,sCAAsC;IACtC,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,iCAAiC;AACjC,MAAM,WAAW,mBAAmB;IAClC,sBAAsB;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,iDAAiD;IACjD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,8DAA8D;AAC9D,MAAM,MAAM,2BAA2B,GAAG,CAAC,QAAQ,EAAE,mBAAmB,KAAK,IAAI,CAAC;AAElF,gDAAgD;AAChD,eAAO,MAAM,iBAAiB;IAC5B,uDAAuD;;IAEvD,8DAA8D;;IAE9D,qDAAqD;;CAE7C,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,MAAM,WAAW,aAAa;IAC5B,6BAA6B;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,8BAA8B;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,2BAA2B;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,KAAK,CAAC,EAAE;QACN,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED,mCAAmC;AACnC,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,YAAY,GAAG,WAAW,GAAG,QAAQ,CAAC;AAElF,2DAA2D;AAC3D,MAAM,WAAW,aAAa;IAC5B,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,YAAY,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,YAAY,EAAE,MAAM,CAAC;IACrB,8DAA8D;IAC9D,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,oDAAoD;AACpD,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAyDzD,CAAC;AAEF,kCAAkC;AAClC,MAAM,WAAW,cAAc;IAC7B,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,sBAAsB;IACtB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,mCAAmC;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,uEAAuE;IACvE,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,2CAA2C;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uCAAuC;IACvC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,kDAAkD;AAClD,MAAM,WAAW,kBAAkB;IACjC,oEAAoE;IACpE,SAAS,CAAC,EAAE,aAAa,EAAE,CAAC;IAC5B,kDAAkD;IAClD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,4DAA4D;IAC5D,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,oEAAoE;IACpE,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,sCAAsC;IACtC,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,iCAAiC;AACjC,MAAM,WAAW,mBAAmB;IAClC,sBAAsB;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,iDAAiD;IACjD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,8DAA8D;AAC9D,MAAM,MAAM,2BAA2B,GAAG,CAAC,QAAQ,EAAE,mBAAmB,KAAK,IAAI,CAAC;AAElF,gDAAgD;AAChD,eAAO,MAAM,iBAAiB;IAC5B,uDAAuD;;IAEvD,8DAA8D;;IAE9D,qDAAqD;;CAE7C,CAAC"}
package/dist/types.js CHANGED
@@ -32,6 +32,30 @@ export const QUALITY_PRESETS = {
32
32
  audioBitrate: 192_000,
33
33
  maxFrameRate: 60,
34
34
  },
35
+ "1440p": {
36
+ label: "1440p",
37
+ width: 2560,
38
+ height: 1440,
39
+ videoBitrate: 8_000_000,
40
+ audioBitrate: 192_000,
41
+ maxFrameRate: 60,
42
+ },
43
+ "4k": {
44
+ label: "4k",
45
+ width: 3840,
46
+ height: 2160,
47
+ videoBitrate: 16_000_000,
48
+ audioBitrate: 256_000,
49
+ maxFrameRate: 60,
50
+ },
51
+ "8k": {
52
+ label: "8k",
53
+ width: 7680,
54
+ height: 4320,
55
+ videoBitrate: 50_000_000,
56
+ audioBitrate: 320_000,
57
+ maxFrameRate: 60,
58
+ },
35
59
  };
36
60
  /** CDN cache header presets for HLS content. */
37
61
  export const CDN_CACHE_HEADERS = {
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AA0CA,oDAAoD;AACpD,MAAM,CAAC,MAAM,eAAe,GAAkC;IAC5D,MAAM,EAAE;QACN,KAAK,EAAE,MAAM;QACb,KAAK,EAAE,GAAG;QACV,MAAM,EAAE,GAAG;QACX,YAAY,EAAE,OAAO;QACrB,YAAY,EAAE,MAAM;QACpB,YAAY,EAAE,EAAE;KACjB;IACD,MAAM,EAAE;QACN,KAAK,EAAE,MAAM;QACb,KAAK,EAAE,GAAG;QACV,MAAM,EAAE,GAAG;QACX,YAAY,EAAE,SAAS;QACvB,YAAY,EAAE,OAAO;QACrB,YAAY,EAAE,EAAE;KACjB;IACD,MAAM,EAAE;QACN,KAAK,EAAE,MAAM;QACb,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,GAAG;QACX,YAAY,EAAE,SAAS;QACvB,YAAY,EAAE,OAAO;QACrB,YAAY,EAAE,EAAE;KACjB;IACD,OAAO,EAAE;QACP,KAAK,EAAE,OAAO;QACd,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,IAAI;QACZ,YAAY,EAAE,SAAS;QACvB,YAAY,EAAE,OAAO;QACrB,YAAY,EAAE,EAAE;KACjB;CACF,CAAC;AA6CF,gDAAgD;AAChD,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,uDAAuD;IACvD,OAAO,EAAE,qCAAqC;IAC9C,8DAA8D;IAC9D,QAAQ,EAAE,oBAAoB;IAC9B,qDAAqD;IACrD,SAAS,EAAE,uBAAuB;CAC1B,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AA0CA,oDAAoD;AACpD,MAAM,CAAC,MAAM,eAAe,GAAkC;IAC5D,MAAM,EAAE;QACN,KAAK,EAAE,MAAM;QACb,KAAK,EAAE,GAAG;QACV,MAAM,EAAE,GAAG;QACX,YAAY,EAAE,OAAO;QACrB,YAAY,EAAE,MAAM;QACpB,YAAY,EAAE,EAAE;KACjB;IACD,MAAM,EAAE;QACN,KAAK,EAAE,MAAM;QACb,KAAK,EAAE,GAAG;QACV,MAAM,EAAE,GAAG;QACX,YAAY,EAAE,SAAS;QACvB,YAAY,EAAE,OAAO;QACrB,YAAY,EAAE,EAAE;KACjB;IACD,MAAM,EAAE;QACN,KAAK,EAAE,MAAM;QACb,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,GAAG;QACX,YAAY,EAAE,SAAS;QACvB,YAAY,EAAE,OAAO;QACrB,YAAY,EAAE,EAAE;KACjB;IACD,OAAO,EAAE;QACP,KAAK,EAAE,OAAO;QACd,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,IAAI;QACZ,YAAY,EAAE,SAAS;QACvB,YAAY,EAAE,OAAO;QACrB,YAAY,EAAE,EAAE;KACjB;IACD,OAAO,EAAE;QACP,KAAK,EAAE,OAAO;QACd,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,IAAI;QACZ,YAAY,EAAE,SAAS;QACvB,YAAY,EAAE,OAAO;QACrB,YAAY,EAAE,EAAE;KACjB;IACD,IAAI,EAAE;QACJ,KAAK,EAAE,IAAI;QACX,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,IAAI;QACZ,YAAY,EAAE,UAAU;QACxB,YAAY,EAAE,OAAO;QACrB,YAAY,EAAE,EAAE;KACjB;IACD,IAAI,EAAE;QACJ,KAAK,EAAE,IAAI;QACX,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,IAAI;QACZ,YAAY,EAAE,UAAU;QACxB,YAAY,EAAE,OAAO;QACrB,YAAY,EAAE,EAAE;KACjB;CACF,CAAC;AAiDF,gDAAgD;AAChD,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,uDAAuD;IACvD,OAAO,EAAE,qCAAqC;IAC9C,8DAA8D;IAC9D,QAAQ,EAAE,oBAAoB;IAC9B,qDAAqD;IACrD,SAAS,EAAE,uBAAuB;CAC1B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uploadbox/video",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -29,11 +29,20 @@
29
29
  "./providers/external": {
30
30
  "types": "./dist/providers/external.d.ts",
31
31
  "import": "./dist/providers/external.js"
32
+ },
33
+ "./providers/cloudflare-stream": {
34
+ "types": "./dist/providers/cloudflare-stream.d.ts",
35
+ "import": "./dist/providers/cloudflare-stream.js"
36
+ },
37
+ "./hooks/cf-stream-processing": {
38
+ "types": "./dist/hooks/cf-stream-processing.d.ts",
39
+ "import": "./dist/hooks/cf-stream-processing.js"
32
40
  }
33
41
  },
34
42
  "dependencies": {
35
43
  "@aws-sdk/client-s3": "^3.700.0",
36
- "@uploadbox/core": "0.4.0"
44
+ "@aws-sdk/s3-request-presigner": "^3.700.0",
45
+ "@uploadbox/core": "0.5.0"
37
46
  },
38
47
  "peerDependencies": {
39
48
  "react": "^18.0.0 || ^19.0.0",
@@ -0,0 +1,69 @@
1
+ import type { ProcessingHook, ProcessingContext, ProcessingHookResult } from "@uploadbox/core";
2
+ import type { TranscodingProvider } from "../provider.js";
3
+
4
+ /**
5
+ * Creates a processing hook that submits videos to Cloudflare Stream for transcoding.
6
+ *
7
+ * Unlike the FFmpeg hook, this does not probe the source video or filter quality
8
+ * presets — Cloudflare Stream handles adaptive bitrate automatically. The hook
9
+ * simply submits the video URL and returns the job ID for cron-based polling.
10
+ *
11
+ * @param provider - A Cloudflare Stream transcoding provider.
12
+ *
13
+ * @example
14
+ * ```ts
15
+ * import { createCfStreamProcessingHook } from "@uploadbox/video/hooks/cf-stream-processing";
16
+ * import { createCloudflareStreamProvider } from "@uploadbox/video/providers/cloudflare-stream";
17
+ *
18
+ * const provider = createCloudflareStreamProvider({
19
+ * accountId: process.env.CLOUDFLARE_STREAM_ACCOUNT_ID!,
20
+ * apiToken: process.env.CLOUDFLARE_STREAM_API_TOKEN!,
21
+ * });
22
+ * const hook = createCfStreamProcessingHook(provider);
23
+ * ```
24
+ */
25
+ export function createCfStreamProcessingHook(
26
+ provider: TranscodingProvider
27
+ ): ProcessingHook {
28
+ return {
29
+ name: "cf-stream-processing",
30
+ timeoutMs: 60_000, // Only the submit call — transcoding is async
31
+
32
+ shouldRun(ctx: ProcessingContext): boolean {
33
+ return ctx.file.type.startsWith("video/");
34
+ },
35
+
36
+ async run(ctx: ProcessingContext): Promise<ProcessingHookResult> {
37
+ try {
38
+ const { jobId } = await provider.submit({
39
+ sourceKey: ctx.file.key,
40
+ sourceBucket: ctx.config.bucket,
41
+ outputBucket: ctx.config.bucket,
42
+ options: {
43
+ s3OutputPrefix: "", // Not used by CF Stream — transcoding is external
44
+ },
45
+ s3Config: {
46
+ region: ctx.config.region,
47
+ endpoint: ctx.config.endpoint,
48
+ accessKeyId: ctx.config.accessKeyId,
49
+ secretAccessKey: ctx.config.secretAccessKey,
50
+ forcePathStyle: ctx.config.forcePathStyle,
51
+ },
52
+ });
53
+
54
+ return {
55
+ success: true,
56
+ data: {
57
+ jobId,
58
+ providerName: "cloudflare-stream",
59
+ },
60
+ };
61
+ } catch (err) {
62
+ return {
63
+ success: false,
64
+ error: `CF Stream submission failed: ${(err as Error).message}`,
65
+ };
66
+ }
67
+ },
68
+ };
69
+ }
package/src/index.ts CHANGED
@@ -16,3 +16,6 @@ export type {
16
16
  } from "./provider.js";
17
17
 
18
18
  export { extractVideoMetadata } from "./metadata.js";
19
+
20
+ export { createCloudflareStreamProvider } from "./providers/cloudflare-stream.js";
21
+ export { createCfStreamProcessingHook } from "./hooks/cf-stream-processing.js";
@@ -0,0 +1,185 @@
1
+ import type { TranscodingProvider, TranscodingSubmitInput } from "../provider.js";
2
+ import type { TranscodingJob } from "../types.js";
3
+ import { createS3Client } from "@uploadbox/core";
4
+
5
+ interface CloudflareStreamProviderOptions {
6
+ /** Cloudflare account ID. */
7
+ accountId: string;
8
+ /** Cloudflare API token with Stream permissions. */
9
+ apiToken: string;
10
+ }
11
+
12
+ interface CloudflareStreamResponse {
13
+ success: boolean;
14
+ errors: Array<{ code: number; message: string }>;
15
+ result: {
16
+ uid: string;
17
+ readyToStream: boolean;
18
+ status: {
19
+ state: string;
20
+ pctComplete?: string;
21
+ errorReasonCode?: string;
22
+ errorReasonText?: string;
23
+ };
24
+ playback?: {
25
+ hls?: string;
26
+ dash?: string;
27
+ };
28
+ thumbnail?: string;
29
+ input?: {
30
+ width?: number;
31
+ height?: number;
32
+ };
33
+ duration?: number;
34
+ meta?: Record<string, string>;
35
+ };
36
+ }
37
+
38
+ /**
39
+ * Cloudflare Stream transcoding provider.
40
+ *
41
+ * Delegates video transcoding to Cloudflare Stream — source video is ingested
42
+ * via a presigned S3 GET URL, transcoded on CF infrastructure, and served from
43
+ * the Cloudflare CDN (`videodelivery.net`).
44
+ *
45
+ * No local ffmpeg required. Adaptive bitrate is handled automatically.
46
+ *
47
+ * @example
48
+ * ```ts
49
+ * import { createCloudflareStreamProvider } from "@uploadbox/video/providers/cloudflare-stream";
50
+ *
51
+ * const provider = createCloudflareStreamProvider({
52
+ * accountId: process.env.CLOUDFLARE_STREAM_ACCOUNT_ID!,
53
+ * apiToken: process.env.CLOUDFLARE_STREAM_API_TOKEN!,
54
+ * });
55
+ * ```
56
+ */
57
+ export function createCloudflareStreamProvider(
58
+ options: CloudflareStreamProviderOptions
59
+ ): TranscodingProvider {
60
+ const { accountId, apiToken } = options;
61
+ const baseUrl = `https://api.cloudflare.com/client/v4/accounts/${accountId}/stream`;
62
+
63
+ async function cfFetch(path: string, init?: RequestInit): Promise<CloudflareStreamResponse> {
64
+ const res = await fetch(`${baseUrl}${path}`, {
65
+ ...init,
66
+ headers: {
67
+ Authorization: `Bearer ${apiToken}`,
68
+ "Content-Type": "application/json",
69
+ ...init?.headers,
70
+ },
71
+ });
72
+
73
+ if (!res.ok) {
74
+ const text = await res.text().catch(() => "");
75
+ throw new Error(`Cloudflare Stream API error ${res.status}: ${text}`);
76
+ }
77
+
78
+ return res.json() as Promise<CloudflareStreamResponse>;
79
+ }
80
+
81
+ return {
82
+ name: "cloudflare-stream",
83
+
84
+ async submit(input: TranscodingSubmitInput): Promise<{ jobId: string }> {
85
+ // Create S3 client and generate a presigned GET URL for the source video
86
+ const { GetObjectCommand } = await import("@aws-sdk/client-s3");
87
+ const { getSignedUrl } = await import("@aws-sdk/s3-request-presigner");
88
+
89
+ const s3Client = createS3Client({
90
+ region: input.s3Config.region ?? "us-east-1",
91
+ bucket: input.sourceBucket,
92
+ accessKeyId: input.s3Config.accessKeyId,
93
+ secretAccessKey: input.s3Config.secretAccessKey,
94
+ endpoint: input.s3Config.endpoint,
95
+ forcePathStyle: input.s3Config.forcePathStyle,
96
+ });
97
+
98
+ const presignedUrl = await getSignedUrl(
99
+ s3Client,
100
+ new GetObjectCommand({
101
+ Bucket: input.sourceBucket,
102
+ Key: input.sourceKey,
103
+ }),
104
+ { expiresIn: 3600 }
105
+ );
106
+
107
+ // Submit URL-based copy to CF Stream
108
+ const response = await cfFetch("/copy", {
109
+ method: "POST",
110
+ body: JSON.stringify({
111
+ url: presignedUrl,
112
+ meta: { name: input.sourceKey },
113
+ }),
114
+ });
115
+
116
+ if (!response.success || !response.result?.uid) {
117
+ const errMsg = response.errors?.[0]?.message ?? "Unknown CF Stream error";
118
+ throw new Error(`Cloudflare Stream copy failed: ${errMsg}`);
119
+ }
120
+
121
+ return { jobId: response.result.uid };
122
+ },
123
+
124
+ async getJobStatus(jobId: string): Promise<TranscodingJob> {
125
+ const response = await cfFetch(`/${jobId}`);
126
+
127
+ if (!response.success || !response.result) {
128
+ return {
129
+ jobId,
130
+ status: "failed",
131
+ progress: 0,
132
+ outputKeys: [],
133
+ error: response.errors?.[0]?.message ?? "Failed to fetch job status",
134
+ };
135
+ }
136
+
137
+ const { result } = response;
138
+
139
+ if (result.readyToStream) {
140
+ return {
141
+ jobId,
142
+ status: "completed",
143
+ progress: 100,
144
+ outputKeys: [],
145
+ playbackUrl: result.playback?.hls ?? undefined,
146
+ thumbnailUrl: result.thumbnail ?? undefined,
147
+ };
148
+ }
149
+
150
+ if (result.status?.state === "error") {
151
+ return {
152
+ jobId,
153
+ status: "failed",
154
+ progress: 0,
155
+ outputKeys: [],
156
+ error: result.status.errorReasonText ?? "Transcoding failed",
157
+ };
158
+ }
159
+
160
+ if (result.status?.state === "inprogress") {
161
+ const pct = result.status.pctComplete
162
+ ? parseFloat(result.status.pctComplete)
163
+ : 0;
164
+ return {
165
+ jobId,
166
+ status: "processing",
167
+ progress: Math.round(pct),
168
+ outputKeys: [],
169
+ };
170
+ }
171
+
172
+ // Queued / pending
173
+ return {
174
+ jobId,
175
+ status: "pending",
176
+ progress: 0,
177
+ outputKeys: [],
178
+ };
179
+ },
180
+
181
+ async cancel(jobId: string): Promise<void> {
182
+ await cfFetch(`/${jobId}`, { method: "DELETE" });
183
+ },
184
+ };
185
+ }
@@ -176,7 +176,7 @@ export function createFFmpegProvider(
176
176
  "-b:v", `${preset.videoBitrate}`,
177
177
  "-maxrate", `${Math.round(preset.videoBitrate * 1.2)}`,
178
178
  "-bufsize", `${Math.round(preset.videoBitrate * 2)}`,
179
- "-r", `${Math.min(preset.maxFrameRate, 60)}`,
179
+ "-r", `${preset.maxFrameRate}`,
180
180
  "-c:a", "aac",
181
181
  "-b:a", `${preset.audioBitrate}`,
182
182
  "-ac", "2",
package/src/types.ts CHANGED
@@ -74,6 +74,30 @@ export const QUALITY_PRESETS: Record<string, QualityPreset> = {
74
74
  audioBitrate: 192_000,
75
75
  maxFrameRate: 60,
76
76
  },
77
+ "1440p": {
78
+ label: "1440p",
79
+ width: 2560,
80
+ height: 1440,
81
+ videoBitrate: 8_000_000,
82
+ audioBitrate: 192_000,
83
+ maxFrameRate: 60,
84
+ },
85
+ "4k": {
86
+ label: "4k",
87
+ width: 3840,
88
+ height: 2160,
89
+ videoBitrate: 16_000_000,
90
+ audioBitrate: 256_000,
91
+ maxFrameRate: 60,
92
+ },
93
+ "8k": {
94
+ label: "8k",
95
+ width: 7680,
96
+ height: 4320,
97
+ videoBitrate: 50_000_000,
98
+ audioBitrate: 320_000,
99
+ maxFrameRate: 60,
100
+ },
77
101
  };
78
102
 
79
103
  /** State of a transcoding job. */
@@ -88,6 +112,10 @@ export interface TranscodingJob {
88
112
  outputKeys: string[];
89
113
  /** Error message if status is "failed". */
90
114
  error?: string;
115
+ /** Externally-hosted playback URL (e.g. Cloudflare Stream HLS manifest). */
116
+ playbackUrl?: string;
117
+ /** Externally-hosted thumbnail URL. */
118
+ thumbnailUrl?: string;
91
119
  }
92
120
 
93
121
  /** Options controlling the transcoding output. */