UNPKG

jamp3

Version:

mp3, id3v1, id3v2 - reader & writer

148 lines 5.96 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.ID3v2HeaderReader = void 0; const utils_1 = require("../common/utils"); const marker_1 = require("../common/marker"); const id3v2_header_consts_1 = require("./id3v2.header.consts"); class ID3v2HeaderReader { readID3ExtendedHeaderV3(reader) { return __awaiter(this, void 0, void 0, function* () { const headdata = yield reader.read(4); let size = headdata.readInt32BE(0); if (size > 10) { size = 6; } const data = yield reader.read(size); const exthead = { size, flags1: (0, utils_1.flags)(id3v2_header_consts_1.ID3v2_EXTHEADER[3].FLAGS1, (0, utils_1.bitarray)(data[0])), flags2: (0, utils_1.flags)(id3v2_header_consts_1.ID3v2_EXTHEADER[3].FLAGS2, (0, utils_1.bitarray)(data[1])), sizeOfPadding: data.readUInt32BE(2) }; if (exthead.flags1.crc && data.length > 6) { exthead.crcData = data.readUInt32BE(6); } return { exthead }; }); } readID3ExtendedHeaderV4(reader) { return __awaiter(this, void 0, void 0, function* () { const headdata = yield reader.read(4); let size = headdata.readInt32BE(0); size = (0, utils_1.unsynchsafe)(size); if (size > 10) { size = 6; } const data = yield reader.read(size); const exthead = { size, flags: (0, utils_1.flags)(id3v2_header_consts_1.ID3v2_EXTHEADER[4].FLAGS, (0, utils_1.bitarray)(data[0])) }; let pos = 1; if (exthead.flags.crc) { const crcSize = data[pos]; pos++; exthead.crc32 = (0, utils_1.unsynchsafe)(data.readInt32BE(pos)); pos += crcSize; } if (exthead.flags.restrictions) { pos++; const r = (0, utils_1.bitarray)(data[pos]); exthead.restrictions = { tagSize: r[0].toString() + r[1].toString(), textEncoding: r[2].toString(), textSize: r[3].toString() + r[4].toString(), imageEncoding: r[5].toString(), imageSize: r[6].toString() + r[7].toString() }; } return { exthead }; }); } readID3v22Header(head, flagBits) { head.v2 = { sizeAsSyncSafe: (0, utils_1.unsynchsafe)(head.size), flags: { unsynchronisation: flagBits[0] === 1, compression: flagBits[1] === 1, } }; } readID3v23Header(head, flagBits) { head.v3 = { flags: { unsynchronisation: flagBits[0] === 1, extendedheader: flagBits[1] === 1, experimental: flagBits[2] === 1 } }; } readID3v24Header(head, flagBits) { head.v4 = { flags: { unsynchronisation: flagBits[0] === 1, extendedheader: flagBits[1] === 1, experimental: flagBits[2] === 1, footer: flagBits[3] === 1 } }; } readID3v2Header(buffer, offset) { if ((!marker_1.Markers.isMarker(buffer, offset, marker_1.Markers.MARKERS.id3)) || (buffer.length < 10)) { return; } const flagBits = (0, utils_1.bitarray)(buffer[5]); const head = { ver: buffer[offset + 3], rev: buffer[offset + 4], size: buffer.readInt32BE(offset + 6), flagBits, valid: false }; if (head.ver > 2) { head.size = (0, utils_1.unsynchsafe)(head.size); } if (head.ver === 4) { this.readID3v24Header(head, flagBits); } else if (head.ver === 3) { this.readID3v23Header(head, flagBits); } else if (head.ver <= 2) { this.readID3v22Header(head, flagBits); } head.valid = head.size >= 0 && head.ver <= 4; return head; } readHeader(reader) { return __awaiter(this, void 0, void 0, function* () { const data = yield reader.read(id3v2_header_consts_1.ID3v2_HEADER.SIZE); const header = this.readID3v2Header(data, 0); if (!header || !header.valid) { return { rest: data }; } if (header.v3 && header.v3.flags.extendedheader) { const extended = yield this.readID3ExtendedHeaderV3(reader); header.v3.extended = extended.exthead; return { header, rest: extended.rest }; } else if (header.v4 && header.v4.flags.extendedheader) { const extended = yield this.readID3ExtendedHeaderV4(reader); header.v4.extended = extended.exthead; return { header, rest: extended.rest }; } return { header }; }); } } exports.ID3v2HeaderReader = ID3v2HeaderReader; //# sourceMappingURL=id3v2.reader.header.js.map