@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.
- package/dist/ffutils.d.ts +39 -0
- package/dist/ffutils.d.ts.map +1 -0
- package/dist/ffutils.js +82 -0
- package/dist/ffutils.js.map +1 -0
- package/dist/hooks/video-processing.d.ts +47 -0
- package/dist/hooks/video-processing.d.ts.map +1 -0
- package/dist/hooks/video-processing.js +115 -0
- package/dist/hooks/video-processing.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/metadata.d.ts +19 -0
- package/dist/metadata.d.ts.map +1 -0
- package/dist/metadata.js +50 -0
- package/dist/metadata.js.map +1 -0
- package/dist/provider.d.ts +44 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +2 -0
- package/dist/provider.js.map +1 -0
- package/dist/providers/external.d.ts +40 -0
- package/dist/providers/external.d.ts.map +1 -0
- package/dist/providers/external.js +94 -0
- package/dist/providers/external.js.map +1 -0
- package/dist/providers/ffmpeg.d.ts +27 -0
- package/dist/providers/ffmpeg.d.ts.map +1 -0
- package/dist/providers/ffmpeg.js +282 -0
- package/dist/providers/ffmpeg.js.map +1 -0
- package/dist/providers/lambda.d.ts +49 -0
- package/dist/providers/lambda.d.ts.map +1 -0
- package/dist/providers/lambda.js +80 -0
- package/dist/providers/lambda.js.map +1 -0
- package/dist/react/index.d.ts +3 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +2 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/use-video-player.d.ts +110 -0
- package/dist/react/use-video-player.d.ts.map +1 -0
- package/dist/react/use-video-player.js +319 -0
- package/dist/react/use-video-player.js.map +1 -0
- package/dist/types.d.ts +90 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +45 -0
- package/dist/types.js.map +1 -0
- package/package.json +83 -0
- package/src/ffutils.ts +128 -0
- package/src/hooks/video-processing.ts +160 -0
- package/src/index.ts +18 -0
- package/src/metadata.ts +57 -0
- package/src/provider.ts +46 -0
- package/src/providers/external.ts +122 -0
- package/src/providers/ffmpeg.ts +365 -0
- package/src/providers/lambda.ts +112 -0
- package/src/react/index.ts +7 -0
- package/src/react/use-video-player.ts +444 -0
- 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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"}
|
package/dist/types.d.ts
ADDED
|
@@ -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
|
+
}
|