@remotion/media-parser 4.0.270 → 4.0.271

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 (332) hide show
  1. package/dist/aac-codecprivate.js +6 -13
  2. package/dist/add-avc-profile-to-track.js +5 -9
  3. package/dist/buffer-iterator.js +8 -13
  4. package/dist/combine-uint8-arrays.js +1 -5
  5. package/dist/containers/aac/parse-aac.js +9 -13
  6. package/dist/containers/aac/types.js +1 -2
  7. package/dist/containers/avc/codec-string.js +1 -5
  8. package/dist/containers/avc/color.js +3 -9
  9. package/dist/containers/avc/create-sps-pps-data.js +5 -9
  10. package/dist/containers/avc/interpret-sps.js +7 -13
  11. package/dist/containers/avc/key.js +1 -5
  12. package/dist/containers/avc/parse-avc.js +3 -7
  13. package/dist/containers/avc/sps-and-pps.js +1 -5
  14. package/dist/containers/flac/get-block-size.js +1 -5
  15. package/dist/containers/flac/get-channel-count.js +1 -5
  16. package/dist/containers/flac/get-duration-from-flac.js +1 -5
  17. package/dist/containers/flac/get-metadata-from-flac.js +1 -5
  18. package/dist/containers/flac/get-sample-rate.js +1 -5
  19. package/dist/containers/flac/parse-flac-frame.js +14 -19
  20. package/dist/containers/flac/parse-flac.js +15 -19
  21. package/dist/containers/flac/parse-header.js +1 -5
  22. package/dist/containers/flac/parse-metadata.js +1 -5
  23. package/dist/containers/flac/parse-streaminfo.js +3 -7
  24. package/dist/containers/flac/parse-unknown-block.js +1 -5
  25. package/dist/containers/flac/types.d.ts +2 -2
  26. package/dist/containers/flac/types.js +1 -2
  27. package/dist/containers/iso-base-media/base-media-box.js +1 -2
  28. package/dist/containers/iso-base-media/base-type.js +1 -2
  29. package/dist/containers/iso-base-media/esds/decoder-specific-config.js +1 -5
  30. package/dist/containers/iso-base-media/esds/esds-descriptors.js +5 -10
  31. package/dist/containers/iso-base-media/esds/esds.js +3 -7
  32. package/dist/containers/iso-base-media/ftyp.js +1 -5
  33. package/dist/containers/iso-base-media/get-actual-number-of-channels.js +4 -8
  34. package/dist/containers/iso-base-media/get-children.js +3 -7
  35. package/dist/containers/iso-base-media/get-keyframes.js +7 -11
  36. package/dist/containers/iso-base-media/get-moov-atom.js +21 -15
  37. package/dist/containers/iso-base-media/get-sample-positions-from-track.js +20 -24
  38. package/dist/containers/iso-base-media/get-video-codec-from-iso-track.d.ts +1 -1
  39. package/dist/containers/iso-base-media/get-video-codec-from-iso-track.js +3 -7
  40. package/dist/containers/iso-base-media/make-track.js +30 -34
  41. package/dist/containers/iso-base-media/mdat/mdat.js +16 -20
  42. package/dist/containers/iso-base-media/mdhd.js +1 -5
  43. package/dist/containers/iso-base-media/meta/hdlr.js +1 -5
  44. package/dist/containers/iso-base-media/meta/ilst.js +1 -5
  45. package/dist/containers/iso-base-media/moov/moov.js +3 -7
  46. package/dist/containers/iso-base-media/mvhd.js +7 -11
  47. package/dist/containers/iso-base-media/parse-boxes.js +5 -9
  48. package/dist/containers/iso-base-media/parse-icc-profile.js +4 -8
  49. package/dist/containers/iso-base-media/process-box.js +63 -67
  50. package/dist/containers/iso-base-media/stsd/av1c.js +1 -5
  51. package/dist/containers/iso-base-media/stsd/avcc.js +1 -5
  52. package/dist/containers/iso-base-media/stsd/colr.js +3 -7
  53. package/dist/containers/iso-base-media/stsd/ctts.js +1 -5
  54. package/dist/containers/iso-base-media/stsd/hvcc.js +3 -7
  55. package/dist/containers/iso-base-media/stsd/keys.js +1 -5
  56. package/dist/containers/iso-base-media/stsd/mebx.js +3 -7
  57. package/dist/containers/iso-base-media/stsd/pasp.js +1 -5
  58. package/dist/containers/iso-base-media/stsd/samples.js +8 -13
  59. package/dist/containers/iso-base-media/stsd/stco.js +1 -5
  60. package/dist/containers/iso-base-media/stsd/stsc.js +1 -5
  61. package/dist/containers/iso-base-media/stsd/stsd.js +3 -7
  62. package/dist/containers/iso-base-media/stsd/stss.js +1 -5
  63. package/dist/containers/iso-base-media/stsd/stsz.js +1 -5
  64. package/dist/containers/iso-base-media/stsd/stts.js +1 -5
  65. package/dist/containers/iso-base-media/tfdt.js +1 -5
  66. package/dist/containers/iso-base-media/tfhd.js +1 -5
  67. package/dist/containers/iso-base-media/tkhd.js +4 -8
  68. package/dist/containers/iso-base-media/to-date.js +1 -5
  69. package/dist/containers/iso-base-media/trak/trak.js +3 -7
  70. package/dist/containers/iso-base-media/traversal.d.ts +3 -2
  71. package/dist/containers/iso-base-media/traversal.js +42 -57
  72. package/dist/containers/iso-base-media/trun.js +2 -6
  73. package/dist/containers/iso-base-media/void-box.js +1 -2
  74. package/dist/containers/m3u/after-manifest-fetch.d.ts +5 -3
  75. package/dist/containers/m3u/after-manifest-fetch.js +13 -17
  76. package/dist/containers/m3u/fetch-m3u8-stream.d.ts +5 -1
  77. package/dist/containers/m3u/fetch-m3u8-stream.js +4 -12
  78. package/dist/containers/m3u/get-chunks.d.ts +1 -0
  79. package/dist/containers/m3u/get-chunks.js +6 -6
  80. package/dist/containers/m3u/get-duration-from-m3u.js +4 -8
  81. package/dist/containers/m3u/get-playlist.js +6 -12
  82. package/dist/containers/m3u/get-streams.d.ts +11 -5
  83. package/dist/containers/m3u/get-streams.js +5 -15
  84. package/dist/containers/m3u/iterate-over-segment-files.d.ts +19 -0
  85. package/dist/containers/m3u/iterate-over-segment-files.js +106 -0
  86. package/dist/containers/m3u/parse-directive.js +10 -10
  87. package/dist/containers/m3u/parse-m3u-manifest.js +3 -7
  88. package/dist/containers/m3u/parse-m3u-media-directive.d.ts +1 -0
  89. package/dist/containers/m3u/parse-m3u-media-directive.js +7 -7
  90. package/dist/containers/m3u/parse-m3u.js +13 -13
  91. package/dist/containers/m3u/parse-m3u8-text.js +3 -7
  92. package/dist/containers/m3u/parse-stream-inf.js +2 -7
  93. package/dist/containers/m3u/return-packets.d.ts +1 -1
  94. package/dist/containers/m3u/return-packets.js +14 -5
  95. package/dist/containers/m3u/run-over-m3u.js +10 -13
  96. package/dist/containers/m3u/sample-sorter.js +4 -8
  97. package/dist/containers/m3u/select-stream.d.ts +3 -2
  98. package/dist/containers/m3u/select-stream.js +9 -13
  99. package/dist/containers/m3u/types.d.ts +1 -1
  100. package/dist/containers/m3u/types.js +1 -2
  101. package/dist/containers/mp3/get-duration.js +5 -9
  102. package/dist/containers/mp3/get-frame-length.js +2 -7
  103. package/dist/containers/mp3/get-metadata-from-mp3.d.ts +2 -2
  104. package/dist/containers/mp3/get-metadata-from-mp3.js +1 -5
  105. package/dist/containers/mp3/id3-v1.js +1 -5
  106. package/dist/containers/mp3/id3.js +1 -5
  107. package/dist/containers/mp3/parse-mp3.js +7 -11
  108. package/dist/containers/mp3/parse-mpeg-header.js +10 -14
  109. package/dist/containers/mp3/samples-per-mpeg-file.js +1 -5
  110. package/dist/containers/riff/expect-riff-box.js +11 -15
  111. package/dist/containers/riff/get-duration.js +7 -12
  112. package/dist/containers/riff/get-tracks-from-avi.js +20 -28
  113. package/dist/containers/riff/is-movi.js +1 -5
  114. package/dist/containers/riff/parse-avih.js +1 -5
  115. package/dist/containers/riff/parse-isft.js +1 -5
  116. package/dist/containers/riff/parse-list-box.js +3 -7
  117. package/dist/containers/riff/parse-movi.js +13 -18
  118. package/dist/containers/riff/parse-riff-body.js +9 -13
  119. package/dist/containers/riff/parse-riff-box.js +9 -13
  120. package/dist/containers/riff/parse-riff-header.js +1 -5
  121. package/dist/containers/riff/parse-riff.js +5 -9
  122. package/dist/containers/riff/parse-strf.js +1 -5
  123. package/dist/containers/riff/parse-strh.js +3 -7
  124. package/dist/containers/riff/parse-video-section.js +7 -11
  125. package/dist/containers/riff/riff-box.js +1 -2
  126. package/dist/containers/riff/timescale.js +1 -4
  127. package/dist/containers/riff/traversal.js +7 -15
  128. package/dist/containers/transport-stream/adts-header.js +6 -10
  129. package/dist/containers/transport-stream/boxes.js +1 -2
  130. package/dist/containers/transport-stream/discard-rest-of-packet.js +2 -7
  131. package/dist/containers/transport-stream/find-separator.js +1 -4
  132. package/dist/containers/transport-stream/get-tracks.js +7 -12
  133. package/dist/containers/transport-stream/handle-aac-packet.js +12 -16
  134. package/dist/containers/transport-stream/handle-avc-packet.js +22 -26
  135. package/dist/containers/transport-stream/next-pes-header-store.js +1 -5
  136. package/dist/containers/transport-stream/parse-packet.js +13 -17
  137. package/dist/containers/transport-stream/parse-pat.js +5 -10
  138. package/dist/containers/transport-stream/parse-pes.js +1 -5
  139. package/dist/containers/transport-stream/parse-pmt.js +3 -7
  140. package/dist/containers/transport-stream/parse-stream-packet.js +13 -17
  141. package/dist/containers/transport-stream/parse-transport-stream.js +5 -9
  142. package/dist/containers/transport-stream/process-stream-buffers.js +10 -15
  143. package/dist/containers/transport-stream/traversal.js +4 -10
  144. package/dist/containers/wav/get-duration-from-wav.js +3 -8
  145. package/dist/containers/wav/get-metadata-from-wav.d.ts +2 -2
  146. package/dist/containers/wav/get-metadata-from-wav.js +1 -5
  147. package/dist/containers/wav/parse-data.js +5 -9
  148. package/dist/containers/wav/parse-fmt.js +3 -7
  149. package/dist/containers/wav/parse-header.js +1 -5
  150. package/dist/containers/wav/parse-id3.js +1 -5
  151. package/dist/containers/wav/parse-list.js +1 -5
  152. package/dist/containers/wav/parse-video-section.js +3 -7
  153. package/dist/containers/wav/parse-wav.js +15 -19
  154. package/dist/containers/wav/types.d.ts +2 -2
  155. package/dist/containers/wav/types.js +1 -2
  156. package/dist/containers/webm/allowed-partial-segments.js +1 -4
  157. package/dist/containers/webm/av1-codec-private.js +3 -7
  158. package/dist/containers/webm/color.js +6 -10
  159. package/dist/containers/webm/description.js +6 -10
  160. package/dist/containers/webm/get-ready-tracks.js +13 -18
  161. package/dist/containers/webm/get-sample-from-block.js +12 -16
  162. package/dist/containers/webm/make-track.js +43 -48
  163. package/dist/containers/webm/parse-ebml.js +14 -19
  164. package/dist/containers/webm/parse-webm-header.js +3 -7
  165. package/dist/containers/webm/segments/all-segments.js +168 -173
  166. package/dist/containers/webm/segments/block-simple-block-flags.js +4 -8
  167. package/dist/containers/webm/segments/track-entry.js +1 -5
  168. package/dist/containers/webm/segments.js +9 -13
  169. package/dist/containers/webm/traversal.js +37 -67
  170. package/dist/convert-audio-or-video-sample.js +1 -5
  171. package/dist/download-and-parse-media.js +44 -47
  172. package/dist/emit-available-info.js +38 -38
  173. package/dist/emitter.js +1 -5
  174. package/dist/errors.d.ts +2 -17
  175. package/dist/errors.js +10 -30
  176. package/dist/esm/fetch.mjs +93 -67
  177. package/dist/esm/index.mjs +679 -175
  178. package/dist/esm/node.mjs +59 -36
  179. package/dist/esm/universal.mjs +323 -0
  180. package/dist/esm/web-file.mjs +55 -43
  181. package/dist/esm/web.mjs +257 -0
  182. package/dist/esm/worker-server-entry.mjs +13056 -0
  183. package/dist/esm/worker-server.mjs +12914 -0
  184. package/dist/esm/worker-web-entry.mjs +12969 -0
  185. package/dist/esm/worker.mjs +439 -0
  186. package/dist/fetch.js +1 -17
  187. package/dist/file-types/bmp.js +3 -7
  188. package/dist/file-types/detect-file-type.js +24 -38
  189. package/dist/file-types/index.js +22 -26
  190. package/dist/file-types/jpeg.js +4 -9
  191. package/dist/file-types/pdf.js +3 -7
  192. package/dist/file-types/png.js +4 -9
  193. package/dist/file-types/webp.js +3 -7
  194. package/dist/forward-controller.js +1 -5
  195. package/dist/get-audio-codec.js +25 -38
  196. package/dist/get-container.d.ts +3 -3
  197. package/dist/get-container.js +5 -10
  198. package/dist/get-dimensions.js +8 -13
  199. package/dist/get-duration.js +27 -34
  200. package/dist/get-fields-from-callbacks.js +1 -5
  201. package/dist/get-fps.js +24 -34
  202. package/dist/get-is-hdr.js +5 -10
  203. package/dist/get-keyframes.js +6 -11
  204. package/dist/get-location.js +4 -9
  205. package/dist/get-number-of-audio-channels.js +2 -7
  206. package/dist/get-sample-aspect-ratio.js +17 -30
  207. package/dist/get-sample-positions-from-lpcm.js +5 -9
  208. package/dist/get-sample-positions.js +1 -5
  209. package/dist/get-sample-rate.js +2 -7
  210. package/dist/get-tracks.d.ts +5 -0
  211. package/dist/get-tracks.js +37 -44
  212. package/dist/get-video-codec.js +26 -34
  213. package/dist/has-all-info.js +33 -38
  214. package/dist/index.d.ts +15 -11
  215. package/dist/index.js +34 -48
  216. package/dist/init-video.d.ts +1 -1
  217. package/dist/init-video.js +47 -20
  218. package/dist/internal-parse-media.js +36 -40
  219. package/dist/is-audio-structure.d.ts +2 -2
  220. package/dist/is-audio-structure.js +1 -5
  221. package/dist/log.js +8 -12
  222. package/dist/make-hvc1-codec-strings.js +1 -5
  223. package/dist/media-parser-controller.js +7 -11
  224. package/dist/metadata/get-metadata.d.ts +4 -4
  225. package/dist/metadata/get-metadata.js +17 -22
  226. package/dist/metadata/metadata-from-iso.d.ts +3 -3
  227. package/dist/metadata/metadata-from-iso.js +12 -17
  228. package/dist/metadata/metadata-from-matroska.d.ts +2 -2
  229. package/dist/metadata/metadata-from-matroska.js +3 -7
  230. package/dist/metadata/metadata-from-riff.d.ts +2 -2
  231. package/dist/metadata/metadata-from-riff.js +3 -7
  232. package/dist/node-writer.js +1 -17
  233. package/dist/node.js +1 -17
  234. package/dist/options.d.ts +30 -24
  235. package/dist/options.js +1 -2
  236. package/dist/parse-media-on-browser-worker.d.ts +2 -0
  237. package/dist/parse-media-on-browser-worker.js +4 -0
  238. package/dist/parse-media-on-server-worker.d.ts +2 -0
  239. package/dist/parse-media-on-server-worker.js +4 -0
  240. package/dist/parse-media-on-web-worker.d.ts +2 -0
  241. package/dist/parse-media-on-web-worker.js +4 -0
  242. package/dist/parse-media-on-worker-entry.d.ts +2 -0
  243. package/dist/parse-media-on-worker-entry.js +269 -0
  244. package/dist/parse-media-on-worker.d.ts +2 -0
  245. package/dist/parse-media-on-worker.js +4 -0
  246. package/dist/parse-media.js +10 -13
  247. package/dist/parse-result.d.ts +3 -3
  248. package/dist/parse-result.js +1 -2
  249. package/dist/pause-signal.js +1 -5
  250. package/dist/perform-seek.js +6 -10
  251. package/dist/readers/fetch/get-body-and-reader.js +1 -5
  252. package/dist/readers/fetch/resolve-url.d.ts +1 -1
  253. package/dist/readers/fetch/resolve-url.js +1 -5
  254. package/dist/readers/from-fetch.d.ts +4 -1
  255. package/dist/readers/from-fetch.js +109 -94
  256. package/dist/readers/from-node.d.ts +4 -1
  257. package/dist/readers/from-node.js +58 -41
  258. package/dist/readers/from-web-file.d.ts +4 -1
  259. package/dist/readers/from-web-file.js +55 -49
  260. package/dist/readers/reader.d.ts +5 -1
  261. package/dist/readers/reader.js +1 -2
  262. package/dist/readers/universal.d.ts +2 -0
  263. package/dist/readers/universal.js +35 -0
  264. package/dist/readers/web.d.ts +2 -0
  265. package/dist/readers/web.js +22 -0
  266. package/dist/register-track.js +9 -15
  267. package/dist/remotion-license-acknowledge.js +4 -8
  268. package/dist/run-parse-iteration.js +26 -25
  269. package/dist/samples-from-moof.js +8 -12
  270. package/dist/skip.js +1 -5
  271. package/dist/state/aac-state.js +1 -5
  272. package/dist/state/can-skip-tracks.d.ts +2 -2
  273. package/dist/state/can-skip-tracks.js +3 -8
  274. package/dist/state/emitted-fields.js +1 -5
  275. package/dist/state/flac-state.js +1 -5
  276. package/dist/state/has-tracks-section.js +3 -7
  277. package/dist/state/images.js +1 -5
  278. package/dist/state/iso-base-media/cached-sample-positions.js +8 -13
  279. package/dist/state/iso-base-media/iso-state.js +5 -9
  280. package/dist/state/iso-base-media/moov-box.js +1 -5
  281. package/dist/state/keyframes.js +1 -5
  282. package/dist/state/last-eventloop-break.js +3 -7
  283. package/dist/state/m3u-state.d.ts +3 -0
  284. package/dist/state/m3u-state.js +16 -11
  285. package/dist/state/may-skip-video-data.js +3 -7
  286. package/dist/state/mp3.js +1 -5
  287. package/dist/state/need-samples-for-fields.js +1 -5
  288. package/dist/state/parser-state.d.ts +12 -10
  289. package/dist/state/parser-state.js +36 -41
  290. package/dist/state/riff.js +1 -5
  291. package/dist/state/sample-callbacks.js +8 -12
  292. package/dist/state/slow-duration-fps.js +1 -5
  293. package/dist/state/structure.d.ts +4 -4
  294. package/dist/state/structure.js +1 -5
  295. package/dist/state/transport-stream.js +3 -7
  296. package/dist/state/video-section.js +1 -5
  297. package/dist/state/webm.js +5 -9
  298. package/dist/throttled-progress.js +1 -5
  299. package/dist/truthy.js +1 -4
  300. package/dist/universal.d.ts +1 -0
  301. package/dist/universal.js +1 -0
  302. package/dist/version.d.ts +1 -1
  303. package/dist/version.js +1 -4
  304. package/dist/web-file.js +1 -17
  305. package/dist/web.d.ts +1 -0
  306. package/dist/web.js +1 -0
  307. package/dist/webcodec-sample-types.d.ts +6 -4
  308. package/dist/webcodec-sample-types.js +1 -2
  309. package/dist/worker/forward-controller.d.ts +3 -0
  310. package/dist/worker/forward-controller.js +20 -0
  311. package/dist/worker/serialize-error.d.ts +4 -0
  312. package/dist/worker/serialize-error.js +95 -0
  313. package/dist/worker/worker-types.d.ts +243 -0
  314. package/dist/worker/worker-types.js +1 -0
  315. package/dist/worker-bun-entry.d.ts +1 -0
  316. package/dist/worker-bun-entry.js +5 -0
  317. package/dist/worker-entry.d.ts +1 -0
  318. package/dist/worker-entry.js +5 -0
  319. package/dist/worker-server-entry.d.ts +1 -0
  320. package/dist/worker-server-entry.js +5 -0
  321. package/dist/worker-server.d.ts +2 -0
  322. package/dist/worker-server.js +381 -0
  323. package/dist/worker-web-entry.d.ts +1 -0
  324. package/dist/worker-web-entry.js +5 -0
  325. package/dist/worker.d.ts +2 -0
  326. package/dist/worker.js +267 -0
  327. package/dist/writers/node.js +16 -23
  328. package/dist/writers/writer.js +1 -2
  329. package/package.json +40 -21
  330. package/fetch.js +0 -2
  331. package/test.json +0 -663
  332. package/web-file.js +0 -2
