hls-streamer 3.1.0 → 4.0.2

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 (76) hide show
  1. package/README.md +145 -106
  2. package/dist/Interfaces/HlsStreamer.d.ts +4 -3
  3. package/dist/Interfaces/HlsStreamer.d.ts.map +1 -1
  4. package/dist/Libs/FileLib.d.ts +11 -5
  5. package/dist/Libs/FileLib.d.ts.map +1 -1
  6. package/dist/Libs/FileLib.js +9 -3
  7. package/dist/Libs/FileLib.js.map +1 -1
  8. package/dist/Libs/FormatDetector.d.ts +3 -3
  9. package/dist/Libs/FormatDetector.d.ts.map +1 -1
  10. package/dist/Libs/FormatDetector.js +19 -2
  11. package/dist/Libs/FormatDetector.js.map +1 -1
  12. package/dist/Parsers/AacParser.d.ts +4 -4
  13. package/dist/Parsers/AacParser.d.ts.map +1 -1
  14. package/dist/Parsers/AacParser.js +5 -1
  15. package/dist/Parsers/AacParser.js.map +1 -1
  16. package/dist/Parsers/FlacParser.d.ts +4 -4
  17. package/dist/Parsers/IAudioParser.d.ts +1 -30
  18. package/dist/Parsers/IAudioParser.d.ts.map +1 -1
  19. package/dist/Parsers/IMediaParser.d.ts +43 -0
  20. package/dist/Parsers/IMediaParser.d.ts.map +1 -0
  21. package/dist/Parsers/IMediaParser.js +2 -0
  22. package/dist/Parsers/IMediaParser.js.map +1 -0
  23. package/dist/Parsers/Mp3Parser.d.ts +4 -4
  24. package/dist/Parsers/Mp4Parser.d.ts +21 -0
  25. package/dist/Parsers/Mp4Parser.d.ts.map +1 -0
  26. package/dist/Parsers/Mp4Parser.js +418 -0
  27. package/dist/Parsers/Mp4Parser.js.map +1 -0
  28. package/dist/Parsers/OggParser.d.ts +4 -4
  29. package/dist/Parsers/ParserFactory.d.ts +5 -5
  30. package/dist/Parsers/ParserFactory.d.ts.map +1 -1
  31. package/dist/Parsers/ParserFactory.js +6 -3
  32. package/dist/Parsers/ParserFactory.js.map +1 -1
  33. package/dist/Parsers/WavParser.d.ts +4 -4
  34. package/dist/cjs/Interfaces/HlsStreamer.d.ts +4 -3
  35. package/dist/cjs/Interfaces/HlsStreamer.d.ts.map +1 -1
  36. package/dist/cjs/Libs/FileLib.d.ts +11 -5
  37. package/dist/cjs/Libs/FileLib.d.ts.map +1 -1
  38. package/dist/cjs/Libs/FileLib.js +9 -3
  39. package/dist/cjs/Libs/FileLib.js.map +1 -1
  40. package/dist/cjs/Libs/FormatDetector.d.ts +3 -3
  41. package/dist/cjs/Libs/FormatDetector.d.ts.map +1 -1
  42. package/dist/cjs/Libs/FormatDetector.js +19 -2
  43. package/dist/cjs/Libs/FormatDetector.js.map +1 -1
  44. package/dist/cjs/Parsers/AacParser.d.ts +4 -4
  45. package/dist/cjs/Parsers/AacParser.d.ts.map +1 -1
  46. package/dist/cjs/Parsers/AacParser.js +5 -1
  47. package/dist/cjs/Parsers/AacParser.js.map +1 -1
  48. package/dist/cjs/Parsers/FlacParser.d.ts +4 -4
  49. package/dist/cjs/Parsers/IAudioParser.d.ts +1 -30
  50. package/dist/cjs/Parsers/IAudioParser.d.ts.map +1 -1
  51. package/dist/cjs/Parsers/IMediaParser.d.ts +43 -0
  52. package/dist/cjs/Parsers/IMediaParser.d.ts.map +1 -0
  53. package/dist/cjs/Parsers/IMediaParser.js +3 -0
  54. package/dist/cjs/Parsers/IMediaParser.js.map +1 -0
  55. package/dist/cjs/Parsers/Mp3Parser.d.ts +4 -4
  56. package/dist/cjs/Parsers/Mp4Parser.d.ts +21 -0
  57. package/dist/cjs/Parsers/Mp4Parser.d.ts.map +1 -0
  58. package/dist/cjs/Parsers/Mp4Parser.js +422 -0
  59. package/dist/cjs/Parsers/Mp4Parser.js.map +1 -0
  60. package/dist/cjs/Parsers/OggParser.d.ts +4 -4
  61. package/dist/cjs/Parsers/ParserFactory.d.ts +5 -5
  62. package/dist/cjs/Parsers/ParserFactory.d.ts.map +1 -1
  63. package/dist/cjs/Parsers/ParserFactory.js +6 -3
  64. package/dist/cjs/Parsers/ParserFactory.js.map +1 -1
  65. package/dist/cjs/Parsers/WavParser.d.ts +4 -4
  66. package/dist/cjs/errors/HlsStreamerErrors.js +1 -1
  67. package/dist/cjs/index.d.ts +1 -0
  68. package/dist/cjs/index.d.ts.map +1 -1
  69. package/dist/cjs/index.js +21 -6
  70. package/dist/cjs/index.js.map +1 -1
  71. package/dist/errors/HlsStreamerErrors.js +1 -1
  72. package/dist/index.d.ts +1 -0
  73. package/dist/index.d.ts.map +1 -1
  74. package/dist/index.js +21 -6
  75. package/dist/index.js.map +1 -1
  76. package/package.json +8 -3
