import { parseTja } from './parse'; import { factorize } from './factorize'; import { readdirSync, readFileSync, writeFileSync, existsSync } from 'fs'; import { join } from 'path'; import iconv from 'iconv-lite'; const [,, workingDir, dataDir] = process.argv; if (existsSync(join(workingDir, 'features.json'))) { console.log('features.json already exists. Skipping extraction.'); process.exit(0); } const tjaDir = join(dataDir, 'tja'); const results: any[] = []; for (const file of readdirSync(tjaDir)) { if (!file.endsWith('.tja')) continue; const songno = file.replace(/\D/g, ''); const buffer = readFileSync(join(tjaDir, file)); let content = iconv.decode(buffer, 'shift-jis', { stripBOM: true }); content = content.replace(/\uFFFD/g, '').replace(/[\u{0080}-\u{FFFF}]/gu, '').replace(/\r\n/g, '\n'); let parsed = parseTja(content); if (!parsed) { content = iconv.decode(buffer, 'utf-8', { stripBOM: true }); content = content.replace(/\uFFFD/g, '').replace(/[\u{0080}-\u{FFFF}]/gu, '').replace(/\r\n/g, '\n'); parsed = parseTja(content); } if (!parsed) continue; for (const diff of ['oni', 'edit'] as const) { if (!parsed[diff]) continue; const factors = factorize(parsed[diff]!); results.push({ songno, diff: diff === 'oni' ? 'oni' : 'ura', ...factors }); } } writeFileSync(join(workingDir, 'features.json'), JSON.stringify(results, null, 2)); console.log(`Features extracted to ${workingDir}/features.json`);