diff --git a/README.md b/README.md index 166c7b2..c3cc9e9 100644 --- a/README.md +++ b/README.md @@ -23,11 +23,30 @@ or $ yarn add @codedread/bitjs ``` -## bitjs.archive +### Using in Node + +This module is an ES Module, which should work as expected in other projects using ES Modules. However, +if you are using a project that uses CommonJs modules, it's a little tricker to use. One valid example +of this is if a TypeScript project compiles to CommonJS, it will try to turn imports into require() +statements, which will break. The fix for this (unfortunately) is to update your tsconfig.json: + +```json + "moduleResolution": "Node16", +``` + +and use a Dynamic Import: + +```javascript +const { getFullMIMEString } = await import('@codedread/bitjs'); +``` + +## Packages + +### bitjs.archive This package includes objects for unarchiving binary data in popular archive formats (zip, rar, tar) providing unzip, unrar and untar capabilities via JavaScript in the browser. A prototype version of a compressor that creates Zip files is also present. The decompression/compression actually happens inside a Web Worker. -### Decompressing +#### Decompressing ```javascript import { Unzipper } from './bitjs/archive/decompress.js'; @@ -69,7 +88,7 @@ unzipper.update(anArrayBufferWithMoreBytes); unzipper.update(anArrayBufferWithYetMoreBytes); ``` -### Compressing +#### Compressing The Zipper only supports creating zip files without compression (story only) for now. The interface is pretty straightforward and there is no event-based / streaming API. @@ -95,7 +114,7 @@ const zippedArrayBuffer = await zipper.start( true /* isLastFile */); ``` -## bitjs.codecs +### bitjs.codecs This package includes code for dealing with media files (audio/video). It is useful for deriving ISO RFC6381 MIME type strings, including the codec information. Currently supports a limited subset @@ -121,7 +140,7 @@ exec(cmd, (error, stdout) => { }); ``` -## bitjs.file +### bitjs.file This package includes code for dealing with files. It includes a sniffer which detects the type of file, given an ArrayBuffer. @@ -130,7 +149,7 @@ import { findMimeType } from './bitjs/file/sniffer.js'; const mimeType = findMimeType(someArrayBuffer); ``` -## bitjs.image +### bitjs.image This package includes code for dealing with binary images. It includes a module for converting WebP images into alternative raster graphics formats (PNG/JPG). @@ -145,7 +164,7 @@ convertWebPtoPNG(webpBuffer).then(pngBuf => { }); ``` -## bitjs.io +### bitjs.io This package includes stream objects for reading and writing binary data at the bit and byte level: BitStream, ByteStream. @@ -156,12 +175,6 @@ const crc = bstream.readBits(12); // read in 12 bits as CRC, advancing the point const flagbits = bstream.peekBits(6); // look ahead at next 6 bits, but do not advance the pointer ``` -# Other Tests - -Those that haven't been ported to mocha/chai/nodejs. - -* [bitjs.archive tests](https://codedread.github.io/bitjs/tests/archive-test.html) - ## Reference * [UnRar](http://codedread.github.io/bitjs/docs/unrar.html): A work-in-progress description of the RAR file format. diff --git a/codecs/codecs.js b/codecs/codecs.js index 4696348..d34f20d 100644 --- a/codecs/codecs.js +++ b/codecs/codecs.js @@ -27,7 +27,8 @@ */ /** - * @typedef ProbeFormat ffprobe -show_format -print_format json. Only the fields we care about. + * @typedef ProbeFormat Only the fields we care about from the following command: + * ffprobe -show_format -show_streams -v quiet -print_format json -i file.mp4 * @property {string} filename * @property {string} format_name * @property {string} duration Number of seconds, as a string like "473.506367". @@ -123,7 +124,7 @@ export function getFullMIMEString(info) { case 'opus': codecFrags.add('opus'); break; default: throw `Could not handle codec_name ${stream.codec_name}, ` + - `codec_tag_string ${stream.codec_tag_string} for file ${info.filename} yet. ` + + `codec_tag_string ${stream.codec_tag_string} for file ${info.format.filename} yet. ` + `Please file a bug https://github.com/codedread/bitjs/issues/new`; } break; @@ -141,9 +142,10 @@ export function getFullMIMEString(info) { switch (stream.codec_name) { case 'h264': codecFrags.add(getAVC1CodecString(stream)); break; case 'vp9': codecFrags.add(getVP09CodecString(stream)); break; + case 'mpeg2video': codecFrags.add('mpeg2video'); break; default: throw `Could not handle codec_name ${stream.codec_name}, ` + - `codec_tag_string ${stream.codec_tag_string} for file ${info.filename} yet. ` + + `codec_tag_string ${stream.codec_tag_string} for file ${info.format.filename} yet. ` + `Please file a bug https://github.com/codedread/bitjs/issues/new`; } diff --git a/package.json b/package.json index b074c12..6bbb4c8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@codedread/bitjs", - "version": "1.0.6", + "version": "1.0.7", "description": "Binary Tools for JavaScript", "homepage": "https://github.com/codedread/bitjs", "author": "Jeff Schiller", diff --git a/tests/codecs.spec.js b/tests/codecs.spec.js index 3547524..056e3c4 100644 --- a/tests/codecs.spec.js +++ b/tests/codecs.spec.js @@ -354,4 +354,25 @@ describe('codecs test suite', () => { .and.equals('audio/webm; codecs="opus"'); }); }); + + describe('MPEG2', () => { + /** @type {ProbeInfo} */ + let info; + + beforeEach(() => { + info = { + format: { format_name: 'matroska,webm' }, + streams: [{ + codec_type: 'video', + codec_name: 'mpeg2video', + }], + }; + }); + + it('detects mpeg2video', () => { + expect(getFullMIMEString(info)) + .to.be.a('string') + .and.equals('video/webm; codecs="mpeg2video"'); + }); + }); });