@uploadbox/video 0.4.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.
Files changed (56) hide show
  1. package/dist/ffutils.d.ts +39 -0
  2. package/dist/ffutils.d.ts.map +1 -0
  3. package/dist/ffutils.js +82 -0
  4. package/dist/ffutils.js.map +1 -0
  5. package/dist/hooks/video-processing.d.ts +47 -0
  6. package/dist/hooks/video-processing.d.ts.map +1 -0
  7. package/dist/hooks/video-processing.js +115 -0
  8. package/dist/hooks/video-processing.js.map +1 -0
  9. package/dist/index.d.ts +5 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +3 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/metadata.d.ts +19 -0
  14. package/dist/metadata.d.ts.map +1 -0
  15. package/dist/metadata.js +50 -0
  16. package/dist/metadata.js.map +1 -0
  17. package/dist/provider.d.ts +44 -0
  18. package/dist/provider.d.ts.map +1 -0
  19. package/dist/provider.js +2 -0
  20. package/dist/provider.js.map +1 -0
  21. package/dist/providers/external.d.ts +40 -0
  22. package/dist/providers/external.d.ts.map +1 -0
  23. package/dist/providers/external.js +94 -0
  24. package/dist/providers/external.js.map +1 -0
  25. package/dist/providers/ffmpeg.d.ts +27 -0
  26. package/dist/providers/ffmpeg.d.ts.map +1 -0
  27. package/dist/providers/ffmpeg.js +282 -0
  28. package/dist/providers/ffmpeg.js.map +1 -0
  29. package/dist/providers/lambda.d.ts +49 -0
  30. package/dist/providers/lambda.d.ts.map +1 -0
  31. package/dist/providers/lambda.js +80 -0
  32. package/dist/providers/lambda.js.map +1 -0
  33. package/dist/react/index.d.ts +3 -0
  34. package/dist/react/index.d.ts.map +1 -0
  35. package/dist/react/index.js +2 -0
  36. package/dist/react/index.js.map +1 -0
  37. package/dist/react/use-video-player.d.ts +110 -0
  38. package/dist/react/use-video-player.d.ts.map +1 -0
  39. package/dist/react/use-video-player.js +319 -0
  40. package/dist/react/use-video-player.js.map +1 -0
  41. package/dist/types.d.ts +90 -0
  42. package/dist/types.d.ts.map +1 -0
  43. package/dist/types.js +45 -0
  44. package/dist/types.js.map +1 -0
  45. package/package.json +83 -0
  46. package/src/ffutils.ts +128 -0
  47. package/src/hooks/video-processing.ts +160 -0
  48. package/src/index.ts +18 -0
  49. package/src/metadata.ts +57 -0
  50. package/src/provider.ts +46 -0
  51. package/src/providers/external.ts +122 -0
  52. package/src/providers/ffmpeg.ts +365 -0
  53. package/src/providers/lambda.ts +112 -0
  54. package/src/react/index.ts +7 -0
  55. package/src/react/use-video-player.ts +444 -0
  56. package/src/types.ts +130 -0
