@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.
Files changed (79) hide show
  1. package/dist/containers/flac/get-channel-count.d.ts +1 -1
  2. package/dist/containers/m3u/get-streams.d.ts +10 -0
  3. package/dist/containers/m3u/get-streams.js +20 -0
  4. package/dist/containers/m3u/parse-directive.js +8 -0
  5. package/dist/containers/m3u/parse-m3u-media-directive.d.ts +2 -0
  6. package/dist/containers/m3u/parse-m3u-media-directive.js +31 -0
  7. package/dist/containers/m3u/parse-stream-inf.js +1 -0
  8. package/dist/containers/m3u/types.d.ts +15 -1
  9. package/dist/containers/mp3/get-duration.js +4 -3
  10. package/dist/containers/mp3/parse-mpeg-header.js +57 -40
  11. package/dist/containers/webm/get-ready-tracks.d.ts +9 -2
  12. package/dist/containers/webm/get-ready-tracks.js +43 -8
  13. package/dist/containers/webm/get-sample-from-block.js +19 -0
  14. package/dist/containers/webm/make-track.d.ts +1 -0
  15. package/dist/containers/webm/make-track.js +9 -8
  16. package/dist/esm/{from-fetch.mjs → fetch.mjs} +33 -129
  17. package/dist/esm/index.mjs +896 -740
  18. package/dist/esm/node-writer.mjs +113 -0
  19. package/dist/esm/node.mjs +37 -106
  20. package/dist/fetch.d.ts +1 -0
  21. package/dist/fetch.js +17 -0
  22. package/dist/get-tracks.js +7 -14
  23. package/dist/has-all-info.js +7 -3
  24. package/dist/index.d.ts +4 -0
  25. package/dist/internal-parse-media.js +1 -1
  26. package/dist/make-hvc1-codec-strings.js +3 -3
  27. package/dist/node-writer.d.ts +1 -0
  28. package/dist/node-writer.js +17 -0
  29. package/dist/node.d.ts +1 -0
  30. package/dist/node.js +17 -0
  31. package/dist/readers/fetch/get-body-and-reader.d.ts +6 -1
  32. package/dist/readers/fetch/get-body-and-reader.js +9 -7
  33. package/dist/readers/from-fetch.js +16 -5
  34. package/dist/state/mp3.d.ts +5 -1
  35. package/dist/state/mp3.js +6 -0
  36. package/dist/state/parser-state.d.ts +6 -2
  37. package/dist/state/webm.d.ts +4 -0
  38. package/dist/state/webm.js +10 -0
  39. package/dist/version.d.ts +1 -1
  40. package/dist/version.js +1 -1
  41. package/dist/web-file.d.ts +1 -0
  42. package/dist/web-file.js +17 -0
  43. package/package.json +32 -32
  44. package/dist/containers/flac/m3u/after-manifest-fetch.d.ts +0 -14
  45. package/dist/containers/flac/m3u/after-manifest-fetch.js +0 -53
  46. package/dist/containers/flac/m3u/fetch-m3u8-stream.d.ts +0 -3
  47. package/dist/containers/flac/m3u/fetch-m3u8-stream.js +0 -15
  48. package/dist/containers/flac/m3u/get-chunks.d.ts +0 -6
  49. package/dist/containers/flac/m3u/get-chunks.js +0 -20
  50. package/dist/containers/flac/m3u/get-duration-from-m3u.d.ts +0 -2
  51. package/dist/containers/flac/m3u/get-duration-from-m3u.js +0 -9
  52. package/dist/containers/flac/m3u/get-playlist.d.ts +0 -3
  53. package/dist/containers/flac/m3u/get-playlist.js +0 -19
  54. package/dist/containers/flac/m3u/get-streams.d.ts +0 -13
  55. package/dist/containers/flac/m3u/get-streams.js +0 -41
  56. package/dist/containers/flac/m3u/parse-directive.d.ts +0 -2
  57. package/dist/containers/flac/m3u/parse-directive.js +0 -64
  58. package/dist/containers/flac/m3u/parse-m3u-manifest.d.ts +0 -8
  59. package/dist/containers/flac/m3u/parse-m3u-manifest.js +0 -18
  60. package/dist/containers/flac/m3u/parse-m3u.d.ts +0 -4
  61. package/dist/containers/flac/m3u/parse-m3u.js +0 -35
  62. package/dist/containers/flac/m3u/parse-m3u8-text.d.ts +0 -2
  63. package/dist/containers/flac/m3u/parse-m3u8-text.js +0 -23
  64. package/dist/containers/flac/m3u/parse-stream-inf.d.ts +0 -3
  65. package/dist/containers/flac/m3u/parse-stream-inf.js +0 -61
  66. package/dist/containers/flac/m3u/return-packets.d.ts +0 -14
  67. package/dist/containers/flac/m3u/return-packets.js +0 -63
  68. package/dist/containers/flac/m3u/select-stream.d.ts +0 -10
  69. package/dist/containers/flac/m3u/select-stream.js +0 -15
  70. package/dist/containers/flac/m3u/types.d.ts +0 -48
  71. package/dist/containers/flac/m3u/types.js +0 -2
  72. package/dist/containers/mp3/get-tracks-from-mp3.d.ts +0 -4
  73. package/dist/containers/mp3/get-tracks-from-mp3.js +0 -25
  74. package/dist/does-need-contentlength-contentrange.d.ts +0 -2
  75. package/dist/does-need-contentlength-contentrange.js +0 -10
  76. package/dist/esm/from-node.mjs +0 -44
  77. package/dist/readers/from-uintarray.d.ts +0 -2
  78. package/dist/readers/from-uintarray.js +0 -27
  79. /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/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, "");
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 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();
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
- 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);
25
+ }, { once: true });
26
+ }
27
+ return Promise.resolve({
28
+ reader: {
29
+ reader,
30
+ abort: () => {
31
+ ownController.abort();
98
32
  }
99
33
  },
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) };
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
- nodeWriter
43
+ nodeReader
113
44
  };