package/dist/esm/node.mjs CHANGED
@@ -1,44 +1,67 @@
1
1
  // src/readers/from-node.ts
2
- import { createReadStream, statSync } from "fs";
3
- import { sep } from "path";
2
+ import { createReadStream, promises, statSync } from "fs";
3
+ import { dirname, join, relative, sep } from "path";
4
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
- });
5
+ var nodeReadContent = ({ src, range, controller }) => {
6
+ if (typeof src !== "string") {
7
+ throw new Error("src must be a string when using `nodeReader`");
8
+ }
9
+ const ownController = new AbortController;
10
+ const stream = createReadStream(src, {
11
+ start: range === null ? 0 : typeof range === "number" ? range : range[0],
12
+ end: range === null ? Infinity : typeof range === "number" ? Infinity : range[1],
13
+ signal: ownController.signal
14
+ });
15
+ controller._internals.signal.addEventListener("abort", () => {
16
+ ownController.abort();
17
+ }, { once: true });
18
+ const stats = statSync(src);
19
+ const reader = Readable.toWeb(stream).getReader();
20
+ if (controller) {
16
21
  controller._internals.signal.addEventListener("abort", () => {
17
- ownController.abort();
22
+ reader.cancel().catch(() => {
23
+ });
18
24
  }, { 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
- needsContentRange: true
39
- });
40
25
  }
26
+ return Promise.resolve({
27
+ reader: {
28
+ reader,
29
+ abort: () => {
30
+ ownController.abort();
31
+ }
32
+ },
33
+ contentLength: stats.size,
34
+ contentType: null,
35
+ name: src.split(sep).pop(),
36
+ supportsContentRange: true,
37
+ needsContentRange: true
38
+ });
39
+ };
40
+ var nodeReadWholeAsText = (src) => {
41
+ if (typeof src !== "string") {
42
+ throw new Error("src must be a string when using `nodeReader`");
43
+ }
44
+ return promises.readFile(src, "utf8");
45
+ };
46
+ var nodeCreateAdjacentFileSource = (relativePath, src) => {
47
+ if (typeof src !== "string") {
48
+ throw new Error("src must be a string when using `nodeReader`");
49
+ }
50
+ const result = join(dirname(src), relativePath);
51
+ const rel = relative(dirname(src), result);
52
+ if (rel.startsWith("..")) {
53
+ throw new Error("Path is outside of the parent directory - not allowing reading of arbitrary files");
54
+ }
55
+ return result;
56
+ };
57
+ var nodeReader = {
58
+ read: nodeReadContent,
59
+ readWholeAsText: nodeReadWholeAsText,
60
+ createAdjacentFileSource: nodeCreateAdjacentFileSource
41
61
  };
