cue-parser
Version:
A simple js library to parse cue sheet
202 lines • 6 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.parse = void 0;
/**
* Main library
*/
const fs = require("fs");
const chardet = require("chardet");
const command_1 = require("./command");
const cuesheet_1 = require("./cuesheet");
const commandMap = {
CATALOG: parseCatalog,
CDTEXTFILE: parseCdTextFile,
FILE: parseFile,
FLAGS: parseFlags,
INDEX: parseIndex,
ISRC: parseIsrc,
PERFORMER: parsePerformer,
POSTGAP: parsePostgap,
PREGAP: parsePregap,
REM: parseRem,
SONGWRITER: parseSongWriter,
TITLE: parseTitle,
TRACK: parseTrack
};
/**
* Parse function
* @param filename Filename path to cue-sheet to be parsed
* @return CUE-sheet information object
*/
function parse(filename) {
const cuesheet = new cuesheet_1.CueSheet();
if (!filename) {
console.log('no file name specified for parse');
return;
}
if (!fs.existsSync(filename)) {
throw new Error('file ' + filename + ' does not exist');
}
cuesheet.encoding = chardet.detect(fs.readFileSync(filename));
let encoding = 'utf8';
if (cuesheet.encoding.startsWith('ISO-8859-')) {
encoding = 'binary';
}
else if (cuesheet.encoding.toUpperCase() === 'UTF-16 LE') {
encoding = 'utf16le';
}
const lines = fs.readFileSync(filename, { encoding, flag: 'r' })
.replace(/\r\n/, '\n').split('\n');
lines.forEach(line => {
if (!line.match(/^\s*$/)) {
const lineParser = command_1.parseCommand(line);
commandMap[lineParser.command](lineParser.params, cuesheet);
}
});
if (!cuesheet.files[cuesheet.files.length - 1].name) {
cuesheet.files.pop();
}
return cuesheet;
}
exports.parse = parse;
function parseCatalog(params, cuesheet) {
cuesheet.catalog = params[0];
}
function parseCdTextFile(params, cuesheet) {
cuesheet.cdTextFile = params[0];
}
function parseFile(params, cuesheet) {
let file = cuesheet.getCurrentFile();
if (!file || file.name) {
file = cuesheet.newFile();
}
file.name = params[0];
file.type = params[1];
}
function parseFlags(params, cueSheet) {
const track = cueSheet.getCurrentTrack();
if (!track) {
throw new Error('No track for adding flag: ' + params);
}
track.flags = params.slice(0);
}
function parseIndex(params, cueSheet) {
const _number = parseInt(params[0], 10);
const time = parseTime(params[1]);
const track = cueSheet.getCurrentTrack();
if (!track) {
throw new Error('No track found for index ' + params);
}
if (track.postgap) {
throw new Error('POSTGAP should be after all indexes');
}
if (_number < 0 || _number > 99) {
throw new Error(`Index number must between 0 and 99: ${_number}`);
}
if (_number === 1) {
// Assign track to current file
const file = cueSheet.getCurrentFile();
if (!file.tracks) {
file.tracks = [];
}
file.tracks.push(track);
}
if (!track.indexes) {
if (_number > 2) {
throw new Error(`Invalid index number ${_number}, First index number must be 0 or 1`);
}
track.indexes = [];
}
else {
if (_number !== track.indexes[track.indexes.length - 1].number + 1) {
throw new Error(`Invalid index number: ${_number}, it should follow the last sequence`);
}
}
track.indexes.push(new cuesheet_1.Index(_number, time));
}
function parseIsrc(params, cueSheet) {
const track = cueSheet.getCurrentTrack();
if (!track) {
throw new Error('No track for adding isrc: ' + params);
}
track.isrc = params[0];
}
function parsePerformer(params, cueSheet) {
const track = cueSheet.getCurrentTrack();
if (!track) {
cueSheet.performer = params[0];
}
else {
track.performer = params[0];
}
}
function parsePostgap(params, cueSheet) {
const track = cueSheet.getCurrentTrack();
if (!track) {
throw new Error('POSTGAP can only used in TRACK');
}
if (track.postgap) {
throw new Error('only one POSTGAP is allowed for a track');
}
track.postgap = parseTime(params[0]);
}
function parsePregap(params, cueSheet) {
const track = cueSheet.getCurrentTrack();
if (!track) {
throw new Error('PREGAP can only used in TRACK');
}
if (track.pregap) {
throw new Error('only one PREGAP is allowed for a track');
}
if (track.indexes && track.indexes.length > 0) {
throw new Error('PREGAP should be before any INDEX');
}
track.pregap = parseTime(params[0]);
}
function parseRem(params, cueSheet) {
if (!cueSheet.rem) {
cueSheet.rem = [];
}
cueSheet.rem.push(params.join(' '));
}
function parseSongWriter(params, cueSheet) {
const track = cueSheet.getCurrentTrack();
if (!track) {
cueSheet.songWriter = params[0];
}
else {
track.songWriter = params[0];
}
}
function parseTitle(params, cueSheet) {
const track = cueSheet.getCurrentTrack();
if (!track) {
cueSheet.title = params[0];
}
else {
track.title = params[0];
}
}
function parseTrack(params, cuesheet) {
const _number = parseInt(params[0], 10);
cuesheet.newTrack(_number, params[1]);
}
function parseTime(timeSting) {
const timePattern = /^(\d{2,}):(\d{2}):(\d{2})$/;
const parts = timeSting.match(timePattern);
if (!parts) {
throw new Error(`Invalid time format: ${timeSting}`);
}
const time = new cuesheet_1.Time();
time.min = parseInt(parts[1], 10);
time.sec = parseInt(parts[2], 10);
time.frame = parseInt(parts[3], 10);
if (time.sec > 59) {
throw new Error(`Time second should be less than 60: ${timeSting}`);
}
if (time.frame > 74) {
throw new Error(`Time frame should be less than 75: ${timeSting}`);
}
return time;
}
//# sourceMappingURL=cue.js.map