@@ -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);
@@ -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
- const mainSegment = (0, traversal_2.getMainSegment)(structure.boxes);
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 getTracksFromMa = (segments, state) => {
53
+ const getCategorizedTracksFromMatroska = (state) => {
59
54
  const videoTracks = [];
60
55
  const audioTracks = [];
61
56
  const otherTracks = [];
62
- const mainSegment = segments.find((s) => s.type === 'Segment');
63
- if (!mainSegment) {
64
- throw new Error('No main segment found');
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 getTracksFromMa(structure.boxes, state);
137
+ return getCategorizedTracksFromMatroska(state);
145
138
  }
146
139
  if (structure.type === 'iso-base-media') {
147
140
  return (0, exports.getTracksFromIsoBaseMedia)(state);
@@ -107,8 +107,12 @@ const hasAllInfo = ({ fields, state, }) => {
107
107
  if (!Object.values(availableInfo).every(Boolean)) {
108
108
  return false;
109
109
  }
110
- const canSkipSamples = (0, may_skip_video_data_1.maySkipVideoData)({ state }) ||
111
- state.callbacks.canSkipTracksState.canSkipTracks();
112
- return canSkipSamples;
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('Cannot read media without a content length. This is currently not supported. Ensure the media has a "Content-Length" HTTP header.');
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 >> 0;
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}.${generalConstraintString}`;
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: (endsWithM3u8: boolean, res: Response, ownController: AbortController) => Promise<ReturnType>;
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 (endsWithM3u8, res, ownController) => {
5
- if (endsWithM3u8) {
6
- const text = await res.text();
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(new TextEncoder().encode(text));
13
+ controller.enqueue(encoded);
10
14
  controller.close();
11
15
  },
12
16
  });
13
17
  return {
14
- contentLength: text.length,
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 endsWithM3u8 = (typeof resolvedUrl === 'string' ? resolvedUrl : resolvedUrl.pathname).endsWith('.m3u8');
70
- const headers = actualRange === 0 && endsWithM3u8
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(actualRange, parsedContentRange, res.status);
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)(endsWithM3u8, res, ownController);
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(() => {
@@ -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("../containers/m3u/get-streams").M3uStream;
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("../containers/m3u/get-streams").M3uStream;
219
+ stream: import("..").M3uStream;
216
220
  } | {
217
221
  type: "initial-url";
218
222
  url: string;
@@ -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>;
@@ -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.266";
1
+ export declare const VERSION = "4.0.268";