@@ -0,0 +1,319 @@
1
+ "use client";
2
+ import { useRef, useState, useEffect, useCallback } from "react";
3
+ /**
4
+ * Headless React hook for HLS video playback.
5
+ *
6
+ * Provides playback controls, quality switching, fullscreen, and sprite preview
7
+ * without any UI — you build your own player controls.
8
+ *
9
+ * Uses `hls.js` for adaptive streaming with a fallback to native `<video>` HLS
10
+ * support (Safari).
11
+ *
12
+ * @param src - URL to the HLS master playlist (.m3u8) or a regular video file.
13
+ * @param options - Configuration options.
14
+ *
15
+ * @example
16
+ * ```tsx
17
+ * import { useVideoPlayer } from "@uploadbox/video/react";
18
+ *
19
+ * function Player({ url }: { url: string }) {
20
+ * const player = useVideoPlayer(url);
21
+ *
22
+ * return (
23
+ * <div>
24
+ * <video ref={player.videoRef} />
25
+ * <button onClick={player.toggle}>
26
+ * {player.isPlaying ? "Pause" : "Play"}
27
+ * </button>
28
+ * <span>{player.currentTime} / {player.duration}</span>
29
+ * </div>
30
+ * );
31
+ * }
32
+ * ```
33
+ */
34
+ export function useVideoPlayer(src, options = {}) {
35
+ const { autoPlay = false, initialVolume = 1, spriteVttUrl } = options;
36
+ const videoRef = useRef(null);
37
+ const hlsRef = useRef(null);
38
+ const [isPlaying, setIsPlaying] = useState(false);
39
+ const [currentTime, setCurrentTime] = useState(0);
40
+ const [duration, setDuration] = useState(0);
41
+ const [volume, setVolumeState] = useState(initialVolume);
42
+ const [isMuted, setIsMuted] = useState(false);
43
+ const [playbackRate, setPlaybackRateState] = useState(1);
44
+ const [qualities, setQualities] = useState([]);
45
+ const [currentQuality, setCurrentQualityState] = useState(-1);
46
+ const [isFullscreen, setIsFullscreen] = useState(false);
47
+ const [isBuffering, setIsBuffering] = useState(false);
48
+ const [spriteCues, setSpriteCues] = useState([]);
49
+ // Parse sprite VTT
50
+ useEffect(() => {
51
+ if (!spriteVttUrl)
52
+ return;
53
+ fetch(spriteVttUrl)
54
+ .then((res) => res.text())
55
+ .then((text) => {
56
+ const cues = parseVtt(text, spriteVttUrl);
57
+ setSpriteCues(cues);
58
+ })
59
+ .catch(() => { });
60
+ }, [spriteVttUrl]);
61
+ // Setup HLS or native playback
62
+ useEffect(() => {
63
+ const video = videoRef.current;
64
+ if (!video || !src)
65
+ return;
66
+ let hls = null;
67
+ async function setup() {
68
+ const isHls = src.endsWith(".m3u8");
69
+ if (isHls && !video.canPlayType("application/vnd.apple.mpegurl")) {
70
+ // Use hls.js
71
+ try {
72
+ const HlsModule = await Function('return import("hls.js")')();
73
+ const Hls = HlsModule.default ?? HlsModule;
74
+ if (!Hls.isSupported()) {
75
+ console.warn("[uploadbox/video] HLS.js is not supported in this browser");
76
+ video.src = src;
77
+ return;
78
+ }
79
+ hls = new Hls({ enableWorker: true });
80
+ hlsRef.current = hls;
81
+ hls.loadSource(src);
82
+ hls.attachMedia(video);
83
+ hls.on(Hls.Events.MANIFEST_PARSED, () => {
84
+ const levels = hls.levels.map((level, index) => ({
85
+ index,
86
+ width: level.width,
87
+ height: level.height,
88
+ bitrate: level.bitrate,
89
+ label: `${level.height}p`,
90
+ }));
91
+ setQualities(levels);
92
+ if (autoPlay)
93
+ video.play().catch(() => { });
94
+ });
95
+ hls.on(Hls.Events.LEVEL_SWITCHED, (_, data) => {
96
+ setCurrentQualityState(data.level);
97
+ });
98
+ }
99
+ catch {
100
+ // hls.js not available, try native
101
+ video.src = src;
102
+ }
103
+ }
104
+ else {
105
+ // Native HLS (Safari) or regular video
106
+ video.src = src;
107
+ if (autoPlay)
108
+ video.play().catch(() => { });
109
+ }
110
+ }
111
+ setup();
112
+ return () => {
113
+ if (hls) {
114
+ hls.destroy();
115
+ hlsRef.current = null;
116
+ }
117
+ };
118
+ }, [src, autoPlay]);
119
+ // Video event listeners
120
+ useEffect(() => {
121
+ const video = videoRef.current;
122
+ if (!video)
123
+ return;
124
+ const onPlay = () => setIsPlaying(true);
125
+ const onPause = () => setIsPlaying(false);
126
+ const onTimeUpdate = () => setCurrentTime(video.currentTime);
127
+ const onDurationChange = () => setDuration(video.duration || 0);
128
+ const onVolumeChange = () => {
129
+ setVolumeState(video.volume);
130
+ setIsMuted(video.muted);
131
+ };
132
+ const onWaiting = () => setIsBuffering(true);
133
+ const onPlaying = () => setIsBuffering(false);
134
+ const onCanPlay = () => setIsBuffering(false);
135
+ video.addEventListener("play", onPlay);
136
+ video.addEventListener("pause", onPause);
137
+ video.addEventListener("timeupdate", onTimeUpdate);
138
+ video.addEventListener("durationchange", onDurationChange);
139
+ video.addEventListener("volumechange", onVolumeChange);
140
+ video.addEventListener("waiting", onWaiting);
141
+ video.addEventListener("playing", onPlaying);
142
+ video.addEventListener("canplay", onCanPlay);
143
+ // Set initial volume
144
+ video.volume = initialVolume;
145
+ return () => {
146
+ video.removeEventListener("play", onPlay);
147
+ video.removeEventListener("pause", onPause);
148
+ video.removeEventListener("timeupdate", onTimeUpdate);
149
+ video.removeEventListener("durationchange", onDurationChange);
150
+ video.removeEventListener("volumechange", onVolumeChange);
151
+ video.removeEventListener("waiting", onWaiting);
152
+ video.removeEventListener("playing", onPlaying);
153
+ video.removeEventListener("canplay", onCanPlay);
154
+ };
155
+ }, [initialVolume]);
156
+ // Fullscreen change listener
157
+ useEffect(() => {
158
+ const onFullscreenChange = () => {
159
+ setIsFullscreen(!!document.fullscreenElement);
160
+ };
161
+ document.addEventListener("fullscreenchange", onFullscreenChange);
162
+ return () => document.removeEventListener("fullscreenchange", onFullscreenChange);
163
+ }, []);
164
+ const play = useCallback(() => {
165
+ videoRef.current?.play().catch(() => { });
166
+ }, []);
167
+ const pause = useCallback(() => {
168
+ videoRef.current?.pause();
169
+ }, []);
170
+ const toggle = useCallback(() => {
171
+ const video = videoRef.current;
172
+ if (!video)
173
+ return;
174
+ if (video.paused)
175
+ video.play().catch(() => { });
176
+ else
177
+ video.pause();
178
+ }, []);
179
+ const seek = useCallback((time) => {
180
+ const video = videoRef.current;
181
+ if (video)
182
+ video.currentTime = time;
183
+ }, []);
184
+ const setVolume = useCallback((vol) => {
185
+ const video = videoRef.current;
186
+ if (video) {
187
+ video.volume = Math.max(0, Math.min(1, vol));
188
+ if (vol > 0)
189
+ video.muted = false;
190
+ }
191
+ }, []);
192
+ const toggleMute = useCallback(() => {
193
+ const video = videoRef.current;
194
+ if (video)
195
+ video.muted = !video.muted;
196
+ }, []);
197
+ const setPlaybackRate = useCallback((rate) => {
198
+ const video = videoRef.current;
199
+ if (video) {
200
+ video.playbackRate = rate;
201
+ setPlaybackRateState(rate);
202
+ }
203
+ }, []);
204
+ const setQuality = useCallback((index) => {
205
+ const hls = hlsRef.current;
206
+ if (hls) {
207
+ hls.currentLevel = index; // -1 = auto
208
+ setCurrentQualityState(index);
209
+ }
210
+ }, []);
211
+ const enterFullscreen = useCallback(() => {
212
+ const video = videoRef.current;
213
+ const container = video?.parentElement;
214
+ if (container?.requestFullscreen) {
215
+ container.requestFullscreen().catch(() => { });
216
+ }
217
+ }, []);
218
+ const exitFullscreen = useCallback(() => {
219
+ if (document.fullscreenElement) {
220
+ document.exitFullscreen().catch(() => { });
221
+ }
222
+ }, []);
223
+ const toggleFullscreen = useCallback(() => {
224
+ if (document.fullscreenElement)
225
+ exitFullscreen();
226
+ else
227
+ enterFullscreen();
228
+ }, [enterFullscreen, exitFullscreen]);
229
+ const getSpriteForTime = useCallback((time) => {
230
+ const cue = spriteCues.find((c) => time >= c.startTime && time < c.endTime);
231
+ if (!cue)
232
+ return null;
233
+ return {
234
+ url: cue.url,
235
+ x: cue.x,
236
+ y: cue.y,
237
+ width: cue.width,
238
+ height: cue.height,
239
+ };
240
+ }, [spriteCues]);
241
+ return {
242
+ videoRef,
243
+ isPlaying,
244
+ currentTime,
245
+ duration,
246
+ volume,
247
+ isMuted,
248
+ playbackRate,
249
+ qualities,
250
+ currentQuality,
251
+ isAutoQuality: currentQuality === -1,
252
+ isFullscreen,
253
+ isBuffering,
254
+ play,
255
+ pause,
256
+ toggle,
257
+ seek,
258
+ setVolume,
259
+ toggleMute,
260
+ setPlaybackRate,
261
+ setQuality,
262
+ enterFullscreen,
263
+ exitFullscreen,
264
+ toggleFullscreen,
265
+ getSpriteForTime,
266
+ };
267
+ }
268
+ /** Parse a WebVTT sprite sheet file. */
269
+ function parseVtt(text, baseUrl) {
270
+ const cues = [];
271
+ const lines = text.split("\n");
272
+ const baseDir = baseUrl.substring(0, baseUrl.lastIndexOf("/") + 1);
273
+ let i = 0;
274
+ // Skip header
275
+ while (i < lines.length && !lines[i].includes("-->"))
276
+ i++;
277
+ while (i < lines.length) {
278
+ const line = lines[i].trim();
279
+ if (line.includes("-->")) {
280
+ const [startStr, endStr] = line.split("-->").map((s) => s.trim());
281
+ const startTime = parseVttTimestamp(startStr);
282
+ const endTime = parseVttTimestamp(endStr);
283
+ i++;
284
+ const dataLine = lines[i]?.trim() ?? "";
285
+ // Parse: sprite-sheet.jpg#xywh=0,0,160,90
286
+ const hashIndex = dataLine.indexOf("#xywh=");
287
+ if (hashIndex !== -1) {
288
+ const file = dataLine.substring(0, hashIndex);
289
+ const coords = dataLine.substring(hashIndex + 6).split(",").map(Number);
290
+ if (coords.length === 4) {
291
+ cues.push({
292
+ startTime,
293
+ endTime,
294
+ url: file.startsWith("http") ? file : `${baseDir}${file}`,
295
+ x: coords[0],
296
+ y: coords[1],
297
+ width: coords[2],
298
+ height: coords[3],
299
+ });
300
+ }
301
+ }
302
+ }
303
+ i++;
304
+ }
305
+ return cues;
306
+ }
307
+ function parseVttTimestamp(ts) {
308
+ const parts = ts.split(":");
309
+ if (parts.length === 3) {
310
+ const [h, m, s] = parts;
311
+ return parseInt(h) * 3600 + parseInt(m) * 60 + parseFloat(s);
312
+ }
313
+ if (parts.length === 2) {
314
+ const [m, s] = parts;
315
+ return parseInt(m) * 60 + parseFloat(s);
316
+ }
317
+ return parseFloat(ts);
318
+ }
319
+ //# sourceMappingURL=use-video-player.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-video-player.js","sourceRoot":"","sources":["../../src/react/use-video-player.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ /** Extracted metadata from a video file. */
2
+ export interface VideoMetadata {
3
+ /** Video width in pixels. */
4
+ width: number;
5
+ /** Video height in pixels. */
6
+ height: number;
7
+ /** Duration in seconds. */
8
+ durationSeconds: number;
9
+ /** Video codec (e.g. "h264", "vp9"). */
10
+ codec: string;
11
+ /** Frame rate (e.g. 30, 60). */
12
+ frameRate: number;
13
+ /** Video bitrate in bits per second. */
14
+ bitrate: number;
15
+ /** Audio stream information, if present. */
16
+ audio?: {
17
+ codec: string;
18
+ sampleRate: number;
19
+ channels: number;
20
+ bitrate: number;
21
+ };
22
+ }
23
+ /** Status of a transcoding job. */
24
+ export type TranscodingStatus = "pending" | "processing" | "completed" | "failed";
25
+ /** A quality preset for HLS adaptive bitrate streaming. */
26
+ export interface QualityPreset {
27
+ /** Human-readable label (e.g. "720p"). */
28
+ label: string;
29
+ /** Output width in pixels. */
30
+ width: number;
31
+ /** Output height in pixels. */
32
+ height: number;
33
+ /** Target video bitrate in bits per second. */
34
+ videoBitrate: number;
35
+ /** Target audio bitrate in bits per second. */
36
+ audioBitrate: number;
37
+ /** Maximum frame rate. Source frame rate is used if lower. */
38
+ maxFrameRate: number;
39
+ }
40
+ /** Built-in quality presets for HLS transcoding. */
41
+ export declare const QUALITY_PRESETS: Record<string, QualityPreset>;
42
+ /** State of a transcoding job. */
43
+ export interface TranscodingJob {
44
+ /** Unique identifier for this job. */
45
+ jobId: string;
46
+ /** Current status. */
47
+ status: TranscodingStatus;
48
+ /** Progress percentage (0–100). */
49
+ progress: number;
50
+ /** S3 keys for generated outputs (playlists, segments, thumbnails). */
51
+ outputKeys: string[];
52
+ /** Error message if status is "failed". */
53
+ error?: string;
54
+ }
55
+ /** Options controlling the transcoding output. */
56
+ export interface TranscodingOptions {
57
+ /** Quality presets to generate. Defaults to all QUALITY_PRESETS. */
58
+ qualities?: QualityPreset[];
59
+ /** HLS segment duration in seconds. @default 6 */
60
+ segmentDuration?: number;
61
+ /** Whether to generate a poster thumbnail. @default true */
62
+ generateThumbnail?: boolean;
63
+ /** Whether to generate a sprite sheet with WebVTT. @default true */
64
+ generateSpriteSheet?: boolean;
65
+ /** S3 key prefix for output files. */
66
+ s3OutputPrefix: string;
67
+ }
68
+ /** Progress callback payload. */
69
+ export interface TranscodingProgress {
70
+ /** Job identifier. */
71
+ jobId: string;
72
+ /** Overall progress percentage (0–100). */
73
+ percent: number;
74
+ /** Quality preset currently being transcoded. */
75
+ currentQuality?: string;
76
+ /** Human-readable status message. */
77
+ message?: string;
78
+ }
79
+ /** Callback invoked during transcoding to report progress. */
80
+ export type TranscodingProgressCallback = (progress: TranscodingProgress) => void;
81
+ /** CDN cache header presets for HLS content. */
82
+ export declare const CDN_CACHE_HEADERS: {
83
+ /** HLS segments (.ts): immutable, cache for 1 year. */
84
+ readonly segment: "public, max-age=31536000, immutable";
85
+ /** HLS playlists (.m3u8): short TTL for live-like updates. */
86
+ readonly playlist: "public, max-age=60";
87
+ /** Thumbnails and sprite sheets: cache for 1 day. */
88
+ readonly thumbnail: "public, max-age=86400";
89
+ };
90
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +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"}
package/dist/types.js ADDED
@@ -0,0 +1,45 @@
1
+ /** Built-in quality presets for HLS transcoding. */
2
+ export const QUALITY_PRESETS = {
3
+ "360p": {
4
+ label: "360p",
5
+ width: 640,
6
+ height: 360,
7
+ videoBitrate: 600_000,
8
+ audioBitrate: 64_000,
9
+ maxFrameRate: 30,
10
+ },
11
+ "480p": {
12
+ label: "480p",
13
+ width: 854,
14
+ height: 480,
15
+ videoBitrate: 1_500_000,
16
+ audioBitrate: 128_000,
17
+ maxFrameRate: 30,
18
+ },
19
+ "720p": {
20
+ label: "720p",
21
+ width: 1280,
22
+ height: 720,
23
+ videoBitrate: 3_000_000,
24
+ audioBitrate: 128_000,
25
+ maxFrameRate: 60,
26
+ },
27
+ "1080p": {
28
+ label: "1080p",
29
+ width: 1920,
30
+ height: 1080,
31
+ videoBitrate: 5_000_000,
32
+ audioBitrate: 192_000,
33
+ maxFrameRate: 60,
34
+ },
35
+ };
36
+ /** CDN cache header presets for HLS content. */
37
+ export const CDN_CACHE_HEADERS = {
38
+ /** HLS segments (.ts): immutable, cache for 1 year. */
39
+ segment: "public, max-age=31536000, immutable",
40
+ /** HLS playlists (.m3u8): short TTL for live-like updates. */
41
+ playlist: "public, max-age=60",
42
+ /** Thumbnails and sprite sheets: cache for 1 day. */
43
+ thumbnail: "public, max-age=86400",
44
+ };
45
+ //# sourceMappingURL=types.js.map
@@ -0,0 +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"}
package/package.json ADDED
@@ -0,0 +1,83 @@
1
+ {
2
+ "name": "@uploadbox/video",
3
+ "version": "0.4.0",
4
+ "private": false,
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ },
13
+ "./react": {
14
+ "types": "./dist/react/index.d.ts",
15
+ "import": "./dist/react/index.js"
16
+ },
17
+ "./hooks/video-processing": {
18
+ "types": "./dist/hooks/video-processing.d.ts",
19
+ "import": "./dist/hooks/video-processing.js"
20
+ },
21
+ "./providers/ffmpeg": {
22
+ "types": "./dist/providers/ffmpeg.d.ts",
23
+ "import": "./dist/providers/ffmpeg.js"
24
+ },
25
+ "./providers/lambda": {
26
+ "types": "./dist/providers/lambda.d.ts",
27
+ "import": "./dist/providers/lambda.js"
28
+ },
29
+ "./providers/external": {
30
+ "types": "./dist/providers/external.d.ts",
31
+ "import": "./dist/providers/external.js"
32
+ }
33
+ },
34
+ "dependencies": {
35
+ "@aws-sdk/client-s3": "^3.700.0",
36
+ "@uploadbox/core": "0.4.0"
37
+ },
38
+ "peerDependencies": {
39
+ "react": "^18.0.0 || ^19.0.0",
40
+ "hls.js": "^1.5.0"
41
+ },
42
+ "peerDependenciesMeta": {
43
+ "react": {
44
+ "optional": true
45
+ },
46
+ "hls.js": {
47
+ "optional": true
48
+ }
49
+ },
50
+ "devDependencies": {
51
+ "typescript": "^5.7.0",
52
+ "@types/node": "^22.0.0",
53
+ "@types/react": "^19.0.0"
54
+ },
55
+ "description": "Video streaming SDK for Uploadbox — HLS transcoding, metadata extraction, and headless player hook",
56
+ "keywords": [
57
+ "uploadbox",
58
+ "video",
59
+ "hls",
60
+ "streaming",
61
+ "transcoding",
62
+ "s3"
63
+ ],
64
+ "license": "MIT",
65
+ "repository": {
66
+ "type": "git",
67
+ "url": "https://github.com/federicostarace/uploadbox",
68
+ "directory": "packages/video"
69
+ },
70
+ "files": [
71
+ "dist",
72
+ "src"
73
+ ],
74
+ "publishConfig": {
75
+ "access": "public"
76
+ },
77
+ "scripts": {
78
+ "build": "tsc",
79
+ "dev": "tsc --watch",
80
+ "typecheck": "tsc --noEmit",
81
+ "clean": "rm -rf dist"
82
+ }
83
+ }