This commit is contained in:
ad044 2021-03-20 22:06:17 +04:00
commit f3a4324ca5
6 changed files with 1408 additions and 859 deletions

102
package-lock.json generated
View file

@ -3840,28 +3840,6 @@
"isarray": "^1.0.0"
}
},
"buffer-alloc": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
"integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==",
"dev": true,
"requires": {
"buffer-alloc-unsafe": "^1.1.0",
"buffer-fill": "^1.0.0"
}
},
"buffer-alloc-unsafe": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz",
"integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==",
"dev": true
},
"buffer-fill": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz",
"integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=",
"dev": true
},
"buffer-from": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
@ -14290,32 +14268,6 @@
}
}
},
"stream-parser": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz",
"integrity": "sha1-FhhUhpRCACGhGC/wrxkRwSl2F3M=",
"dev": true,
"requires": {
"debug": "2"
},
"dependencies": {
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
"requires": {
"ms": "2.0.0"
}
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
"dev": true
}
}
},
"stream-shift": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz",
@ -15653,60 +15605,6 @@
}
}
},
"wav": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wav/-/wav-1.0.2.tgz",
"integrity": "sha512-viHtz3cDd/Tcr/HbNqzQCofKdF6kWUymH9LGDdskfWFoIy/HJ+RTihgjEcHfnsy1PO4e9B+y4HwgTwMrByquhg==",
"dev": true,
"requires": {
"buffer-alloc": "^1.1.0",
"buffer-from": "^1.0.0",
"debug": "^2.2.0",
"readable-stream": "^1.1.14",
"stream-parser": "^0.3.1"
},
"dependencies": {
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
"requires": {
"ms": "2.0.0"
}
},
"isarray": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
"integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
"dev": true
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
"dev": true
},
"readable-stream": {
"version": "1.1.14",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
"integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
"dev": true,
"requires": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.1",
"isarray": "0.0.1",
"string_decoder": "~0.10.x"
}
},
"string_decoder": {
"version": "0.10.31",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
"integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
"dev": true
}
}
},
"wbuf": {
"version": "1.7.3",
"resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",

View file

@ -51,7 +51,6 @@
"devDependencies": {
"eslint-loader": "^4.0.2",
"replace-in-file": "^6.2.0",
"wav": "^1.0.2",
"yargs": "^16.2.0"
}
}

View file