42
62
  export {
43
- nodeReader
63
+ nodeReader,
64
+ nodeReadWholeAsText,
65
+ nodeReadContent,
66
+ nodeCreateAdjacentFileSource
44
67
  };
@@ -0,0 +1,323 @@
1
+ // src/errors.ts
2
+ class MediaParserAbortError extends Error {
3
+ constructor(message) {
4
+ super(message);
5
+ this.name = "MediaParserAbortError";
6
+ this.cause = undefined;
7
+ }
8
+ }
9
+
10
+ // src/readers/fetch/get-body-and-reader.ts
11
+ var getLengthAndReader = async ({
12
+ canLiveWithoutContentLength,
13
+ res,
14
+ ownController,
15
+ requestedWithoutRange
16
+ }) => {
17
+ const length = res.headers.get("content-length");
18
+ const contentLength = length === null ? null : parseInt(length, 10);
19
+ if (requestedWithoutRange || canLiveWithoutContentLength && contentLength === null) {
20
+ const buffer = await res.arrayBuffer();
21
+ const encoded = new Uint8Array(buffer);
22
+ const stream = new ReadableStream({
23
+ start(controller) {
24
+ controller.enqueue(encoded);
25
+ controller.close();
26
+ }
27
+ });
28
+ return {
29
+ contentLength: encoded.byteLength,
30
+ reader: {
31
+ reader: stream.getReader(),
32
+ abort() {
33
+ ownController.abort();
34
+ }
35
+ },
36
+ needsContentRange: false
37
+ };
38
+ }
39
+ if (!res.body) {
40
+ throw new Error("No body");
41
+ }
42
+ const reader = res.body.getReader();
43
+ return {
44
+ reader: {
45
+ reader,
46
+ abort: () => {
47
+ ownController.abort();
48
+ }
49
+ },
50
+ contentLength,
51
+ needsContentRange: true
52
+ };
53
+ };
54
+
55
+ // src/readers/fetch/resolve-url.ts
56
+ var resolveUrl = (src) => {
57
+ try {
58
+ const resolvedUrl = typeof window !== "undefined" && typeof window.location !== "undefined" ? new URL(src, window.location.origin) : new URL(src);
59
+ return resolvedUrl;
60
+ } catch {
61
+ return src;
62
+ }
63
+ };
64
+
65
+ // src/readers/from-fetch.ts
66
+ function parseContentRange(input) {
67
+ const matches = input.match(/^(\w+) ((\d+)-(\d+)|\*)\/(\d+|\*)$/);
68
+ if (!matches)
69
+ return null;
70
+ const [, unit, , start, end, size] = matches;
71
+ const range = {
72
+ unit,
73
+ start: start != null ? Number(start) : null,
74
+ end: end != null ? Number(end) : null,
75
+ size: size === "*" ? null : Number(size)
76
+ };
77
+ if (range.start === null && range.end === null && range.size === null) {
78
+ return null;
79
+ }
80
+ return range;
81
+ }
82
+ var validateContentRangeAndDetectIfSupported = ({
83
+ requestedRange,
84
+ parsedContentRange,
85
+ statusCode
86
+ }) => {
87
+ if (statusCode === 206) {
88
+ return { supportsContentRange: true };
89
+ }
90
+ if (typeof requestedRange === "number" && parsedContentRange?.start !== requestedRange) {
91
+ if (requestedRange === 0) {
92
+ return { supportsContentRange: false };
93
+ }
94
+ throw new Error(`Range header (${requestedRange}) does not match content-range header (${parsedContentRange?.start})`);
95
+ }
96
+ if (requestedRange !== null && typeof requestedRange !== "number" && (parsedContentRange?.start !== requestedRange[0] || parsedContentRange?.end !== requestedRange[1])) {
97
+ throw new Error(`Range header (${requestedRange}) does not match content-range header (${parsedContentRange?.start})`);
98
+ }
99
+ return { supportsContentRange: true };
100
+ };
101
+ var fetchReadContent = async ({
102
+ src,
103
+ range,
104
+ controller
105
+ }) => {
106
+ if (typeof src !== "string" && src instanceof URL === false) {
107
+ throw new Error("src must be a string when using `fetchReader`");
108
+ }
109
+ const resolvedUrl = resolveUrl(src);
110
+ const resolvedUrlString = resolvedUrl.toString();
111
+ if (!resolvedUrlString.startsWith("https://") && !resolvedUrlString.startsWith("blob:") && !resolvedUrlString.startsWith("http://")) {
112
+ return Promise.reject(new Error(`${resolvedUrlString} 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().`));
113
+ }
114
+ const ownController = new AbortController;
115
+ const cache = typeof navigator !== "undefined" && navigator.userAgent.includes("Cloudflare-Workers") ? undefined : "no-store";
116
+ const requestedRange = range === null ? 0 : range;
117
+ const asString = typeof resolvedUrl === "string" ? resolvedUrl : resolvedUrl.pathname;
118
+ const requestWithoutRange = asString.endsWith(".m3u8");
119
+ const canLiveWithoutContentLength = asString.endsWith(".m3u8") || asString.endsWith(".ts");
120
+ const headers = requestedRange === 0 && requestWithoutRange ? {} : typeof requestedRange === "number" ? {
121
+ Range: `bytes=${requestedRange}-`
122
+ } : {
123
+ Range: `bytes=${`${requestedRange[0]}-${requestedRange[1]}`}`
124
+ };
125
+ const res = await fetch(resolvedUrl, {
126
+ headers,
127
+ signal: ownController.signal,
128
+ cache
129
+ });
130
+ const contentRange = res.headers.get("content-range");
131
+ const parsedContentRange = contentRange ? parseContentRange(contentRange) : null;
132
+ const { supportsContentRange } = validateContentRangeAndDetectIfSupported({
133
+ requestedRange,
134
+ parsedContentRange,
135
+ statusCode: res.status
136
+ });
137
+ controller._internals.signal.addEventListener("abort", () => {
138
+ ownController.abort(new MediaParserAbortError("Aborted by user"));
139
+ }, { once: true });
140
+ if (res.status.toString().startsWith("4") || res.status.toString().startsWith("5")) {
141
+ throw new Error(`Server returned status code ${res.status} for ${src} and range ${requestedRange}`);
142
+ }
143
+ const contentDisposition = res.headers.get("content-disposition");
144
+ const name = contentDisposition?.match(/filename="([^"]+)"/)?.[1];
145
+ const fallbackName = src.toString().split("/").pop();
146
+ const { contentLength, needsContentRange, reader } = await getLengthAndReader({
147
+ canLiveWithoutContentLength,
148
+ res,
149
+ ownController,
150
+ requestedWithoutRange: requestWithoutRange
151
+ });
152
+ if (controller) {
153
+ controller._internals.signal.addEventListener("abort", () => {
154
+ reader.reader.cancel().catch(() => {
155
+ });
156
+ }, { once: true });
157
+ }
158
+ return {
159
+ reader,
160
+ contentLength,
161
+ contentType: res.headers.get("content-type"),
162
+ name: name ?? fallbackName,
163
+ supportsContentRange,
164
+ needsContentRange
165
+ };
166
+ };
167
+ var fetchReadWholeAsText = async (src) => {
168
+ if (typeof src !== "string" && src instanceof URL === false) {
169
+ throw new Error("src must be a string when using `fetchReader`");
170
+ }
171
+ const res = await fetch(src);
172
+ if (!res.ok) {
173
+ throw new Error(`Failed to fetch ${src} (HTTP code: ${res.status})`);
174
+ }
175
+ return res.text();
176
+ };
177
+ var fetchCreateAdjacentFileSource = (relativePath, src) => {
178
+ if (typeof src !== "string" && src instanceof URL === false) {
179
+ throw new Error("src must be a string or URL when using `fetchReader`");
180
+ }
181
+ return new URL(relativePath, src).toString();
182
+ };
183
+
184
+ // src/readers/from-node.ts
185
+ import { createReadStream, promises, statSync } from "fs";
186
+ import { dirname, join, relative, sep } from "path";
187
+ import { Readable } from "stream";
188
+ var nodeReadContent = ({ src, range, controller }) => {
189
+ if (typeof src !== "string") {
190
+ throw new Error("src must be a string when using `nodeReader`");
191
+ }
192
+ const ownController = new AbortController;
193
+ const stream = createReadStream(src, {
194
+ start: range === null ? 0 : typeof range === "number" ? range : range[0],
195
+ end: range === null ? Infinity : typeof range === "number" ? Infinity : range[1],
196
+ signal: ownController.signal
197
+ });
198
+ controller._internals.signal.addEventListener("abort", () => {
199
+ ownController.abort();
200
+ }, { once: true });
201
+ const stats = statSync(src);
202
+ const reader = Readable.toWeb(stream).getReader();
203
+ if (controller) {
204
+ controller._internals.signal.addEventListener("abort", () => {
205
+ reader.cancel().catch(() => {
206
+ });
207
+ }, { once: true });
208
+ }
209
+ return Promise.resolve({
210
+ reader: {
211
+ reader,
212
+ abort: () => {
213
+ ownController.abort();
214
+ }
215
+ },
216
+ contentLength: stats.size,
217
+ contentType: null,
218
+ name: src.split(sep).pop(),
219
+ supportsContentRange: true,
220
+ needsContentRange: true
221
+ });
222
+ };
223
+ var nodeReadWholeAsText = (src) => {
224
+ if (typeof src !== "string") {
225
+ throw new Error("src must be a string when using `nodeReader`");
226
+ }
227
+ return promises.readFile(src, "utf8");
228
+ };
229
+ var nodeCreateAdjacentFileSource = (relativePath, src) => {
230
+ if (typeof src !== "string") {
231
+ throw new Error("src must be a string when using `nodeReader`");
232
+ }
233
+ const result = join(dirname(src), relativePath);
234
+ const rel = relative(dirname(src), result);
235
+ if (rel.startsWith("..")) {
236
+ throw new Error("Path is outside of the parent directory - not allowing reading of arbitrary files");
237
+ }
238
+ return result;
239
+ };
240
+
241
+ // src/readers/from-web-file.ts
242
+ var webFileReadContent = ({ src, range, controller }) => {
243
+ if (typeof src === "string" || src instanceof URL) {
244
+ throw new Error("`inputTypeFileReader` only supports `File` objects");
245
+ }
246
+ const part = range === null ? src : typeof range === "number" ? src.slice(range) : src.slice(range[0], range[1]);
247
+ const reader = new FileReader;
248
+ reader.readAsArrayBuffer(src);
249
+ const ownController = new AbortController;
250
+ if (ownController) {
251
+ ownController.signal.addEventListener("abort", () => {
252
+ reader.abort();
253
+ }, { once: true });
254
+ }
255
+ if (controller) {
256
+ controller._internals.signal.addEventListener("abort", () => {
257
+ ownController.abort();
258
+ }, { once: true });
259
+ }
260
+ return new Promise((resolve, reject) => {
261
+ reader.onload = () => {
262
+ const stream = part.stream();
263
+ const streamReader = stream.getReader();
264
+ resolve({
265
+ reader: {
266
+ reader: streamReader,
267
+ abort() {
268
+ streamReader.cancel();
269
+ ownController.abort();
270
+ }
271
+ },
272
+ contentLength: src.size,
273
+ name: src.name,
274
+ supportsContentRange: true,
275
+ contentType: src.type,
276
+ needsContentRange: true
277
+ });
278
+ };
279
+ reader.onerror = () => {
280
+ reject(reader.error);
281
+ };
282
+ });
283
+ };
284
+ var webFileReadWholeAsText = () => {
285
+ throw new Error("`webFileReader` cannot read auxiliary files.");
286
+ };
287
+ var webFileCreateAdjacentFileSource = () => {
288
+ throw new Error("`webFileReader` cannot create adjacent file sources.");
289
+ };
290
+
291
+ // src/readers/universal.ts
292
+ var universalReader = {
293
+ read: (params) => {
294
+ if (params.src instanceof Blob) {
295
+ return webFileReadContent(params);
296
+ }
297
+ if (params.src.toString().startsWith("http") || params.src.toString().startsWith("blob:")) {
298
+ return fetchReadContent(params);
299
+ }
300
+ return nodeReadContent(params);
301
+ },
302
+ readWholeAsText: (src) => {
303
+ if (src instanceof Blob) {
304
+ return webFileReadWholeAsText(src);
305
+ }
306
+ if (src.toString().startsWith("http") || src.toString().startsWith("blob:")) {
307
+ return fetchReadWholeAsText(src);
308
+ }
309
+ return nodeReadWholeAsText(src);
310
+ },
311
+ createAdjacentFileSource: (relativePath, src) => {
312
+ if (src instanceof Blob) {
313
+ return webFileCreateAdjacentFileSource(relativePath, src);
314
+ }
315
+ if (src.toString().startsWith("http") || src.toString().startsWith("blob:")) {
316
+ return fetchCreateAdjacentFileSource(relativePath, src);
317
+ }
318
+ return nodeCreateAdjacentFileSource(relativePath, src);
319
+ }
320
+ };
321
+ export {
322
+ universalReader
323
+ };
@@ -1,48 +1,60 @@
1
1
  // src/readers/from-web-file.ts
