@remotion/media-parser 4.0.265 → 4.0.267

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 (120) hide show
  1. package/dist/buffer-iterator.d.ts +1 -0
  2. package/dist/buffer-iterator.js +17 -0
  3. package/dist/containers/aac/parse-aac.js +1 -1
  4. package/dist/containers/avc/create-sps-pps-data.js +15 -1
  5. package/dist/containers/avc/interpret-sps.js +8 -2
  6. package/dist/containers/avc/parse-avc.js +23 -24
  7. package/dist/containers/flac/parse-streaminfo.js +1 -1
  8. package/dist/containers/iso-base-media/get-moov-atom.js +3 -2
  9. package/dist/containers/iso-base-media/process-box.js +9 -2
  10. package/dist/containers/iso-base-media/trun.js +1 -1
  11. package/dist/containers/m3u/after-manifest-fetch.d.ts +14 -0
  12. package/dist/containers/m3u/after-manifest-fetch.js +67 -0
  13. package/dist/containers/m3u/fetch-m3u8-stream.d.ts +3 -0
  14. package/dist/containers/m3u/fetch-m3u8-stream.js +18 -0
  15. package/dist/containers/m3u/get-chunks.d.ts +6 -0
  16. package/dist/containers/m3u/get-chunks.js +20 -0
  17. package/dist/containers/m3u/get-duration-from-m3u.d.ts +2 -0
  18. package/dist/containers/m3u/get-duration-from-m3u.js +9 -0
  19. package/dist/containers/m3u/get-playlist.d.ts +3 -0
  20. package/dist/containers/m3u/get-playlist.js +27 -0
  21. package/dist/containers/m3u/get-streams.d.ts +24 -0
  22. package/dist/containers/m3u/get-streams.js +80 -0
  23. package/dist/containers/m3u/parse-directive.d.ts +2 -0
  24. package/dist/containers/m3u/parse-directive.js +72 -0
  25. package/dist/containers/m3u/parse-m3u-manifest.d.ts +8 -0
  26. package/dist/containers/m3u/parse-m3u-manifest.js +18 -0
  27. package/dist/containers/m3u/parse-m3u-media-directive.d.ts +2 -0
  28. package/dist/containers/m3u/parse-m3u-media-directive.js +31 -0
  29. package/dist/containers/m3u/parse-m3u.d.ts +4 -0
  30. package/dist/containers/m3u/parse-m3u.js +35 -0
  31. package/dist/containers/m3u/parse-m3u8-text.d.ts +2 -0
  32. package/dist/containers/m3u/parse-m3u8-text.js +23 -0
  33. package/dist/containers/m3u/parse-stream-inf.d.ts +3 -0
  34. package/dist/containers/m3u/parse-stream-inf.js +62 -0
  35. package/dist/containers/m3u/return-packets.d.ts +16 -0
  36. package/dist/containers/m3u/return-packets.js +71 -0
  37. package/dist/containers/m3u/select-stream.d.ts +10 -0
  38. package/dist/containers/m3u/select-stream.js +19 -0
  39. package/dist/containers/m3u/types.d.ts +62 -0
  40. package/dist/containers/m3u/types.js +2 -0
  41. package/dist/containers/mp3/parse-mpeg-header.js +1 -1
  42. package/dist/containers/riff/expect-riff-box.js +1 -1
  43. package/dist/containers/transport-stream/boxes.d.ts +4 -1
  44. package/dist/containers/transport-stream/find-separator.d.ts +1 -2
  45. package/dist/containers/transport-stream/find-separator.js +7 -13
  46. package/dist/containers/transport-stream/handle-aac-packet.js +1 -1
  47. package/dist/containers/transport-stream/handle-avc-packet.js +1 -1
  48. package/dist/containers/transport-stream/parse-packet.js +7 -1
  49. package/dist/containers/transport-stream/parse-pat.d.ts +2 -1
  50. package/dist/containers/transport-stream/parse-pat.js +16 -1
  51. package/dist/containers/transport-stream/parse-stream-packet.js +86 -74
  52. package/dist/containers/wav/parse-fmt.js +1 -1
  53. package/dist/containers/webm/parse-ebml.js +9 -2
  54. package/dist/download-and-parse-media.js +32 -29
  55. package/dist/emit-available-info.js +13 -1
  56. package/dist/emitter.d.ts +4 -0
  57. package/dist/emitter.js +4 -0
  58. package/dist/esm/fetch.mjs +148 -0
  59. package/dist/esm/index.mjs +1321 -528
  60. package/dist/esm/node-writer.mjs +113 -0
  61. package/dist/esm/node.mjs +37 -106
  62. package/dist/esm/{from-web-file.mjs → web-file.mjs} +2 -7
  63. package/dist/fetch.d.ts +1 -0
  64. package/dist/fetch.js +17 -0
  65. package/dist/file-types/detect-file-type.d.ts +5 -1
  66. package/dist/file-types/detect-file-type.js +5 -1
  67. package/dist/file-types/index.js +3 -0
  68. package/dist/forward-controller.d.ts +7 -0
  69. package/dist/forward-controller.js +25 -0
  70. package/dist/get-container.js +3 -0
  71. package/dist/get-duration.js +35 -2
  72. package/dist/get-fields-from-callbacks.js +1 -0
  73. package/dist/get-fps.js +7 -0
  74. package/dist/get-tracks.d.ts +2 -0
  75. package/dist/get-tracks.js +29 -4
  76. package/dist/has-all-info.js +4 -0
  77. package/dist/index.d.ts +46 -9
  78. package/dist/index.js +3 -1
  79. package/dist/init-video.js +8 -0
  80. package/dist/internal-parse-media.js +11 -4
  81. package/dist/is-audio-structure.js +3 -0
  82. package/dist/make-hvc1-codec-strings.js +3 -3
  83. package/dist/media-parser-controller.js +3 -1
  84. package/dist/metadata/get-metadata.js +26 -3
  85. package/dist/node-writer.d.ts +1 -0
  86. package/dist/node-writer.js +17 -0
  87. package/dist/node.d.ts +1 -0
  88. package/dist/node.js +17 -0
  89. package/dist/options.d.ts +9 -1
  90. package/dist/parse-media.js +11 -8
  91. package/dist/parse-result.d.ts +2 -1
  92. package/dist/readers/fetch/get-body-and-reader.d.ts +8 -0
  93. package/dist/readers/fetch/get-body-and-reader.js +42 -0
  94. package/dist/readers/fetch/resolve-url.d.ts +1 -0
  95. package/dist/readers/fetch/resolve-url.js +15 -0
  96. package/dist/readers/from-fetch.js +19 -40
  97. package/dist/readers/from-node.js +1 -7
  98. package/dist/readers/from-web-file.js +1 -6
  99. package/dist/readers/reader.d.ts +1 -2
  100. package/dist/register-track.d.ts +8 -3
  101. package/dist/register-track.js +30 -17
  102. package/dist/run-parse-iteration.js +6 -1
  103. package/dist/state/can-skip-tracks.js +2 -1
  104. package/dist/state/emitted-fields.js +1 -0
  105. package/dist/state/m3u-state.d.ts +29 -0
  106. package/dist/state/m3u-state.js +48 -0
  107. package/dist/state/need-samples-for-fields.js +1 -0
  108. package/dist/state/parser-state.d.ts +36 -1
  109. package/dist/state/parser-state.js +4 -1
  110. package/dist/state/structure.d.ts +1 -0
  111. package/dist/state/structure.js +7 -0
  112. package/dist/version.d.ts +1 -1
  113. package/dist/version.js +1 -1
  114. package/dist/web-file.d.ts +1 -0
  115. package/dist/web-file.js +17 -0
  116. package/package.json +32 -32
  117. package/dist/containers/mp3/get-tracks-from-mp3.d.ts +0 -4
  118. package/dist/containers/mp3/get-tracks-from-mp3.js +0 -25
  119. package/dist/esm/from-fetch.mjs +0 -237
  120. package/dist/esm/from-node.mjs +0 -50