@ -1,4 +1,4 @@
import { execSync } from "child_process";
import { spawnSync } from "child_process";
import { tmpdir } from "os";
import { mkdtempSync, rmSync, mkdirSync } from "fs";
import { join } from "path";
@ -33,7 +33,7 @@ const argv = yargs(hideBin(process.argv))
.option("no_delete", {
type: "boolean",
description:
"Don't delete any temporary files or directories, useful when using --tempdir (WARNING: uses 6+ GB of space)",
"Don't delete any temporary files or directories, useful when using --tempdir (WARNING: uses 6+ GB of space)",
})
.option("no_audio", {
type: "boolean",
@ -43,50 +43,35 @@ const argv = yargs(hideBin(process.argv))
mkdirSync(argv.tempdir, { recursive: true });
const jpsxdec_jar = join("jpsxdec", "jpsxdec.jar");
const disc1_index = join(argv.tempdir, "disc1.idx");
const disc2_index = join(argv.tempdir, "disc2.idx");
// generate disc indexes
if (!argv.no_index) {
execSync(
`java -jar ${jpsxdec_jar} -f ${join(
"discs",
"disc1.bin"
)} -x "${disc1_index}"`,
{ stdio: "inherit" }
);
execSync(
`java -jar ${jpsxdec_jar} -f ${join(
"discs",
"disc2.bin"
)} -x "${disc2_index}"`,
{ stdio: "inherit" }
);
for (const disc of ["disc1", "disc2"]) {
spawnSync(
"java",
[
"-jar",
jpsxdec_jar,
"-f",
join("discs", disc + ".bin"),
"-x",
join(argv.tempdir, disc + ".idx"),
],
{ stdio: "inherit" }
);
}
}
if (!argv.no_video) {
extract_video(
argv.tempdir,
jpsxdec_jar,
disc1_index,
disc2_index,
argv.no_delete
);
extract_video(argv.tempdir, jpsxdec_jar, argv.no_delete);
}
if (!argv.no_audio) {
extract_audio(
argv.tempdir,
jpsxdec_jar,
disc1_index,
disc2_index,
argv.no_delete
);
extract_audio(argv.tempdir, jpsxdec_jar, argv.no_delete);
}
if (!argv.no_voice) {
extract_voice(argv.tempdir, jpsxdec_jar, disc1_index);
extract_voice(argv.tempdir, jpsxdec_jar);
}
if (!argv.no_delete) {

View file

@ -1,24 +1,31 @@
import { execSync, exec } from "child_process";
import { mkdirSync, readdirSync, rmdirSync } from "fs";
import { spawnSync, spawn } from "child_process";
import { mkdirSync, readdirSync, rmSync } from "fs";
import { join } from "path";
export function extract_video(
tempdir,
jpsxdec_jar,
disc1_index,
disc2_index,
no_delete
) {
export function extract_video(tempdir, jpsxdec_jar, no_delete) {
// extract all video
execSync(
`java -jar ${jpsxdec_jar} -x "${disc1_index}" -a video -dir "${tempdir}" -quality high -vf avi:rgb -up Lanczos3`,
{ stdio: "inherit" }
);
execSync(
`java -jar ${jpsxdec_jar} -x "${disc2_index}" -a video -dir "${tempdir}" -quality high -vf avi:rgb -up Lanczos3`,
{ stdio: "inherit" }
);
for (const disc_index of ["disc1.idx", "disc2.idx"]) {
spawnSync(
"java",
[
"-jar",
jpsxdec_jar,
"-x",
join(tempdir, disc_index),
"-a",
"video",
"-dir",
tempdir,
"-quality",
"high",
"-vf",
"avi:rgb",
"-up",
"Lanczos3",
],
{ stdio: "inherit" }
);
}
const output_movie_folder = join(
"..",
@ -36,43 +43,46 @@ export function extract_video(
for (const movieDir of ["MOVIE", "MOVIE2"]) {
for (let file of readdirSync(`${join(tempdir, movieDir)}`)) {
if (file.endsWith(".wav")) continue;
exec(
`ffmpeg -i "${join(
tempdir,
movieDir,
file
)}" -pix_fmt yuv420p -n ${join(
output_movie_folder,
file.replace("avi", "mp4")
)}`
).stderr.on("data", (data) => console.log(data));
spawnSync(
"ffmpeg",
[
"-i",
join(tempdir, movieDir, file),
"-pix_fmt",
"yuv420p",
"-n",
join(output_movie_folder, file.replace("avi", "mp4")),
],
{ stdio: "inherit" }
);
}
}
if (!no_delete) {
// cleanup source folders
rmdirSync(join(tempdir, "MOVIE"));
rmdirSync(join(tempdir, "MOVIE2"));
rmSync(join(tempdir, "MOVIE"), { recursive: true });
rmSync(join(tempdir, "MOVIE2"), { recursive: true });
}
}
export function extract_audio(
tempdir,
jpsxdec_jar,
disc1_index,
disc2_index,
no_delete
) {
export function extract_audio(tempdir, jpsxdec_jar, no_delete) {
// extract all audio
execSync(
`java -jar ${jpsxdec_jar} -x "${disc1_index}" -a audio -dir "${tempdir}"`,
{ stdio: "inherit" }
);
execSync(
`java -jar ${jpsxdec_jar} -x "${disc2_index}" -a audio -dir "${tempdir}"`,
{ stdio: "inherit" }
);
for (const disc_index of ["disc1.idx", "disc2.idx"]) {
spawnSync(
"java",
[
"-jar",
jpsxdec_jar,
"-x",
join(tempdir, disc_index),
"-a",
"audio",
"-dir",
tempdir,
],
{ stdio: "inherit" }
);
}
const output_audio_folder = join(
"..",
@ -88,16 +98,16 @@ export function extract_audio(
// convert all audio to mp4
for (let file of readdirSync(`${join(tempdir, "XA")}`)) {
exec(
`ffmpeg -i "${join(tempdir, "XA", file)}" -n ${join(
output_audio_folder,
file.replace("wav", "mp4")
)}`
).stderr.on("data", (data) => console.log(data));
spawnSync("ffmpeg", [
"-i",
join(tempdir, "XA", file),
"-n",
join(output_audio_folder, file.replace("wav", "mp4")),
], {stdio:'inherit'});
}
if (!no_delete) {
// cleanup source folder
rmdirSync(join(tempdir, "XA"));
rmSync(join(tempdir, "XA"), { recursive: true });
}
}

View file

@ -1,11 +1,20 @@
import { FileWriter } from "wav";
import { execSync } from "child_process";
import { spawnSync } from "child_process";
import { readFileSync, mkdirSync, writeFileSync } from "fs";
import { join } from "path";
export function extract_voice(tempdir, jpsxdec_jar, disc1_index) {
execSync(
`java -jar ${jpsxdec_jar} -x "${disc1_index}" -i VOICE.BIN -dir "${tempdir}"`,
export function extract_voice(tempdir, jpsxdec_jar) {
spawnSync(
"java",
[
"-jar",
jpsxdec_jar,
"-x",
join(tempdir, "disc1.idx"),
"-i",
"VOICE.BIN",
"-dir",
tempdir,
],
{ stdio: "inherit" }
);
const voice_files = JSON.parse(readFileSync("voice.json"));
@ -16,21 +25,28 @@ export function extract_voice(tempdir, jpsxdec_jar, disc1_index) {
mkdirSync(output_folder, { recursive: true });
for (let voice_file of voice_files) {
let path = join(output_folder, voice_file.translated_name);
let tempfile = join(tempdir, voice_file.translated_name);
let outfile = join(
output_folder,
voice_file.translated_name.replace("WAV", "mp4")
);
let data = voice_data.slice(
voice_file.offset,
voice_file.offset + voice_file.size
);
writeFileSync(tempfile, data);
if (["BYA.WAV", "BYO.WAV", "BYU.WAV"].includes(voice_file.original_name)) {
writeFileSync(path, data);
spawnSync("ffmpeg", ["-i", tempfile, outfile]);
} else {
let wav_file = new FileWriter(path, {
sampleRate: 22050,
channels: 1,
bitDepth: 16,
});
wav_file.write(data);
wav_file.end();
spawnSync("ffmpeg", [
"-sample_rate",
22050,
"-f",
"s16le",
"-i",
tempfile,
outfile,
], {stdio:'inherit'});
}
}
}

File diff suppressed because it is too large Load diff