@remotion/media-parser 4.0.266 → 4.0.268
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/containers/flac/get-channel-count.d.ts +1 -1
- package/dist/containers/m3u/get-streams.d.ts +10 -0
- package/dist/containers/m3u/get-streams.js +20 -0
- package/dist/containers/m3u/parse-directive.js +8 -0
- package/dist/containers/m3u/parse-m3u-media-directive.d.ts +2 -0
- package/dist/containers/m3u/parse-m3u-media-directive.js +31 -0
- package/dist/containers/m3u/parse-stream-inf.js +1 -0
- package/dist/containers/m3u/types.d.ts +15 -1
- package/dist/containers/mp3/get-duration.js +4 -3
- package/dist/containers/mp3/parse-mpeg-header.js +57 -40
- package/dist/containers/webm/get-ready-tracks.d.ts +9 -2
- package/dist/containers/webm/get-ready-tracks.js +43 -8
- package/dist/containers/webm/get-sample-from-block.js +19 -0
- package/dist/containers/webm/make-track.d.ts +1 -0
- package/dist/containers/webm/make-track.js +9 -8
- package/dist/esm/{from-fetch.mjs → fetch.mjs} +33 -129
- package/dist/esm/index.mjs +896 -740
- package/dist/esm/node-writer.mjs +113 -0
- package/dist/esm/node.mjs +37 -106
- package/dist/fetch.d.ts +1 -0
- package/dist/fetch.js +17 -0
- package/dist/get-tracks.js +7 -14
- package/dist/has-all-info.js +7 -3
- package/dist/index.d.ts +4 -0
- package/dist/internal-parse-media.js +1 -1
- package/dist/make-hvc1-codec-strings.js +3 -3
- package/dist/node-writer.d.ts +1 -0
- package/dist/node-writer.js +17 -0
- package/dist/node.d.ts +1 -0
- package/dist/node.js +17 -0
- package/dist/readers/fetch/get-body-and-reader.d.ts +6 -1
- package/dist/readers/fetch/get-body-and-reader.js +9 -7
- package/dist/readers/from-fetch.js +16 -5
- package/dist/state/mp3.d.ts +5 -1
- package/dist/state/mp3.js +6 -0
- package/dist/state/parser-state.d.ts +6 -2
- package/dist/state/webm.d.ts +4 -0
- package/dist/state/webm.js +10 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/web-file.d.ts +1 -0
- package/dist/web-file.js +17 -0
- package/package.json +32 -32
- package/dist/containers/flac/m3u/after-manifest-fetch.d.ts +0 -14
- package/dist/containers/flac/m3u/after-manifest-fetch.js +0 -53
- package/dist/containers/flac/m3u/fetch-m3u8-stream.d.ts +0 -3
- package/dist/containers/flac/m3u/fetch-m3u8-stream.js +0 -15
- package/dist/containers/flac/m3u/get-chunks.d.ts +0 -6
- package/dist/containers/flac/m3u/get-chunks.js +0 -20
- package/dist/containers/flac/m3u/get-duration-from-m3u.d.ts +0 -2
- package/dist/containers/flac/m3u/get-duration-from-m3u.js +0 -9
- package/dist/containers/flac/m3u/get-playlist.d.ts +0 -3
- package/dist/containers/flac/m3u/get-playlist.js +0 -19
- package/dist/containers/flac/m3u/get-streams.d.ts +0 -13
- package/dist/containers/flac/m3u/get-streams.js +0 -41
- package/dist/containers/flac/m3u/parse-directive.d.ts +0 -2
- package/dist/containers/flac/m3u/parse-directive.js +0 -64
- package/dist/containers/flac/m3u/parse-m3u-manifest.d.ts +0 -8
- package/dist/containers/flac/m3u/parse-m3u-manifest.js +0 -18
- package/dist/containers/flac/m3u/parse-m3u.d.ts +0 -4
- package/dist/containers/flac/m3u/parse-m3u.js +0 -35
- package/dist/containers/flac/m3u/parse-m3u8-text.d.ts +0 -2
- package/dist/containers/flac/m3u/parse-m3u8-text.js +0 -23
- package/dist/containers/flac/m3u/parse-stream-inf.d.ts +0 -3
- package/dist/containers/flac/m3u/parse-stream-inf.js +0 -61
- package/dist/containers/flac/m3u/return-packets.d.ts +0 -14
- package/dist/containers/flac/m3u/return-packets.js +0 -63
- package/dist/containers/flac/m3u/select-stream.d.ts +0 -10
- package/dist/containers/flac/m3u/select-stream.js +0 -15
- package/dist/containers/flac/m3u/types.d.ts +0 -48
- package/dist/containers/flac/m3u/types.js +0 -2
- package/dist/containers/mp3/get-tracks-from-mp3.d.ts +0 -4
- package/dist/containers/mp3/get-tracks-from-mp3.js +0 -25
- package/dist/does-need-contentlength-contentrange.d.ts +0 -2
- package/dist/does-need-contentlength-contentrange.js +0 -10
- package/dist/esm/from-node.mjs +0 -44
- package/dist/readers/from-uintarray.d.ts +0 -2
- package/dist/readers/from-uintarray.js +0 -27
- /package/dist/esm/{from-web-file.mjs → web-file.mjs} +0 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
// src/writers/node.ts
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
|
|
4
|
+
// src/log.ts
|
|
5
|
+
var logLevels = ["trace", "verbose", "info", "warn", "error"];
|
|
6
|
+
var getNumberForLogLevel = (level) => {
|
|
7
|
+
return logLevels.indexOf(level);
|
|
8
|
+
};
|
|
9
|
+
var isEqualOrBelowLogLevel = (currentLevel, level) => {
|
|
10
|
+
return getNumberForLogLevel(currentLevel) <= getNumberForLogLevel(level);
|
|
11
|
+
};
|
|
12
|
+
var Log = {
|
|
13
|
+
trace: (logLevel, ...args) => {
|
|
14
|
+
if (isEqualOrBelowLogLevel(logLevel, "trace")) {
|
|
15
|
+
return console.log(...args);
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
verbose: (logLevel, ...args) => {
|
|
19
|
+
if (isEqualOrBelowLogLevel(logLevel, "verbose")) {
|
|
20
|
+
return console.log(...args);
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
info: (logLevel, ...args) => {
|
|
24
|
+
if (isEqualOrBelowLogLevel(logLevel, "info")) {
|
|
25
|
+
return console.log(...args);
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
warn: (logLevel, ...args) => {
|
|
29
|
+
if (isEqualOrBelowLogLevel(logLevel, "warn")) {
|
|
30
|
+
return console.warn(...args);
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
error: (...args) => {
|
|
34
|
+
return console.error(...args);
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
// src/writers/node.ts
|
|
39
|
+
var createContent = (filename) => {
|
|
40
|
+
return async ({ logLevel }) => {
|
|
41
|
+
let writPromise = Promise.resolve();
|
|
42
|
+
const remove = async () => {
|
|
43
|
+
Log.verbose(logLevel, "Removing file", filename);
|
|
44
|
+
await fs.promises.unlink(filename).catch(() => {
|
|
45
|
+
});
|
|
46
|
+
};
|
|
47
|
+
await remove();
|
|
48
|
+
if (!fs.existsSync(filename)) {
|
|
49
|
+
Log.verbose(logLevel, "Creating file", filename);
|
|
50
|
+
fs.writeFileSync(filename, "");
|
|
51
|
+
}
|
|
52
|
+
const writeStream = fs.openSync(filename, "w");
|
|
53
|
+
let written = 0;
|
|
54
|
+
const write = async (data) => {
|
|
55
|
+
await new Promise((resolve, reject) => {
|
|
56
|
+
fs.write(writeStream, data, 0, data.length, undefined, (err) => {
|
|
57
|
+
if (err) {
|
|
58
|
+
reject(err);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
Log.verbose(logLevel, "Wrote", data.length, "bytes to", filename);
|
|
62
|
+
resolve();
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
written += data.byteLength;
|
|
66
|
+
};
|
|
67
|
+
const updateDataAt = (position, data) => {
|
|
68
|
+
return new Promise((resolve, reject) => {
|
|
69
|
+
fs.write(writeStream, data, 0, data.length, position, (err) => {
|
|
70
|
+
if (err) {
|
|
71
|
+
reject(err);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
Log.verbose(logLevel, "Wrote", data.length, "bytes to", filename, "at position", position);
|
|
75
|
+
resolve();
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
};
|
|
79
|
+
const writer = {
|
|
80
|
+
write: (arr) => {
|
|
81
|
+
writPromise = writPromise.then(() => write(arr));
|
|
82
|
+
return writPromise;
|
|
83
|
+
},
|
|
84
|
+
updateDataAt: (position, data) => {
|
|
85
|
+
writPromise = writPromise.then(() => updateDataAt(position, data));
|
|
86
|
+
return writPromise;
|
|
87
|
+
},
|
|
88
|
+
getWrittenByteCount: () => written,
|
|
89
|
+
remove,
|
|
90
|
+
finish: async () => {
|
|
91
|
+
await writPromise;
|
|
92
|
+
try {
|
|
93
|
+
Log.verbose(logLevel, "Closing file", filename);
|
|
94
|
+
fs.closeSync(writeStream);
|
|
95
|
+
return Promise.resolve();
|
|
96
|
+
} catch (e) {
|
|
97
|
+
return Promise.reject(e);
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
getBlob: async () => {
|
|
101
|
+
const file = await fs.promises.readFile(filename);
|
|
102
|
+
return new Blob([file]);
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
return writer;
|
|
106
|
+
};
|
|
107
|
+
};
|
|
108
|
+
var nodeWriter = (path) => {
|
|
109
|
+
return { createContent: createContent(path) };
|
|
110
|
+
};
|
|
111
|
+
export {
|
|
112
|
+
nodeWriter
|
|
113
|
+
};
|
package/dist/esm/node.mjs
CHANGED
|
@@ -1,113 +1,44 @@
|
|
|
1
|
-
// src/
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
var
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
var isEqualOrBelowLogLevel = (currentLevel, level) => {
|
|
10
|
-
return getNumberForLogLevel(currentLevel) <= getNumberForLogLevel(level);
|
|
11
|
-
};
|
|
12
|
-
var Log = {
|
|
13
|
-
trace: (logLevel, ...args) => {
|
|
14
|
-
if (isEqualOrBelowLogLevel(logLevel, "trace")) {
|
|
15
|
-
return console.log(...args);
|
|
16
|
-
}
|
|
17
|
-
},
|
|
18
|
-
verbose: (logLevel, ...args) => {
|
|
19
|
-
if (isEqualOrBelowLogLevel(logLevel, "verbose")) {
|
|
20
|
-
return console.log(...args);
|
|
21
|
-
}
|
|
22
|
-
},
|
|
23
|
-
info: (logLevel, ...args) => {
|
|
24
|
-
if (isEqualOrBelowLogLevel(logLevel, "info")) {
|
|
25
|
-
return console.log(...args);
|
|
26
|
-
}
|
|
27
|
-
},
|
|
28
|
-
warn: (logLevel, ...args) => {
|
|
29
|
-
if (isEqualOrBelowLogLevel(logLevel, "warn")) {
|
|
30
|
-
return console.warn(...args);
|
|
31
|
-
}
|
|
32
|
-
},
|
|
33
|
-
error: (...args) => {
|
|
34
|
-
return console.error(...args);
|
|
35
|
-
}
|
|
36
|
-
};
|
|
37
|
-
|
|
38
|
-
// src/writers/node.ts
|
|
39
|
-
var createContent = (filename) => {
|
|
40
|
-
return async ({ logLevel }) => {
|
|
41
|
-
let writPromise = Promise.resolve();
|
|
42
|
-
const remove = async () => {
|
|
43
|
-
Log.verbose(logLevel, "Removing file", filename);
|
|
44
|
-
await fs.promises.unlink(filename).catch(() => {
|
|
45
|
-
});
|
|
46
|
-
};
|
|
47
|
-
await remove();
|
|
48
|
-
if (!fs.existsSync(filename)) {
|
|
49
|
-
Log.verbose(logLevel, "Creating file", filename);
|
|
50
|
-
fs.writeFileSync(filename, "");
|
|
1
|
+
// src/readers/from-node.ts
|
|
2
|
+
import { createReadStream, statSync } from "fs";
|
|
3
|
+
import { sep } from "path";
|
|
4
|
+
import { Readable } from "stream";
|
|
5
|
+
var nodeReader = {
|
|
6
|
+
read: ({ src, range, controller }) => {
|
|
7
|
+
if (typeof src !== "string") {
|
|
8
|
+
throw new Error("src must be a string when using `nodeReader`");
|
|
51
9
|
}
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
};
|
|
67
|
-
const updateDataAt = (position, data) => {
|
|
68
|
-
return new Promise((resolve, reject) => {
|
|
69
|
-
fs.write(writeStream, data, 0, data.length, position, (err) => {
|
|
70
|
-
if (err) {
|
|
71
|
-
reject(err);
|
|
72
|
-
return;
|
|
73
|
-
}
|
|
74
|
-
Log.verbose(logLevel, "Wrote", data.length, "bytes to", filename, "at position", position);
|
|
75
|
-
resolve();
|
|
10
|
+
const ownController = new AbortController;
|
|
11
|
+
const stream = createReadStream(src, {
|
|
12
|
+
start: range === null ? 0 : typeof range === "number" ? range : range[0],
|
|
13
|
+
end: range === null ? Infinity : typeof range === "number" ? Infinity : range[1],
|
|
14
|
+
signal: ownController.signal
|
|
15
|
+
});
|
|
16
|
+
controller._internals.signal.addEventListener("abort", () => {
|
|
17
|
+
ownController.abort();
|
|
18
|
+
}, { once: true });
|
|
19
|
+
const stats = statSync(src);
|
|
20
|
+
const reader = Readable.toWeb(stream).getReader();
|
|
21
|
+
if (controller) {
|
|
22
|
+
controller._internals.signal.addEventListener("abort", () => {
|
|
23
|
+
reader.cancel().catch(() => {
|
|
76
24
|
});
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
updateDataAt: (position, data) => {
|
|
85
|
-
writPromise = writPromise.then(() => updateDataAt(position, data));
|
|
86
|
-
return writPromise;
|
|
87
|
-
},
|
|
88
|
-
getWrittenByteCount: () => written,
|
|
89
|
-
remove,
|
|
90
|
-
finish: async () => {
|
|
91
|
-
await writPromise;
|
|
92
|
-
try {
|
|
93
|
-
Log.verbose(logLevel, "Closing file", filename);
|
|
94
|
-
fs.closeSync(writeStream);
|
|
95
|
-
return Promise.resolve();
|
|
96
|
-
} catch (e) {
|
|
97
|
-
return Promise.reject(e);
|
|
25
|
+
}, { once: true });
|
|
26
|
+
}
|
|
27
|
+
return Promise.resolve({
|
|
28
|
+
reader: {
|
|
29
|
+
reader,
|
|
30
|
+
abort: () => {
|
|
31
|
+
ownController.abort();
|
|
98
32
|
}
|
|
99
33
|
},
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
}
|
|
107
|
-
};
|
|
108
|
-
var nodeWriter = (path) => {
|
|
109
|
-
return { createContent: createContent(path) };
|
|
34
|
+
contentLength: stats.size,
|
|
35
|
+
contentType: null,
|
|
36
|
+
name: src.split(sep).pop(),
|
|
37
|
+
supportsContentRange: true,
|
|
38
|
+
needsContentRange: true
|
|
39
|
+
});
|
|
40
|
+
}
|
|
110
41
|
};
|
|
111
42
|
export {
|
|
112
|
-
|
|
43
|
+
nodeReader
|
|
113
44
|
};
|
package/dist/fetch.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './readers/from-fetch';
|
package/dist/fetch.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./readers/from-fetch"), exports);
|
package/dist/get-tracks.js
CHANGED
|
@@ -6,7 +6,6 @@ const traversal_1 = require("./containers/iso-base-media/traversal");
|
|
|
6
6
|
const get_tracks_from_avi_1 = require("./containers/riff/get-tracks-from-avi");
|
|
7
7
|
const get_tracks_1 = require("./containers/transport-stream/get-tracks");
|
|
8
8
|
const get_ready_tracks_1 = require("./containers/webm/get-ready-tracks");
|
|
9
|
-
const traversal_2 = require("./containers/webm/traversal");
|
|
10
9
|
const getNumberOfTracks = (moovBox) => {
|
|
11
10
|
const mvHdBox = (0, traversal_1.getMvhdBox)(moovBox);
|
|
12
11
|
if (!mvHdBox) {
|
|
@@ -22,11 +21,7 @@ exports.isoBaseMediaHasTracks = isoBaseMediaHasTracks;
|
|
|
22
21
|
const getHasTracks = (state) => {
|
|
23
22
|
const structure = state.getStructure();
|
|
24
23
|
if (structure.type === 'matroska') {
|
|
25
|
-
|
|
26
|
-
if (!mainSegment) {
|
|
27
|
-
return false;
|
|
28
|
-
}
|
|
29
|
-
return (0, traversal_2.getTracksSegment)(mainSegment) !== null;
|
|
24
|
+
return (0, get_ready_tracks_1.matroskaHasTracks)(state);
|
|
30
25
|
}
|
|
31
26
|
if (structure.type === 'iso-base-media') {
|
|
32
27
|
return (0, exports.isoBaseMediaHasTracks)(state);
|
|
@@ -55,16 +50,14 @@ const getHasTracks = (state) => {
|
|
|
55
50
|
throw new Error('Unknown container ' + structure);
|
|
56
51
|
};
|
|
57
52
|
exports.getHasTracks = getHasTracks;
|
|
58
|
-
const
|
|
53
|
+
const getCategorizedTracksFromMatroska = (state) => {
|
|
59
54
|
const videoTracks = [];
|
|
60
55
|
const audioTracks = [];
|
|
61
56
|
const otherTracks = [];
|
|
62
|
-
const
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
const matroskaTracks = (0, get_ready_tracks_1.getTracksFromMatroska)(mainSegment, state.webm.getTimescale());
|
|
67
|
-
for (const track of matroskaTracks) {
|
|
57
|
+
const { resolved } = (0, get_ready_tracks_1.getTracksFromMatroska)({
|
|
58
|
+
state,
|
|
59
|
+
});
|
|
60
|
+
for (const track of resolved) {
|
|
68
61
|
if (track.type === 'video') {
|
|
69
62
|
videoTracks.push(track);
|
|
70
63
|
}
|
|
@@ -141,7 +134,7 @@ exports.defaultHasallTracks = defaultHasallTracks;
|
|
|
141
134
|
const getTracks = (state) => {
|
|
142
135
|
const structure = state.getStructure();
|
|
143
136
|
if (structure.type === 'matroska') {
|
|
144
|
-
return
|
|
137
|
+
return getCategorizedTracksFromMatroska(state);
|
|
145
138
|
}
|
|
146
139
|
if (structure.type === 'iso-base-media') {
|
|
147
140
|
return (0, exports.getTracksFromIsoBaseMedia)(state);
|
package/dist/has-all-info.js
CHANGED
|
@@ -107,8 +107,12 @@ const hasAllInfo = ({ fields, state, }) => {
|
|
|
107
107
|
if (!Object.values(availableInfo).every(Boolean)) {
|
|
108
108
|
return false;
|
|
109
109
|
}
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
110
|
+
if ((0, may_skip_video_data_1.maySkipVideoData)({ state })) {
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
if (state.callbacks.canSkipTracksState.canSkipTracks()) {
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
return false;
|
|
113
117
|
};
|
|
114
118
|
exports.hasAllInfo = hasAllInfo;
|
package/dist/index.d.ts
CHANGED
|
@@ -881,6 +881,8 @@ export declare const MediaParserInternals: {
|
|
|
881
881
|
addCluster: (cluster: import("./state/webm").ClusterSection) => void;
|
|
882
882
|
isInsideSegment: (iterator: import("./buffer-iterator").BufferIterator) => import("./state/webm").SegmentSection | null;
|
|
883
883
|
isInsideCluster: (iterator: import("./buffer-iterator").BufferIterator) => import("./state/webm").ClusterSection | null;
|
|
884
|
+
setAvcProfileForTrackNumber: (trackNumber: number, avcProfile: import("./containers/avc/parse-avc").AvcProfileInfo) => void;
|
|
885
|
+
getAvcProfileForTrackNumber: (trackNumber: number) => import("./containers/avc/parse-avc").AvcProfileInfo | null;
|
|
884
886
|
};
|
|
885
887
|
iso: {
|
|
886
888
|
flatSamples: {
|
|
@@ -895,6 +897,8 @@ export declare const MediaParserInternals: {
|
|
|
895
897
|
mp3Info: {
|
|
896
898
|
getMp3Info: () => import("./state/mp3").Mp3Info | null;
|
|
897
899
|
setMp3Info: (info: import("./state/mp3").Mp3Info) => void;
|
|
900
|
+
getCbrMp3Info: () => import("./state/mp3").Mp3CbrInfo | null;
|
|
901
|
+
setCbrMp3Info: (info: import("./state/mp3").Mp3CbrInfo) => void;
|
|
898
902
|
};
|
|
899
903
|
aac: {
|
|
900
904
|
addSample: ({ offset, size }: {
|
|
@@ -26,7 +26,7 @@ const internalParseMedia = async function ({ src, fields: _fieldsInReturnValue,
|
|
|
26
26
|
log_1.Log.verbose(logLevel, `Reading ${typeof src === 'string' ? src : src.name}`);
|
|
27
27
|
const { reader: readerInstance, contentLength, name, contentType, supportsContentRange, needsContentRange, } = await readerInterface.read({ src, range: null, controller });
|
|
28
28
|
if (contentLength === null) {
|
|
29
|
-
throw new Error(
|
|
29
|
+
throw new Error(`Cannot read media ${src} without a content length. This is currently not supported. Ensure the media has a "Content-Length" HTTP header.`);
|
|
30
30
|
}
|
|
31
31
|
if (!supportsContentRange && needsContentRange) {
|
|
32
32
|
throw new Error('Cannot read media without it supporting the "Content-Range" header. This is currently not supported. Ensure the media supports the "Content-Range" HTTP header.');
|
|
@@ -12,8 +12,8 @@ const getHvc1CodecString = (data) => {
|
|
|
12
12
|
// unsigned int(1) general_tier_flag;
|
|
13
13
|
// unsigned int(5) general_profile_idc;
|
|
14
14
|
const generalProfileSpace = generalProfileSpaceTierFlagAndIdc >> 6;
|
|
15
|
-
const generalTierFlag = generalProfileSpaceTierFlagAndIdc >> 5;
|
|
16
|
-
const generalProfileIdc = generalProfileSpaceTierFlagAndIdc
|
|
15
|
+
const generalTierFlag = (generalProfileSpaceTierFlagAndIdc & 0x20) >> 5;
|
|
16
|
+
const generalProfileIdc = generalProfileSpaceTierFlagAndIdc & 0x1f;
|
|
17
17
|
// general_constraint_indicator_flags(48)
|
|
18
18
|
const generalConstraintIndicator = data.getSlice(6);
|
|
19
19
|
const generalLevelIdc = data.getUint8();
|
|
@@ -42,6 +42,6 @@ const getHvc1CodecString = (data) => {
|
|
|
42
42
|
hasByte = true;
|
|
43
43
|
}
|
|
44
44
|
}
|
|
45
|
-
return `${profileSpaceChar}${generalProfileIdc.toString(16)}.${profileId.toString(16)}.${generalTierChar}${generalLevelIdc}
|
|
45
|
+
return `${profileSpaceChar}${generalProfileIdc.toString(16)}.${profileId.toString(16)}.${generalTierChar}${generalLevelIdc}${generalConstraintString ? '.' : ''}${generalConstraintString}`;
|
|
46
46
|
};
|
|
47
47
|
exports.getHvc1CodecString = getHvc1CodecString;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './writers/node';
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./writers/node"), exports);
|
package/dist/node.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './readers/from-node';
|
package/dist/node.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./readers/from-node"), exports);
|
|
@@ -4,5 +4,10 @@ type ReturnType = {
|
|
|
4
4
|
contentLength: number | null;
|
|
5
5
|
needsContentRange: boolean;
|
|
6
6
|
};
|
|
7
|
-
export declare const getLengthAndReader: (
|
|
7
|
+
export declare const getLengthAndReader: ({ canLiveWithoutContentLength, res, ownController, requestedWithoutRange, }: {
|
|
8
|
+
canLiveWithoutContentLength: boolean;
|
|
9
|
+
res: Response;
|
|
10
|
+
ownController: AbortController;
|
|
11
|
+
requestedWithoutRange: boolean;
|
|
12
|
+
}) => Promise<ReturnType>;
|
|
8
13
|
export {};
|
|
@@ -1,17 +1,21 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getLengthAndReader = void 0;
|
|
4
|
-
const getLengthAndReader = async (
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
const getLengthAndReader = async ({ canLiveWithoutContentLength, res, ownController, requestedWithoutRange, }) => {
|
|
5
|
+
const length = res.headers.get('content-length');
|
|
6
|
+
const contentLength = length === null ? null : parseInt(length, 10);
|
|
7
|
+
if (requestedWithoutRange ||
|
|
8
|
+
(canLiveWithoutContentLength && contentLength === null)) {
|
|
9
|
+
const buffer = await res.arrayBuffer();
|
|
10
|
+
const encoded = new Uint8Array(buffer);
|
|
7
11
|
const stream = new ReadableStream({
|
|
8
12
|
start(controller) {
|
|
9
|
-
controller.enqueue(
|
|
13
|
+
controller.enqueue(encoded);
|
|
10
14
|
controller.close();
|
|
11
15
|
},
|
|
12
16
|
});
|
|
13
17
|
return {
|
|
14
|
-
contentLength:
|
|
18
|
+
contentLength: encoded.byteLength,
|
|
15
19
|
reader: {
|
|
16
20
|
reader: stream.getReader(),
|
|
17
21
|
abort() {
|
|
@@ -21,8 +25,6 @@ const getLengthAndReader = async (endsWithM3u8, res, ownController) => {
|
|
|
21
25
|
needsContentRange: false,
|
|
22
26
|
};
|
|
23
27
|
}
|
|
24
|
-
const length = res.headers.get('content-length');
|
|
25
|
-
const contentLength = length === null ? null : parseInt(length, 10);
|
|
26
28
|
if (!res.body) {
|
|
27
29
|
throw new Error('No body');
|
|
28
30
|
}
|
|
@@ -27,7 +27,7 @@ function parseContentRange(input) {
|
|
|
27
27
|
}
|
|
28
28
|
return range;
|
|
29
29
|
}
|
|
30
|
-
const validateContentRangeAndDetectIfSupported = (actualRange, parsedContentRange, statusCode) => {
|
|
30
|
+
const validateContentRangeAndDetectIfSupported = ({ actualRange, parsedContentRange, statusCode, }) => {
|
|
31
31
|
if (statusCode === 206) {
|
|
32
32
|
return { supportsContentRange: true };
|
|
33
33
|
}
|
|
@@ -66,8 +66,10 @@ exports.fetchReader = {
|
|
|
66
66
|
: // Disable Next.js caching
|
|
67
67
|
'no-store';
|
|
68
68
|
const actualRange = range === null ? 0 : range;
|
|
69
|
-
const
|
|
70
|
-
const
|
|
69
|
+
const asString = typeof resolvedUrl === 'string' ? resolvedUrl : resolvedUrl.pathname;
|
|
70
|
+
const requestWithoutRange = asString.endsWith('.m3u8');
|
|
71
|
+
const canLiveWithoutContentLength = asString.endsWith('.m3u8') || asString.endsWith('.ts');
|
|
72
|
+
const headers = actualRange === 0 && requestWithoutRange
|
|
71
73
|
? {}
|
|
72
74
|
: typeof actualRange === 'number'
|
|
73
75
|
? {
|
|
@@ -85,7 +87,11 @@ exports.fetchReader = {
|
|
|
85
87
|
const parsedContentRange = contentRange
|
|
86
88
|
? parseContentRange(contentRange)
|
|
87
89
|
: null;
|
|
88
|
-
const { supportsContentRange } = validateContentRangeAndDetectIfSupported(
|
|
90
|
+
const { supportsContentRange } = validateContentRangeAndDetectIfSupported({
|
|
91
|
+
actualRange,
|
|
92
|
+
parsedContentRange,
|
|
93
|
+
statusCode: res.status,
|
|
94
|
+
});
|
|
89
95
|
controller._internals.signal.addEventListener('abort', () => {
|
|
90
96
|
ownController.abort(new errors_1.MediaParserAbortError('Aborted by user'));
|
|
91
97
|
}, { once: true });
|
|
@@ -96,7 +102,12 @@ exports.fetchReader = {
|
|
|
96
102
|
const contentDisposition = res.headers.get('content-disposition');
|
|
97
103
|
const name = (_a = contentDisposition === null || contentDisposition === void 0 ? void 0 : contentDisposition.match(/filename="([^"]+)"/)) === null || _a === void 0 ? void 0 : _a[1];
|
|
98
104
|
const fallbackName = src.split('/').pop();
|
|
99
|
-
const { contentLength, needsContentRange, reader } = await (0, get_body_and_reader_1.getLengthAndReader)(
|
|
105
|
+
const { contentLength, needsContentRange, reader } = await (0, get_body_and_reader_1.getLengthAndReader)({
|
|
106
|
+
canLiveWithoutContentLength,
|
|
107
|
+
res,
|
|
108
|
+
ownController,
|
|
109
|
+
requestedWithoutRange: requestWithoutRange,
|
|
110
|
+
});
|
|
100
111
|
if (controller) {
|
|
101
112
|
controller._internals.signal.addEventListener('abort', () => {
|
|
102
113
|
reader.reader.cancel().catch(() => {
|
package/dist/state/mp3.d.ts
CHANGED
|
@@ -2,10 +2,14 @@ export type Mp3Info = {
|
|
|
2
2
|
sampleRate: number;
|
|
3
3
|
mpegVersion: 1 | 2;
|
|
4
4
|
layer: number;
|
|
5
|
-
bitrateKbit: number;
|
|
6
5
|
startOfMpegStream: number;
|
|
7
6
|
};
|
|
7
|
+
export type Mp3CbrInfo = {
|
|
8
|
+
bitrateKbit: number;
|
|
9
|
+
};
|
|
8
10
|
export declare const makeMp3State: () => {
|
|
9
11
|
getMp3Info: () => Mp3Info | null;
|
|
10
12
|
setMp3Info: (info: Mp3Info) => void;
|
|
13
|
+
getCbrMp3Info: () => Mp3CbrInfo | null;
|
|
14
|
+
setCbrMp3Info: (info: Mp3CbrInfo) => void;
|
|
11
15
|
};
|
package/dist/state/mp3.js
CHANGED
|
@@ -3,11 +3,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.makeMp3State = void 0;
|
|
4
4
|
const makeMp3State = () => {
|
|
5
5
|
let mp3Info = null;
|
|
6
|
+
// cbr = constant bit rate
|
|
7
|
+
let cbrMp3Info = null;
|
|
6
8
|
return {
|
|
7
9
|
getMp3Info: () => mp3Info,
|
|
8
10
|
setMp3Info: (info) => {
|
|
9
11
|
mp3Info = info;
|
|
10
12
|
},
|
|
13
|
+
getCbrMp3Info: () => cbrMp3Info,
|
|
14
|
+
setCbrMp3Info: (info) => {
|
|
15
|
+
cbrMp3Info = info;
|
|
16
|
+
},
|
|
11
17
|
};
|
|
12
18
|
};
|
|
13
19
|
exports.makeMp3State = makeMp3State;
|
|
@@ -168,6 +168,8 @@ export declare const makeParserState: ({ hasAudioTrackHandlers, hasVideoTrackHan
|
|
|
168
168
|
addCluster: (cluster: import("./webm").ClusterSection) => void;
|
|
169
169
|
isInsideSegment: (iterator: BufferIterator) => import("./webm").SegmentSection | null;
|
|
170
170
|
isInsideCluster: (iterator: BufferIterator) => import("./webm").ClusterSection | null;
|
|
171
|
+
setAvcProfileForTrackNumber: (trackNumber: number, avcProfile: AvcProfileInfo) => void;
|
|
172
|
+
getAvcProfileForTrackNumber: (trackNumber: number) => AvcProfileInfo | null;
|
|
171
173
|
};
|
|
172
174
|
iso: {
|
|
173
175
|
flatSamples: {
|
|
@@ -182,6 +184,8 @@ export declare const makeParserState: ({ hasAudioTrackHandlers, hasVideoTrackHan
|
|
|
182
184
|
mp3Info: {
|
|
183
185
|
getMp3Info: () => import("./mp3").Mp3Info | null;
|
|
184
186
|
setMp3Info: (info: import("./mp3").Mp3Info) => void;
|
|
187
|
+
getCbrMp3Info: () => import("./mp3").Mp3CbrInfo | null;
|
|
188
|
+
setCbrMp3Info: (info: import("./mp3").Mp3CbrInfo) => void;
|
|
185
189
|
};
|
|
186
190
|
aac: {
|
|
187
191
|
addSample: ({ offset, size }: {
|
|
@@ -205,14 +209,14 @@ export declare const makeParserState: ({ hasAudioTrackHandlers, hasVideoTrackHan
|
|
|
205
209
|
m3u: {
|
|
206
210
|
setSelectedStream: (stream: {
|
|
207
211
|
type: "selected-stream";
|
|
208
|
-
stream: import("
|
|
212
|
+
stream: import("..").M3uStream;
|
|
209
213
|
} | {
|
|
210
214
|
type: "initial-url";
|
|
211
215
|
url: string;
|
|
212
216
|
}) => void;
|
|
213
217
|
getSelectedStream: () => ({
|
|
214
218
|
type: "selected-stream";
|
|
215
|
-
stream: import("
|
|
219
|
+
stream: import("..").M3uStream;
|
|
216
220
|
} | {
|
|
217
221
|
type: "initial-url";
|
|
218
222
|
url: string;
|
package/dist/state/webm.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { BufferIterator } from '../buffer-iterator';
|
|
2
|
+
import type { AvcProfileInfo } from '../containers/avc/parse-avc';
|
|
2
3
|
import type { OnTrackEntrySegment } from '../containers/webm/segments';
|
|
3
4
|
import type { TrackInfo } from '../containers/webm/segments/track-entry';
|
|
4
5
|
export type SegmentSection = {
|
|
@@ -23,4 +24,7 @@ export declare const webmState: () => {
|
|
|
23
24
|
addCluster: (cluster: ClusterSection) => void;
|
|
24
25
|
isInsideSegment: (iterator: BufferIterator) => SegmentSection | null;
|
|
25
26
|
isInsideCluster: (iterator: BufferIterator) => ClusterSection | null;
|
|
27
|
+
setAvcProfileForTrackNumber: (trackNumber: number, avcProfile: AvcProfileInfo) => void;
|
|
28
|
+
getAvcProfileForTrackNumber: (trackNumber: number) => AvcProfileInfo | null;
|
|
26
29
|
};
|
|
30
|
+
export type WebmState = ReturnType<typeof webmState>;
|
package/dist/state/webm.js
CHANGED
|
@@ -56,6 +56,14 @@ const webmState = () => {
|
|
|
56
56
|
};
|
|
57
57
|
const segments = [];
|
|
58
58
|
const clusters = [];
|
|
59
|
+
const avcProfilesMap = {};
|
|
60
|
+
const setAvcProfileForTrackNumber = (trackNumber, avcProfile) => {
|
|
61
|
+
avcProfilesMap[trackNumber] = avcProfile;
|
|
62
|
+
};
|
|
63
|
+
const getAvcProfileForTrackNumber = (trackNumber) => {
|
|
64
|
+
var _a;
|
|
65
|
+
return (_a = avcProfilesMap[trackNumber]) !== null && _a !== void 0 ? _a : null;
|
|
66
|
+
};
|
|
59
67
|
return {
|
|
60
68
|
onTrackEntrySegment,
|
|
61
69
|
getTrackInfoByNumber: (id) => trackEntries[id],
|
|
@@ -94,6 +102,8 @@ const webmState = () => {
|
|
|
94
102
|
}
|
|
95
103
|
return null;
|
|
96
104
|
},
|
|
105
|
+
setAvcProfileForTrackNumber,
|
|
106
|
+
getAvcProfileForTrackNumber,
|
|
97
107
|
};
|
|
98
108
|
};
|
|
99
109
|
exports.webmState = webmState;
|
package/dist/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const VERSION = "4.0.
|
|
1
|
+
export declare const VERSION = "4.0.268";
|