@@ -1,4 +0,0 @@
1
- import type { ParserState } from '../../state/parser-state';
2
- import type { AllTracks } from '../riff/get-tracks-from-avi';
3
- export declare const getTracksFromMp3OrWavOrAac: (parserState: ParserState) => AllTracks;
4
- export declare const hasAllTracksFromMp3OrWavOrAac: (parserState: ParserState) => boolean;
@@ -1,25 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.hasAllTracksFromMp3OrWavOrAac = exports.getTracksFromMp3OrWavOrAac = void 0;
4
- const getTracksFromMp3OrWavOrAac = (parserState) => {
5
- const tracks = parserState.callbacks.tracks.getTracks();
6
- if (tracks.length === 0) {
7
- throw new Error('No tracks found');
8
- }
9
- return {
10
- audioTracks: tracks.filter((t) => t.type === 'audio'),
11
- otherTracks: [],
12
- videoTracks: [],
13
- };
14
- };
15
- exports.getTracksFromMp3OrWavOrAac = getTracksFromMp3OrWavOrAac;
16
- const hasAllTracksFromMp3OrWavOrAac = (parserState) => {
17
- try {
18
- (0, exports.getTracksFromMp3OrWavOrAac)(parserState);
19
- return true;
20
- }
21
- catch (_a) {
22
- return false;
23
- }
24
- };
25
- exports.hasAllTracksFromMp3OrWavOrAac = hasAllTracksFromMp3OrWavOrAac;
@@ -1,237 +0,0 @@
1
- // src/errors.ts
2
- class IsAGifError extends Error {
3
- mimeType;
4
- sizeInBytes;
5
- fileName;
6
- constructor({
7
- message,
8
- mimeType,
9
- sizeInBytes,
10
- fileName
11
- }) {
12
- super(message);
13
- this.fileName = "IsAGifError";
14
- this.mimeType = mimeType;
15
- this.sizeInBytes = sizeInBytes;
16
- this.fileName = fileName;
17
- if (Error.captureStackTrace) {
18
- Error.captureStackTrace(this, IsAGifError);
19
- }
20
- }
21
- }
22
-
23
- class IsAnImageError extends Error {
24
- imageType;
25
- dimensions;
26
- mimeType;
27
- sizeInBytes;
28
- fileName;
29
- constructor({
30
- dimensions,
31
- imageType,
32
- message,
33
- mimeType,
34
- sizeInBytes,
35
- fileName
36
- }) {
37
- super(message);
38
- this.name = "IsAnImageError";
39
- this.imageType = imageType;
40
- this.dimensions = dimensions;
41
- this.mimeType = mimeType;
42
- this.sizeInBytes = sizeInBytes;
43
- this.fileName = fileName;
44
- if (Error.captureStackTrace) {
45
- Error.captureStackTrace(this, IsAnImageError);
46
- }
47
- }
48
- }
49
-
50
- class IsAPdfError extends Error {
51
- mimeType;
52
- sizeInBytes;
53
- fileName;
54
- constructor({
55
- message,
56
- mimeType,
57
- sizeInBytes,
58
- fileName
59
- }) {
60
- super(message);
61
- this.name = "IsAPdfError";
62
- this.mimeType = mimeType;
63
- this.sizeInBytes = sizeInBytes;
64
- this.fileName = fileName;
65
- if (Error.captureStackTrace) {
66
- Error.captureStackTrace(this, IsAPdfError);
67
- }
68
- }
69
- }
70
-
71
- class IsAnUnsupportedFileTypeError extends Error {
72
- mimeType;
73
- sizeInBytes;
74
- fileName;
75
- constructor({
76
- message,
77
- mimeType,
78
- sizeInBytes,
79
- fileName
80
- }) {
81
- super(message);
82
- this.name = "IsAnUnsupportedFileTypeError";
83
- this.mimeType = mimeType;
84
- this.sizeInBytes = sizeInBytes;
85
- this.fileName = fileName;
86
- if (Error.captureStackTrace) {
87
- Error.captureStackTrace(this, IsAnUnsupportedFileTypeError);
88
- }
89
- }
90
- }
91
-
92
- class IsAnUnsupportedAudioTypeError extends Error {
93
- mimeType;
94
- sizeInBytes;
95
- fileName;
96
- audioType;
97
- constructor({
98
- message,
99
- mimeType,
100
- sizeInBytes,
101
- fileName,
102
- audioType
103
- }) {
104
- super(message);
105
- this.name = "IsAnUnsupportedAudioTypeError";
106
- this.mimeType = mimeType;
107
- this.sizeInBytes = sizeInBytes;
108
- this.fileName = fileName;
109
- this.audioType = audioType;
110
- if (Error.captureStackTrace) {
111
- Error.captureStackTrace(this, IsAnUnsupportedAudioTypeError);
112
- }
113
- }
114
- }
115
-
116
- class MediaParserAbortError extends Error {
117
- constructor(message) {
118
- super(message);
119
- this.name = "MediaParserAbortError";
120
- this.cause = undefined;
121
- }
122
- }
123
- var hasBeenAborted = (error) => {
124
- return error instanceof MediaParserAbortError;
125
- };
126
-
127
- // src/readers/from-fetch.ts
128
- function parseContentRange(input) {
129
- const matches = input.match(/^(\w+) ((\d+)-(\d+)|\*)\/(\d+|\*)$/);
130
- if (!matches)
131
- return null;
132
- const [, unit, , start, end, size] = matches;
133
- const range = {
134
- unit,
135
- start: start != null ? Number(start) : null,
136
- end: end != null ? Number(end) : null,
137
- size: size === "*" ? null : Number(size)
138
- };
139
- if (range.start === null && range.end === null && range.size === null) {
140
- return null;
141
- }
142
- return range;
143
- }
144
- var validateContentRangeAndDetectIfSupported = (actualRange, parsedContentRange, statusCode) => {
145
- if (statusCode === 206) {
146
- return { supportsContentRange: true };
147
- }
148
- if (typeof actualRange === "number" && parsedContentRange?.start !== actualRange) {
149
- if (actualRange === 0) {
150
- return { supportsContentRange: false };
151
- }
152
- throw new Error(`Range header (${actualRange}) does not match content-range header (${parsedContentRange?.start})`);
153
- }
154
- if (actualRange !== null && typeof actualRange !== "number" && (parsedContentRange?.start !== actualRange[0] || parsedContentRange?.end !== actualRange[1])) {
155
- throw new Error(`Range header (${actualRange}) does not match content-range header (${parsedContentRange?.start})`);
156
- }
157
- return { supportsContentRange: true };
158
- };
159
- var fetchReader = {
160
- read: async ({ src, range, controller }) => {
161
- if (typeof src !== "string") {
162
- throw new Error("src must be a string when using `fetchReader`");
163
- }
164
- const resolvedUrl = typeof window !== "undefined" && typeof window.location !== "undefined" ? new URL(src, window.location.origin).toString() : src;
165
- if (!resolvedUrl.startsWith("https://") && !resolvedUrl.startsWith("blob:") && !resolvedUrl.startsWith("http://")) {
166
- return Promise.reject(new Error(resolvedUrl + " is not a URL - needs to start with http:// or https:// or blob:. If you want to read a local file, pass `reader: nodeReader` to parseMedia()."));
167
- }
168
- const ownController = new AbortController;
169
- const cache = typeof navigator !== "undefined" && navigator.userAgent.includes("Cloudflare-Workers") ? undefined : "no-store";
170
- const actualRange = range === null ? 0 : range;
171
- const res = await fetch(resolvedUrl, {
172
- headers: typeof actualRange === "number" ? {
173
- Range: `bytes=${actualRange}-`
174
- } : {
175
- Range: `bytes=${`${actualRange[0]}-${actualRange[1]}`}`
176
- },
177
- signal: ownController.signal,
178
- cache
179
- });
180
- const contentRange = res.headers.get("content-range");
181
- const parsedContentRange = contentRange ? parseContentRange(contentRange) : null;
182
- const { supportsContentRange } = validateContentRangeAndDetectIfSupported(actualRange, parsedContentRange, res.status);
183
- controller._internals.signal.addEventListener("abort", () => {
184
- ownController.abort(new MediaParserAbortError("Aborted by user"));
185
- }, { once: true });
186
- if (res.status.toString().startsWith("4") || res.status.toString().startsWith("5")) {
187
- throw new Error(`Server returned status code ${res.status} for ${src} and range ${actualRange}`);
188
- }
189
- if (!res.body) {
190
- throw new Error("No body");
191
- }
192
- const length = res.headers.get("content-length");
193
- const contentLength = length === null ? null : parseInt(length, 10);
194
- const contentDisposition = res.headers.get("content-disposition");
195
- const name = contentDisposition?.match(/filename="([^"]+)"/)?.[1];
196
- const fallbackName = src.split("/").pop();
197
- const reader = res.body.getReader();
198
- if (controller) {
199
- controller._internals.signal.addEventListener("abort", () => {
200
- reader.cancel().catch(() => {
201
- });
202
- }, { once: true });
203
- }
204
- return {
205
- reader: {
206
- reader,
207
- abort: () => {
208
- ownController.abort();
209
- }
210
- },
211
- contentLength,
212
- contentType: res.headers.get("content-type"),
213
- name: name ?? fallbackName,
214
- supportsContentRange
215
- };
216
- },
217
- getLength: async (src) => {
218
- if (typeof src !== "string") {
219
- throw new Error("src must be a string when using `fetchReader`");
220
- }
221
- const res = await fetch(src, {
222
- method: "HEAD"
223
- });
224
- if (!res.body) {
225
- throw new Error("No body");
226
- }
227
- const length = res.headers.get("content-length");
228
- if (!length) {
229
- throw new Error("No content-length");
230
- }
231
- return parseInt(length, 10);
232
- }
233
- };
234
- export {
235
- parseContentRange,
236
- fetchReader
237
- };
@@ -1,50 +0,0 @@
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`");
9
- }
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(() => {
24
- });
25
- }, { once: true });
26
- }
27
- return Promise.resolve({
28
- reader: {
29
- reader,
30
- abort: () => {
31
- ownController.abort();
32
- }
33
- },
34
- contentLength: stats.size,
35
- contentType: null,
36
- name: src.split(sep).pop(),
37
- supportsContentRange: true
38
- });
39
- },
40
- getLength: (src) => {
41
- if (typeof src !== "string") {
42
- throw new Error("src must be a string when using `nodeReader`");
43
- }
44
- const stats = statSync(src);
45
- return Promise.resolve(stats.size);
46
- }
47
- };
48
- export {
49
- nodeReader
50
- };