2
- var webFileReader = {
3
- read: ({ src, range, controller }) => {
4
- if (typeof src === "string") {
5
- throw new Error("`inputTypeFileReader` only supports `File` objects");
6
- }
7
- const part = range === null ? src : typeof range === "number" ? src.slice(range) : src.slice(range[0], range[1]);
8
- const reader = new FileReader;
9
- reader.readAsArrayBuffer(src);
10
- const ownController = new AbortController;
11
- if (ownController) {
12
- ownController.signal.addEventListener("abort", () => {
13
- reader.abort();
14
- }, { once: true });
15
- }
16
- if (controller) {
17
- controller._internals.signal.addEventListener("abort", () => {
18
- ownController.abort();
19
- }, { once: true });
20
- }
21
- return new Promise((resolve, reject) => {
22
- reader.onload = () => {
23
- const stream = part.stream();
24
- const streamReader = stream.getReader();
25
- resolve({
26
- reader: {
27
- reader: streamReader,
28
- abort() {
29
- streamReader.cancel();
30
- ownController.abort();
31
- }
32
- },
33
- contentLength: src.size,
34
- name: src.name,
35
- supportsContentRange: true,
36
- contentType: src.type,
37
- needsContentRange: true
38
- });
39
- };
40
- reader.onerror = (error) => {
41
- reject(error);
42
- };
43
- });
2
+ var webFileReadContent = ({ src, range, controller }) => {
3
+ if (typeof src === "string" || src instanceof URL) {
4
+ throw new Error("`inputTypeFileReader` only supports `File` objects");
5
+ }
6
+ const part = range === null ? src : typeof range === "number" ? src.slice(range) : src.slice(range[0], range[1]);
7
+ const reader = new FileReader;
8
+ reader.readAsArrayBuffer(src);
9
+ const ownController = new AbortController;
10
+ if (ownController) {
11
+ ownController.signal.addEventListener("abort", () => {
12
+ reader.abort();
13
+ }, { once: true });
44
14
  }
15
+ if (controller) {
16
+ controller._internals.signal.addEventListener("abort", () => {
17
+ ownController.abort();
18
+ }, { once: true });
19
+ }
20
+ return new Promise((resolve, reject) => {
21
+ reader.onload = () => {
22
+ const stream = part.stream();
23
+ const streamReader = stream.getReader();
24
+ resolve({
25
+ reader: {
26
+ reader: streamReader,
27
+ abort() {
28
+ streamReader.cancel();
29
+ ownController.abort();
30
+ }
31
+ },
32
+ contentLength: src.size,
33
+ name: src.name,
34
+ supportsContentRange: true,
35
+ contentType: src.type,
36
+ needsContentRange: true
37
+ });
38
+ };
39
+ reader.onerror = (error) => {
40
+ reject(error);
41
+ };
42
+ });
43
+ };
44
+ var webFileReadWholeAsText = () => {
45
+ throw new Error("`webFileReader` cannot read auxiliary files.");
46
+ };
47
+ var webFileCreateAdjacentFileSource = () => {
48
+ throw new Error("`webFileReader` cannot create adjacent file sources.");
49
+ };
50
+ var webFileReader = {
51
+ read: webFileReadContent,
52
+ readWholeAsText: webFileReadWholeAsText,
53
+ createAdjacentFileSource: webFileCreateAdjacentFileSource
45
54
  };
46
55
  export {
47
- webFileReader
56
+ webFileReader,
57
+ webFileReadWholeAsText,
58
+ webFileReadContent,
59
+ webFileCreateAdjacentFileSource
48
60
  };