jamp3
Version:
mp3, id3v1, id3v2 - reader & writer
107 lines • 4.24 kB
JavaScript
;
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());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ID3v1Reader = exports.ID3v1_MARKER = void 0;
const marker_1 = require("../common/marker");
const buffer_1 = require("../common/buffer");
const debug_1 = __importDefault(require("debug"));
const __1 = require("../..");
const stream_reader_1 = require("../common/stream-reader");
const buffer_reader_1 = require("../common/buffer-reader");
const debug = (0, debug_1.default)('id3v1-reader');
exports.ID3v1_MARKER = 'TAG';
class ID3v1Reader {
readTag(data) {
if (data.length < 128 || !marker_1.Markers.isMarker(data, 0, marker_1.Markers.MARKERS.tag)) {
return null;
}
const tag = { id: __1.ITagID.ID3v1, start: 0, end: 0, version: 0, value: {} };
const reader = new buffer_reader_1.BufferReader(data);
reader.position = 3;
const value = {};
value.title = reader.readFixedAutodectectString(30);
value.artist = reader.readFixedAutodectectString(30);
value.album = reader.readFixedAutodectectString(30);
value.year = reader.readFixedAutodectectString(4);
if ((data[125] === 0) && (data[126] !== 0)) {
value.comment = reader.readFixedAutodectectString(29);
tag.version = 1;
value.track = reader.readByte();
}
else {
value.comment = reader.readFixedAutodectectString(30);
tag.version = 0;
}
value.genreIndex = reader.readByte();
tag.value = value;
return tag;
}
readReaderStream(reader) {
return __awaiter(this, void 0, void 0, function* () {
if (reader.end) {
return;
}
const index = yield reader.scan(buffer_1.BufferUtils.fromString(exports.ID3v1_MARKER));
debug('index', index);
if (index < 0) {
return;
}
const data = yield reader.read(400);
if (!data || (data.length < 128)) {
return;
}
if (data.length !== 128) {
reader.unshift(data.slice(1));
return yield this.readReaderStream(reader);
}
const tag = this.readTag(data);
if (tag) {
return tag;
}
else {
reader.unshift(data.slice(1));
return yield this.readReaderStream(reader);
}
});
}
readStream(stream) {
return __awaiter(this, void 0, void 0, function* () {
const reader = new stream_reader_1.ReaderStream();
try {
yield reader.openStream(stream);
return yield this.readReaderStream(reader);
}
catch (e) {
return Promise.reject(e);
}
});
}
read(filename) {
return __awaiter(this, void 0, void 0, function* () {
const reader = new stream_reader_1.ReaderStream();
try {
yield reader.open(filename);
const tag = yield this.readReaderStream(reader);
reader.close();
return tag;
}
catch (e) {
reader.close();
return Promise.reject(e);
}
});
}
}
exports.ID3v1Reader = ID3v1Reader;
//# sourceMappingURL=id3v1.reader.js.map