securityos/node_modules/music-metadata/lib/ogg/vorbis/Vorbis.js

79 lines
2.8 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.IdentificationHeader = exports.CommonHeader = exports.VorbisPictureToken = void 0;
const Token = require("token-types");
const ID3v2Token_1 = require("../../id3v2/ID3v2Token");
/**
* Parse the METADATA_BLOCK_PICTURE
* Ref: https://wiki.xiph.org/VorbisComment#METADATA_BLOCK_PICTURE
* Ref: https://xiph.org/flac/format.html#metadata_block_picture
* // ToDo: move to ID3 / APIC?
*/
class VorbisPictureToken {
static fromBase64(base64str) {
return this.fromBuffer(Buffer.from(base64str, 'base64'));
}
static fromBuffer(buffer) {
const pic = new VorbisPictureToken(buffer.length);
return pic.get(buffer, 0);
}
constructor(len) {
this.len = len;
}
get(buffer, offset) {
const type = ID3v2Token_1.AttachedPictureType[Token.UINT32_BE.get(buffer, offset)];
const mimeLen = Token.UINT32_BE.get(buffer, offset += 4);
const format = buffer.toString('utf-8', offset += 4, offset + mimeLen);
const descLen = Token.UINT32_BE.get(buffer, offset += mimeLen);
const description = buffer.toString('utf-8', offset += 4, offset + descLen);
const width = Token.UINT32_BE.get(buffer, offset += descLen);
const height = Token.UINT32_BE.get(buffer, offset += 4);
const colour_depth = Token.UINT32_BE.get(buffer, offset += 4);
const indexed_color = Token.UINT32_BE.get(buffer, offset += 4);
const picDataLen = Token.UINT32_BE.get(buffer, offset += 4);
const data = Buffer.from(buffer.slice(offset += 4, offset + picDataLen));
return {
type,
format,
description,
width,
height,
colour_depth,
indexed_color,
data
};
}
}
exports.VorbisPictureToken = VorbisPictureToken;
/**
* Comment header decoder
* Ref: https://xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-620004.2.1
*/
exports.CommonHeader = {
len: 7,
get: (buf, off) => {
return {
packetType: buf.readUInt8(off),
vorbis: new Token.StringType(6, 'ascii').get(buf, off + 1)
};
}
};
/**
* Identification header decoder
* Ref: https://xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-630004.2.2
*/
exports.IdentificationHeader = {
len: 23,
get: (uint8Array, off) => {
const dataView = new DataView(uint8Array.buffer, uint8Array.byteOffset);
return {
version: dataView.getUint32(off + 0, true),
channelMode: dataView.getUint8(off + 4),
sampleRate: dataView.getUint32(off + 5, true),
bitrateMax: dataView.getUint32(off + 9, true),
bitrateNominal: dataView.getUint32(off + 13, true),
bitrateMin: dataView.getUint32(off + 17, true)
};
}
};