package/README.md CHANGED
@@ -1,10 +1,14 @@
1
+ <div align="center">
2
+ <img src="assets/header.png" alt="HLS Streamer" width="100%">
3
+ </div>
4
+
1
5
  # HLS Streamer
2
6
 
3
7
  [![npm version](https://badge.fury.io/js/hls-streamer.svg)](https://badge.fury.io/js/hls-streamer)
4
8
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
5
9
  [![TypeScript](https://img.shields.io/badge/%3C%2F%3E-TypeScript-%230074c1.svg)](https://www.typescriptlang.org/)
6
10
 
7
- HLS Streamer turns any audio file (MP3, AAC, M4A, OGG Vorbis, FLAC, WAV) into an HTTP Live Streaming (HLS) playlist on the fly. It analyses the source audio in-memory, builds frame-aligned byte ranges, and streams them without temporary files, native bindings, or external binaries like ffmpeg.
11
+ HLS Streamer converts audio and video files (MP3, AAC, M4A, OGG Vorbis, FLAC, WAV, MP4, MOV, M4V) into HTTP Live Streaming (HLS) playlists on the fly. It analyses the source file in-memory, builds frame-aligned byte ranges, and streams them without temporary files, native bindings, or external binaries like ffmpeg.
8
12
 
9
13
  ---
10
14
 
@@ -21,26 +25,27 @@ HLS Streamer turns any audio file (MP3, AAC, M4A, OGG Vorbis, FLAC, WAV) into an
21
25
 
22
26
  ## Why HLS Streamer?
23
27
 
24
- - **Multi-format support** – handles MP3, AAC, M4A, OGG Vorbis, FLAC, and WAV with automatic format detection.
28
+ - **Multi-format support** – handles MP3, AAC, M4A, OGG Vorbis, FLAC, WAV, MP4, MOV, and M4V with automatic format detection.
29
+ - **Audio + Video** – audio files produce standard HLS v6 playlists; video files produce HLS v7 fMP4 playlists with an `EXT-X-MAP` init segment and keyframe-aligned boundaries.
25
30
  - **Zero dependencies** – no shared libraries, no ffmpeg, no native compilation. Pure TypeScript parsers for all formats. Drop it into Docker, serverless, or edge runtimes.
26
- - **Accurate segments** – real audio frame/packet parsing provides true durations, `#EXTINF` metadata, and target durations that match playback.
27
- - **Frame-aligned byte ranges** – every segment begins and ends on verified frame/packet boundaries, preventing pops and clipped audio.
28
- - **No temp files** – streams straight from the source audio file using byte-range reads.
31
+ - **Accurate segments** – real frame/packet parsing provides true durations, `#EXTINF` metadata, and target durations that match playback.
32
+ - **Frame-aligned byte ranges** – every segment begins and ends on verified frame boundaries; video segments snap to keyframes to prevent decoding artifacts.
33
+ - **No temp files** – streams straight from the source file using byte-range reads.
29
34
  - **Fast-start aware** – optional smaller first segments improve startup latency for constrained networks.
30
35
  - **TypeScript first** – authored in TypeScript with full type definitions for your tooling and IDEs.
31
36
 
32
37
  ## How It Works
33
38
 
34
- 1. **Format detection** – automatically detects audio format from file content (magic bytes) or extension, with optional manual override.
35
- 2. **Metadata analysis** – format-specific parsers extract metadata (ID3/Vorbis comments/etc.), parse frame/packet headers, and produce a frame table with offsets, durations, and bitrates.
36
- 3. **Segment planning** – segment boundaries are calculated from the frame table so each segment contains whole frames/packets while matching your target sizes.
37
- 4. **Playlist generation** – `createM3U8()` emits an `#EXTM3U` playlist with accurate `#EXTINF` entries and `#EXT-X-TARGETDURATION` derived from the longest segment.
38
- 5. **On-demand byte ranges** – `getFileBuffer(start, end)` streams the exact bytes for a segment without reading the entire file into memory.
39
+ 1. **Format detection** – automatically detects format from file content (magic bytes / `ftyp` brand) or extension, with optional manual override.
40
+ 2. **Metadata analysis** – format-specific parsers extract frame/packet tables with offsets, durations, and (for video) keyframe markers.
41
+ 3. **Segment planning** – boundaries are calculated from the frame table so each segment contains whole frames while respecting your target size. Video segments snap to I-frame boundaries.
42
+ 4. **Playlist generation** – `createM3U8()` emits an `#EXTM3U` playlist. Audio files use HLS v6; video files use HLS v7 with `EXT-X-MAP` pointing to the `moov` init segment.
43
+ 5. **On-demand byte ranges** – `getFileBuffer(start, end)` reads only the bytes needed for a given segment or init segment.
39
44
 
40
45
  ```
41
46
  ┌──────────────┐ ┌─────────────────┐ ┌─────────────────┐ ┌──────────────────────┐
42
- Audio Source │ ──▶ │ Format Detector │ ──▶ │ Format Parser │ ──▶ │ Segment Planner │
43
- │ (any format) │ │ (magic bytes) │ │ (MP3/AAC/etc.) │ │ (frame-aligned)
47
+ Media Source │ ──▶ │ Format Detector │ ──▶ │ Format Parser │ ──▶ │ Segment Planner │
48
+ │ (any format) │ │ (magic bytes) │ │ (MP3/MP4/etc.) │ │ (frame/keyframe)
44
49
  └──────────────┘ └─────────────────┘ └─────────────────┘ └──────────┬───────────┘
45
50
 
46
51
 
@@ -54,25 +59,34 @@ HLS Streamer turns any audio file (MP3, AAC, M4A, OGG Vorbis, FLAC, WAV) into an
54
59
  ```ts
55
60
  import { HlsStreamer } from 'hls-streamer';
56
61
 
57
- // Works with any supported format - auto-detected!
58
- const streamer = new HlsStreamer({
62
+ // Audio file auto-detected
63
+ const audioStreamer = new HlsStreamer({
59
64
  filePath: '/media/library/song.mp3', // or .aac, .m4a, .ogg, .flac, .wav
60
65
  segmentSizeKB: 512,
61
66
  fileName: 'track',
62
67
  baseUrl: 'audio/stream/session-42',
63
68
  enableFastStart: true,
64
- // format: 'mp3' // optional: override auto-detection
65
69
  });
66
70
 
67
- const playlist = await streamer.createM3U8();
68
- console.log(playlist);
71
+ const audioPlaylist = await audioStreamer.createM3U8();
72
+
73
+ // Video file — same API
74
+ const videoStreamer = new HlsStreamer({
75
+ filePath: '/media/library/movie.mp4', // or .mov, .m4v
76
+ segmentSizeKB: 2048,
77
+ fileName: 'segment',
78
+ baseUrl: 'video/stream/session-42',
79
+ });
80
+
81
+ const videoPlaylist = await videoStreamer.createM3U8();
69
82
 
70
- const firstSegmentBuffer = await streamer.getFileBuffer(0, 512 * 1024);
83
+ // Detect media type at runtime
84
+ const type = await videoStreamer.getMediaType(); // 'video' | 'audio'
71
85
  ```
72
86
 
73
87
  ## Serving Over HTTP
74
88
 
75
- Create playlists and segment endpoints with any HTTP framework. The example below shows an Express setup:
89
+ The example below shows an Express setup that handles both audio and video:
76
90
 
77
91
  ```ts
78
92
  import express from 'express';
@@ -83,7 +97,7 @@ const app = express();
83
97
  app.get('/streams/:id/playlist.m3u8', async (req, res, next) => {
84
98
  try {
85
99
  const streamer = new HlsStreamer({
86
- filePath: resolveAudioPath(req.params.id),
100
+ filePath: resolveMediaPath(req.params.id),
87
101
  baseUrl: `streams/${req.params.id}`,
88
102
  enableFastStart: true,
89
103
  });
@@ -98,14 +112,15 @@ app.get('/streams/:id/playlist.m3u8', async (req, res, next) => {
98
112
  app.get('/streams/:id/:start/:end/:filename', async (req, res, next) => {
99
113
  try {
100
114
  const streamer = new HlsStreamer({
101
- filePath: resolveAudioPath(req.params.id),
115
+ filePath: resolveMediaPath(req.params.id),
102
116
  baseUrl: `streams/${req.params.id}`,
103
117
  });
104
118
 
105
119
  const start = Number(req.params.start);
106
120
  const end = Number(req.params.end);
121
+ const mediaType = await streamer.getMediaType();
107
122
 
108
- res.type('audio/mpeg');
123
+ res.type(mediaType === 'video' ? 'video/mp4' : 'audio/mpeg');
109
124
  res.set('Accept-Ranges', 'bytes');
110
125
  res.send(await streamer.getFileBuffer(start, end));
111
126
  } catch (error) {
@@ -116,48 +131,60 @@ app.get('/streams/:id/:start/:end/:filename', async (req, res, next) => {
116
131
 
117
132
  ### Segment URL Contract
118
133
 
119
- Generated playlists follow the pattern below:
134
+ Generated playlists follow this pattern:
135
+
136
+ ```
137
+ /{baseUrl}/{startByte}/{endByte}/{fileName}{index}.{ext}
138
+ ```
139
+
140
+ For video files, an additional init segment URL is emitted as `EXT-X-MAP`:
120
141
 
121
142
  ```
122
- /{baseUrl}/{startByte}/{endByte}/{fileName}{index}.mp3
143
+ /{baseUrl}/{moovOffset}/{moovEnd}/{fileName}init.mp4
123
144
  ```
124
145
 
125
146
  - `startByte` is inclusive, `endByte` is exclusive.
126
147
  - `index` is zero-padded to three digits (`000`, `001`, ...).
127
- - Use the provided byte range as-is when serving `audio/mpeg` responses.
148
+ - Serve the exact byte range from the original file — no transcoding needed.
128
149
 
129
150
  ## Configuration Reference
130
151
 
131
- | Option | Type | Default | Description |
132
- | ------------------- | --------- | ------- | ----------- |
133
- | `filePath` | `string` | — | Absolute or relative path to the audio file. Supports: MP3, AAC, M4A, OGG, FLAC, WAV. |
134
- | `segmentSizeKB` | `number` | `512` | Target segment size in kilobytes. Fast-start mode splits the first two segments into quarters/halves of this value. |
135
- | `fileName` | `string` | `"file"` | Base name used in generated segment URLs (the index is appended automatically). |
136
- | `baseUrl` | `string` | `""` | URL prefix inserted before each segment path. Useful when mounting under a route or CDN prefix. |
137
- | `enableFastStart` | `boolean` | `false` | When true, the first two segments are smaller to reduce initial buffering time. |
138
- | `format` | `AudioFormat` | auto-detect | Optional format override ('mp3', 'aac', 'm4a', 'ogg', 'flac', 'wav'). Auto-detected from file if not specified. |
152
+ | Option | Type | Default | Description |
153
+ | ----------------- | ------------- | ------------ | ----------- |
154
+ | `filePath` | `string` | — | Path to the media file. Supports: MP3, AAC, M4A, OGG, FLAC, WAV, MP4, MOV, M4V. |
155
+ | `segmentSizeKB` | `number` | `512` | Target segment size in kilobytes. |
156
+ | `fileName` | `string` | `"file"` | Base name for generated segment URLs. |
157
+ | `baseUrl` | `string` | `""` | URL prefix inserted before each segment path. |
158
+ | `enableFastStart` | `boolean` | `false` | Smaller first two segments for faster playback start. |
159
+ | `format` | `MediaFormat` | auto-detect | Optional override: `'mp3'`, `'aac'`, `'m4a'`, `'ogg'`, `'flac'`, `'wav'`, `'mp4'`, `'mov'`, `'m4v'`. |
139
160
 
140
161
  ### API Surface
141
162
 
142
- - `createM3U8(): Promise<string>` – Returns a full playlist with frame-accurate durations.
143
- - `getFileBuffer(start: number, end: number): Promise<Buffer>` – Streams a byte range from the audio file.
144
- - `getSegmentDuration(index: number): Promise<number>` – Reads the cached segment table to return the duration of a segment in seconds.
163
+ - `createM3U8(): Promise<string>` – Full HLS playlist with frame-accurate durations. Audio → HLS v6; Video → HLS v7 + `EXT-X-MAP`.
164
+ - `getFileBuffer(start: number, end: number): Promise<Buffer>` – Byte-range read from the source file (used for both segments and the init segment).
165
+ - `getSegmentDuration(index: number): Promise<number>` – Duration in seconds for a specific segment.
166
+ - `getMediaType(): Promise<'audio' | 'video'>` – Returns `'video'` for MP4/MOV/M4V, `'audio'` for everything else.
145
167
 
146
- Custom error classes are exported to help with error handling: `FileNotFoundError`, `InvalidFileError`, `InvalidRangeError`, `InvalidParameterError`, and `UnsupportedFormatError`.
168
+ Custom error classes: `FileNotFoundError`, `InvalidFileError`, `InvalidRangeError`, `InvalidParameterError`, `UnsupportedFormatError`.
147
169
 
148
170
  ### Supported Formats
149
171
 
150
- | Format | Extensions | Container | Codec | Frame Parsing |
151
- |--------|-----------|-----------|-------|---------------|
152
- | **MP3** | `.mp3` | — | MPEG-1/2 Layer III | ✅ Full frame table |
153
- | **AAC** | `.aac` | ADTS | AAC | ✅ ADTS frames |
154
- | **M4A** | `.m4a`, `.m4b` | MP4 | AAC | ✅ MP4 box structure |
155
- | **OGG** | `.ogg`, `.oga` | OGG | Vorbis | ✅ OGG pages |
156
- | **FLAC** | `.flac` | — | FLAC | ✅ FLAC frames |
157
- | **WAV** | `.wav` | RIFF | PCM | ⚠️ Synthetic 1-second frames |
172
+ | Format | Extensions | Container | Codec | Frame Parsing |
173
+ | ------- | ------------------- | --------- | ------------ | ------------------------------- |
174
+ | **MP3** | `.mp3` | — | MPEG Layer 3 | ✅ Full frame table |
175
+ | **AAC** | `.aac` | ADTS | AAC | ✅ ADTS frames |
176
+ | **M4A** | `.m4a`, `.m4b` | MP4 | AAC | ✅ MP4 box structure |
177
+ | **OGG** | `.ogg`, `.oga` | OGG | Vorbis | ✅ OGG pages |
178
+ | **FLAC**| `.flac` | — | FLAC | ✅ FLAC frames |
179
+ | **WAV** | `.wav` | RIFF | PCM | ⚠️ Synthetic 1-second frames |
180
+ | **MP4** | `.mp4` | fMP4 | H.264/H.265 | ✅ ISOBMFF box parse + keyframes |
181
+ | **MOV** | `.mov` | QuickTime | H.264/H.265 | ✅ ISOBMFF box parse + keyframes |
182
+ | **M4V** | `.m4v` | MP4 | H.264/H.265 | ✅ ISOBMFF box parse + keyframes |
158
183
 
159
184
  ## Playlist Anatomy
160
185
 
186
+ ### Audio (HLS v6)
187
+
161
188
  ```m3u8
162
189
  #EXTM3U
163
190
  #EXT-X-VERSION:6
@@ -172,36 +199,49 @@ Custom error classes are exported to help with error handling: `FileNotFoundErro
172
199
  #EXT-X-ENDLIST
173
200
  ```
174
201
 
175
- - `#EXT-X-TARGETDURATION` is rounded up from the longest real segment duration.
176
- - `#EXTINF` entries retain millisecond precision for smooth playback on strict clients.
177
- - Segment paths directly encode the byte ranges your route must return.
202
+ ### Video (HLS v7 fMP4)
203
+
204
+ ```m3u8
205
+ #EXTM3U
206
+ #EXT-X-VERSION:7
207
+ #EXT-X-PLAYLIST-TYPE:VOD
208
+ #EXT-X-TARGETDURATION:4
209
+ #EXT-X-MEDIA-SEQUENCE:0
210
+ #EXT-X-MAP:URI="/video/session/0/28672/fileinit.mp4"
211
+ #EXTINF:4.000,
212
+ /video/session/28672/2125824/file000.mp4
213
+ #EXTINF:3.967,
214
+ /video/session/2125824/4194304/file001.mp4
215
+ ...
216
+ #EXT-X-ENDLIST
217
+ ```
218
+
219
+ - `EXT-X-MAP` points to the `moov` box (init segment) inside the original file — no remuxing.
220
+ - Video segment boundaries are snapped to keyframes for seamless decoding.
221
+ - `#EXTINF` retains millisecond precision for smooth playback.
178
222
 
179
223
  ## Operational Tips
180
224
 
181
- - **Caching** – Construct the streamer once per unique audio file and reuse it. Segment planning caches the metadata, so repeated calls to `createM3U8()` or `getSegmentDuration()` are cheap.
182
- - **CDN friendliness** – Because segment URLs are deterministic byte ranges, edge caches can serve them efficiently. Configure consistent caching headers (e.g. `Cache-Control: public, max-age=86400`).
183
- - **Serverless** – The zero-dependency design works well in Lambda/Cloud Functions. For large files, prefer streaming reads (`getFileBuffer`) instead of loading entire files into memory.
184
- - **Monitoring** – Log segment `start`/`end` pairs and durations to correlate playback issues with specific byte ranges or frame parsing warnings.
185
- - **Troubleshooting** – For corrupted files, inspect `FileLib.analyzeAudioFile()` to review parsing warnings and format-specific metadata.
186
- - **Format selection** – All formats work seamlessly with HLS, but consider:
187
- - **MP3/AAC/M4A**: Best compatibility with HLS players
188
- - **FLAC**: Lossless quality but larger segments
189
- - **OGG**: Open-source, good compression
190
- - **WAV**: Uncompressed, very large segments (consider smaller `segmentSizeKB`)
225
+ - **Caching** – Construct the streamer once per unique file and reuse it. Segment planning caches metadata after the first call.
226
+ - **Video segment size** – Use a larger `segmentSizeKB` (1024–4096) for video to avoid excessive HTTP requests. Audio works well at 512.
227
+ - **CDN friendliness** – Segment URLs are deterministic byte ranges, making them ideal for edge caching. Use `Cache-Control: public, max-age=86400`.
228
+ - **Serverless** – Zero-dependency design works in Lambda/Cloud Functions. `getFileBuffer` reads only the bytes needed, keeping memory usage low.
229
+ - **Content-Type** – Serve audio segments as `audio/mpeg` (or the appropriate codec MIME type) and video segments as `video/mp4`. Use `getMediaType()` to branch at runtime.
230
+ - **Troubleshooting** – Inspect `FileLib.analyzeMediaFile()` to review parsing warnings and format-specific metadata.
191
231
 
192
232
  ## Development
193
233
 
194
- Clone the repo, install dependencies, and run the usual scripts:
195
-
196
234
  ```bash
197
235
  npm install
198
- npm test -- --runInBand --watchman=false
236
+ npm test
199
237
  npm run build
200
238
  ```
201
239
 
202
- The Jest flag `--watchman=false` avoids macOS sandbox issues when running in restricted environments.
240
+ To run a single test file:
203
241
 
204
- To explore the example playlist generator, see `example/test-hls-generation.js` and the bundled `example/sample.mp3` fixture.
242
+ ```bash
243
+ npx jest tests/Parsers/Mp4Parser.test.ts
244
+ ```
205
245
 
206
246
  ## Support
207
247
 
@@ -211,65 +251,64 @@ To explore the example playlist generator, see `example/test-hls-generation.js`
211
251
 
212
252
  ## Contributing
213
253
 
214
- Contributions are welcome! Please open an issue to discuss substantial changes before submitting a pull request. Make sure `npm test -- --runInBand --watchman=false` and `npm run build` pass prior to filing the PR.
254
+ Contributions are welcome! Please open an issue to discuss substantial changes before submitting a pull request. Make sure `npm test` and `npm run build` pass prior to filing the PR.
215
255
 
216
256
  ---
217
257
 
218
258
  ## Release Notes
219
259
 
220
- ### Version 3.1.0
260
+ ### Version 4.0.0
221
261
 
222
- This release focuses on HLS compliance and format-detection reliability.
262
+ Major release adding video support and completing the audio→media rename.
223
263
 
224
- #### Fixes
225
- - **HLS playlist compliance**: `#EXTINF` lines now include the required trailing comma.
226
- - **AAC ADTS detection**: ADTS buffers are no longer misclassified as MP3 by broad sync checks.
227
- - **Parser routing**: MP3 parser detection now validates MPEG version/layer bits to avoid false positives on AAC-like headers.
228
- - **Extensionless files**: constructor validation now accepts extensionless (or mislabeled) files when magic bytes identify a supported audio format.
264
+ #### New Features
265
+ - **Video support** MP4, MOV, and M4V files are now fully supported via a pure-JS ISOBMFF (MP4 box) parser. No ffmpeg, no native bindings, no vendored libraries.
266
+ - **HLS v7 fMP4 playlists** video files produce `EXT-X-MAP` init segments and keyframe-aligned byte-range segments, fully compatible with Safari, Chrome, and HLS.js.
267
+ - **Keyframe-aware segmentation** video segment boundaries snap to I-frames, preventing decoding artifacts.
268
+ - **`getMediaType()`** new method returning `'audio' | 'video'` to simplify route/MIME-type logic.
269
+ - **`MediaFormat` / `MediaFileInfo` / `MediaFrameInfo`** – public types renamed from `Audio*` to `Media*` to reflect the broader scope.
229
270
 
230
- #### Quality improvements
231
- - Added regression tests for:
232
- - `#EXTINF` comma compliance
233
- - AAC-vs-MP3 sync ambiguity
234
- - extensionless supported file handling
271
+ #### Breaking Changes (from v3)
272
+ - `AudioFormat`, `AudioFileInfo`, `AudioFrameInfo`, `IAudioParser` are now **deprecated** aliases — they still compile but will be removed in v5.
273
+ - `FileLib.analyzeAudioFile()` and `analyzeAudioBuffer()` are deprecated; use `analyzeMediaFile()` / `analyzeMediaBuffer()`.
274
+ - `UnsupportedFormatError` message changed from `"Unsupported audio format"` to `"Unsupported media format"`.
275
+ - `format` option type widened from `AudioFormat` to `MediaFormat` (superset — no change needed for existing callers).
235
276
 
236
- ---
277
+ #### Migration Guide
237
278
 
238
- ## Version 3.0.0 Breaking Changes
279
+ ```typescript
280
+ // v3.x
281
+ import { AudioFormat, AudioFileInfo } from 'hls-streamer';
282
+ const type: AudioFormat = 'mp3';
239
283
 
240
- This major release adds multi-format support with pure TypeScript parsers. While most code remains backward compatible, please note:
284
+ // v4.x preferred
285
+ import { MediaFormat, MediaFileInfo } from 'hls-streamer';
286
+ const type: MediaFormat = 'mp3'; // same values, broader type
241
287
 
242
- ### What Changed
243
- - **New formats**: Added AAC, M4A, OGG Vorbis, FLAC, and WAV support
244
- - **Format detection**: Files are now validated against all supported formats, not just MP3
245
- - **Error types**: `InvalidFileError` for non-MP3 files is now `UnsupportedFormatError` for unsupported formats
246
- - **Internal architecture**: MP3 parsing refactored into modular `Parsers/` directory
288
+ // v3.x names still compile in v4 (deprecated, removed in v5)
289
+ import { AudioFormat } from 'hls-streamer'; // ⚠️ deprecated alias
247
290
 
248
- ### Migration Guide
249
- ```typescript
250
- // v2.x - Only MP3 supported
251
- const streamer = new HlsStreamer({ filePath: 'song.mp3' });
252
-
253
- // v3.x - All formats work the same way!
254
- const streamer = new HlsStreamer({ filePath: 'song.mp3' }); // ✅ Still works
255
- const streamer = new HlsStreamer({ filePath: 'song.ogg' }); // ✅ Now supported
256
- const streamer = new HlsStreamer({ filePath: 'song.flac' }); // ✅ Now supported
257
-
258
- // Error handling update
259
- try {
260
- new HlsStreamer({ filePath: 'document.pdf' });
261
- } catch (err) {
262
- // v2.x: InvalidFileError
263
- // v3.x: UnsupportedFormatError
264
- }
291
+ // Video — new in v4
292
+ const streamer = new HlsStreamer({ filePath: 'movie.mp4' });
293
+ const playlist = await streamer.createM3U8(); // HLS v7 + EXT-X-MAP
294
+ const type = await streamer.getMediaType(); // 'video'
265
295
  ```
266
296
 
267
- ### Deprecated APIs
268
- - `Mp3FileInfo` → Use `AudioFileInfo` (backward compatible, but deprecated)
269
- - `Mp3FrameInfo` → Use `AudioFrameInfo` (backward compatible, but deprecated)
270
- - `FileLib.analyzeMP3File()` → Use `FileLib.analyzeAudioFile()` (old method still works)
297
+ ---
298
+
299
+ ### Version 3.1.0
300
+
301
+ - **HLS compliance**: `#EXTINF` lines now include the required trailing comma.
302
+ - **AAC ADTS detection**: ADTS buffers no longer misclassified as MP3.
303
+ - **Extensionless files**: constructor now accepts extensionless files when magic bytes identify a supported format.
304
+
305
+ ---
306
+
307
+ ### Version 3.0.0
271
308
 
272
- All deprecated APIs remain functional for backward compatibility but will be removed in v4.0.0.
309
+ - Added AAC, M4A, OGG Vorbis, FLAC, and WAV support.
310
+ - Refactored MP3 parsing into a modular `Parsers/` directory.
311
+ - `InvalidFileError` for non-MP3 files replaced by `UnsupportedFormatError`.
273
312
 
274
313
  ---
275
314
 
@@ -1,18 +1,19 @@
1
- import { AudioFormat } from '../Parsers/IAudioParser';
1
+ import { MediaFormat } from '../Parsers/IMediaParser';
2
2
  export interface HlsStreamerOptions {
3
3
  filePath: string;
4
4
  segmentSizeKB?: number;
5
5
  fileName?: string;
6
6
  baseUrl?: string;
7
7
  enableFastStart?: boolean;
8
- format?: AudioFormat;
8
+ format?: MediaFormat;
9
9
  }
10
10
  export interface SegmentInfo {
11
11
  start: number;
12
12
  end: number;
13
13
  duration: number;
14
14
  }
15
- export type { AudioFormat, AudioFrameInfo, AudioFileInfo } from '../Parsers/IAudioParser';
15
+ export type { MediaFormat, MediaFrameInfo, MediaFileInfo, IMediaParser } from '../Parsers/IMediaParser';
16
+ export type { AudioFormat, AudioFrameInfo, AudioFileInfo, IAudioParser } from '../Parsers/IMediaParser';
16
17
  export interface Mp3FrameInfo {
17
18
  index: number;
18
19
  offset: number;
@@ -1 +1 @@
1
- {"version":3,"file":"HlsStreamer.d.ts","sourceRoot":"","sources":["../../src/Interfaces/HlsStreamer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAKtD,MAAM,WAAW,kBAAkB;IAEjC,QAAQ,EAAE,MAAM,CAAC;IAEjB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAKD,MAAM,WAAW,WAAW;IAE1B,KAAK,EAAE,MAAM,CAAC;IAEd,GAAG,EAAE,MAAM,CAAC;IAEZ,QAAQ,EAAE,MAAM,CAAC;CAClB;AAGD,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAM1F,MAAM,WAAW,YAAY;IAI3B,KAAK,EAAE,MAAM,CAAC;IAEd,MAAM,EAAE,MAAM,CAAC;IAEf,MAAM,EAAE,MAAM,CAAC;IAEf,QAAQ,EAAE,MAAM,CAAC;IAEjB,OAAO,EAAE,MAAM,CAAC;IAEhB,UAAU,EAAE,MAAM,CAAC;IAEnB,OAAO,EAAE,MAAM,CAAC;IAEhB,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;CACjB;AAMD,MAAM,WAAW,WAAW;IAE1B,IAAI,EAAE,MAAM,CAAC;IAEb,QAAQ,EAAE,MAAM,CAAC;IAEjB,aAAa,EAAE,MAAM,CAAC;IAEtB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,MAAM,EAAE,YAAY,EAAE,CAAC;IAEvB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB"}
1
+ {"version":3,"file":"HlsStreamer.d.ts","sourceRoot":"","sources":["../../src/Interfaces/HlsStreamer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAKtD,MAAM,WAAW,kBAAkB;IAEjC,QAAQ,EAAE,MAAM,CAAC;IAEjB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAKD,MAAM,WAAW,WAAW;IAE1B,KAAK,EAAE,MAAM,CAAC;IAEd,GAAG,EAAE,MAAM,CAAC;IAEZ,QAAQ,EAAE,MAAM,CAAC;CAClB;AAGD,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAGxG,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAKxG,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;CACjB;AAKD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB"}
@@ -1,5 +1,5 @@
1
- import { Mp3FileInfo, AudioFileInfo } from '../Interfaces/HlsStreamer';
2
- import { AudioFormat } from '../Parsers/IAudioParser';
1
+ import { Mp3FileInfo, MediaFileInfo } from '../Interfaces/HlsStreamer';
2
+ import { MediaFormat } from '../Parsers/IMediaParser';
3
3
  export declare class FileLib {
4
4
  private static readonly BITRATE_INDEX;
5
5
  private static readonly SAMPLE_RATE_INDEX;
@@ -9,12 +9,18 @@ export declare class FileLib {
9
9
  fileSize?: number;
10
10
  }): Mp3FileInfo;
11
11
  static analyzeMP3File(filePath: string): Promise<Mp3FileInfo>;
12
- static analyzeAudioFile(filePath: string, format?: AudioFormat): Promise<AudioFileInfo>;
12
+ static analyzeMediaFile(filePath: string, format?: MediaFormat): Promise<MediaFileInfo>;
13
+ static analyzeAudioFile(filePath: string, format?: MediaFormat): Promise<MediaFileInfo>;
14
+ static analyzeMediaBuffer(buffer: Buffer, opts?: {
15
+ fileSize?: number;
16
+ filePath?: string;
17
+ format?: MediaFormat;
18
+ }): MediaFileInfo;
13
19
  static analyzeAudioBuffer(buffer: Buffer, opts?: {
14
20
  fileSize?: number;
15
21
  filePath?: string;
16
- format?: AudioFormat;
17
- }): AudioFileInfo;
22
+ format?: MediaFormat;
23
+ }): MediaFileInfo;
18
24
  private static calculateFrameLength;
19
25
  private static getId3Offsets;
20
26
  private static syncSafeInteger;
@@ -1 +1 @@
1
- {"version":3,"file":"FileLib.d.ts","sourceRoot":"","sources":["../../src/Libs/FileLib.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAgB,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAGrF,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAqBtD,qBAAa,OAAO;IAClB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAgBnC;IAEF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAIvC;IAKF,MAAM,CAAC,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;WAWpC,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQzE,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,WAAW;WA8HzE,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;WAetD,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC;IAwB7F,MAAM,CAAC,kBAAkB,CACvB,MAAM,EAAE,MAAM,EACd,IAAI,GAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAO,GACxE,aAAa;IA6BhB,OAAO,CAAC,MAAM,CAAC,oBAAoB;IASnC,OAAO,CAAC,MAAM,CAAC,aAAa;IA8B5B,OAAO,CAAC,MAAM,CAAC,eAAe;IAO9B,OAAO,CAAC,MAAM,CAAC,WAAW;IAW1B,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAqC/B,OAAO,CAAC,MAAM,CAAC,aAAa;IAa5B,OAAO,CAAC,MAAM,CAAC,WAAW;IAa1B,OAAO,CAAC,MAAM,CAAC,kBAAkB;CAWlC"}
1
+ {"version":3,"file":"FileLib.d.ts","sourceRoot":"","sources":["../../src/Libs/FileLib.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAgB,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAGrF,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAqBtD,qBAAa,OAAO;IAClB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAgBnC;IAEF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAIvC;IAKF,MAAM,CAAC,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;WAWpC,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQzE,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,WAAW;WA8HzE,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;WAetD,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC;WAmBhF,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC;IAU7F,MAAM,CAAC,kBAAkB,CACvB,MAAM,EAAE,MAAM,EACd,IAAI,GAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAO,GACxE,aAAa;IA8BhB,MAAM,CAAC,kBAAkB,CACvB,MAAM,EAAE,MAAM,EACd,IAAI,GAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAO,GACxE,aAAa;IAIhB,OAAO,CAAC,MAAM,CAAC,oBAAoB;IASnC,OAAO,CAAC,MAAM,CAAC,aAAa;IA8B5B,OAAO,CAAC,MAAM,CAAC,eAAe;IAO9B,OAAO,CAAC,MAAM,CAAC,WAAW;IAW1B,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAqC/B,OAAO,CAAC,MAAM,CAAC,aAAa;IAa5B,OAAO,CAAC,MAAM,CAAC,WAAW;IAa1B,OAAO,CAAC,MAAM,CAAC,kBAAkB;CAWlC"}
@@ -116,7 +116,7 @@ export class FileLib {
116
116
  ]);
117
117
  return this.analyzeMP3Buffer(buffer, { fileSize: stat.size });
118
118
  }
119
- static async analyzeAudioFile(filePath, format) {
119
+ static async analyzeMediaFile(filePath, format) {
120
120
  const [buffer, stat] = await Promise.all([
121
121
  fs.promises.readFile(filePath),
122
122
  fs.promises.stat(filePath)
@@ -128,9 +128,12 @@ export class FileLib {
128
128
  if (format !== undefined) {
129
129
  opts.format = format;
130
130
  }
131
- return this.analyzeAudioBuffer(buffer, opts);
131
+ return this.analyzeMediaBuffer(buffer, opts);
132
132
  }
133
- static analyzeAudioBuffer(buffer, opts = {}) {
133
+ static async analyzeAudioFile(filePath, format) {
134
+ return this.analyzeMediaFile(filePath, format);
135
+ }
136
+ static analyzeMediaBuffer(buffer, opts = {}) {
134
137
  let parser;
135
138
  if (opts.format) {
136
139
  parser = ParserFactory.getParser(opts.format);
@@ -150,6 +153,9 @@ export class FileLib {
150
153
  const analyzeOpts = opts.fileSize !== undefined ? { fileSize: opts.fileSize } : {};
151
154
  return parser.analyze(buffer, analyzeOpts);
152
155
  }
156
+ static analyzeAudioBuffer(buffer, opts = {}) {
157
+ return this.analyzeMediaBuffer(buffer, opts);
158
+ }
153
159
  static calculateFrameLength(frame) {
154
160
  if (frame.layer === 1) {
155
161
  return Math.floor(((12 * frame.bitrate * 1000) / frame.sampleRate + frame.padding) * 4);
@@ -1 +1 @@
1
- {"version":3,"file":"FileLib.js","sourceRoot":"","sources":["../../src/Libs/FileLib.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FileLib.js","sourceRoot":"","sources":["../../src/Libs/FileLib.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
- import { AudioFormat } from '../Parsers/IAudioParser';
1
+ import { MediaFormat } from '../Parsers/IMediaParser';
2
2
  export declare class FormatDetector {
3
- static detectFormat(buffer: Buffer): AudioFormat | null;
4
- static detectFormatFromExtension(filePath: string): AudioFormat | null;
3
+ static detectFormat(buffer: Buffer): MediaFormat | null;
4
+ static detectFormatFromExtension(filePath: string): MediaFormat | null;
5
5
  static getSupportedExtensions(): string[];
6
6
  static isSupportedExtension(filePath: string): boolean;
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"FormatDetector.d.ts","sourceRoot":"","sources":["../../src/Libs/FormatDetector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAKtD,qBAAa,cAAc;IAMzB,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IA6DvD,MAAM,CAAC,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IA0BtE,MAAM,CAAC,sBAAsB,IAAI,MAAM,EAAE;IAOzC,MAAM,CAAC,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;CAIvD"}
1
+ {"version":3,"file":"FormatDetector.d.ts","sourceRoot":"","sources":["../../src/Libs/FormatDetector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAKtD,qBAAa,cAAc;IAMzB,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IA8EvD,MAAM,CAAC,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAgCtE,MAAM,CAAC,sBAAsB,IAAI,MAAM,EAAE;IAOzC,MAAM,CAAC,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;CAIvD"}
@@ -32,9 +32,20 @@ export class FormatDetector {
32
32
  }
33
33
  if (buffer.length >= 12 && buffer.toString('ascii', 4, 8) === 'ftyp') {
34
34
  const brand = buffer.toString('ascii', 8, 12);
35
- if (brand === 'M4A ' || brand === 'M4B ' || brand === 'mp42' || brand === 'isom') {
35
+ if (brand === 'M4A ' || brand === 'M4B ') {
36
36
  return 'm4a';
37
37
  }
38
+ if (brand === 'qt ') {
39
+ return 'mov';
40
+ }
41
+ if (brand.startsWith('M4V')) {
42
+ return 'm4v';
43
+ }
44
+ if (brand === 'mp42' || brand === 'isom' || brand === 'mp41' ||
45
+ brand === 'avc1' || brand === 'iso2' || brand === 'iso5' || brand === 'iso6') {
46
+ return 'mp4';
47
+ }
48
+ return 'mp4';
38
49
  }
39
50
  return null;
40
51
  }
@@ -55,12 +66,18 @@ export class FormatDetector {
55
66
  return 'flac';
56
67
  case 'wav':
57
68
  return 'wav';
69
+ case 'mp4':
70
+ return 'mp4';
71
+ case 'mov':
72
+ return 'mov';
73
+ case 'm4v':
74
+ return 'm4v';
58
75
  default:
59
76
  return null;
60
77
  }
61
78
  }
62
79
  static getSupportedExtensions() {
63
- return ['.mp3', '.aac', '.m4a', '.m4b', '.ogg', '.oga', '.flac', '.wav'];
80
+ return ['.mp3', '.aac', '.m4a', '.m4b', '.ogg', '.oga', '.flac', '.wav', '.mp4', '.mov', '.m4v'];
64
81
  }
65
82
  static isSupportedExtension(filePath) {
66
83
  const ext = '.' + filePath.toLowerCase().split('.').pop();