mirror of
https://github.com/ad044/lainTSX.git
synced 2024-10-22 23:19:06 +00:00
Merge branch 'master' of https://github.com/ad044/lain-psx-ts
This commit is contained in:
commit
f3a4324ca5
6 changed files with 1408 additions and 859 deletions
102
package-lock.json
generated
102
package-lock.json
generated
|
@ -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",
|
||||
|
|
|
@ -51,7 +51,6 @@
|
|||
"devDependencies": {
|
||||
"eslint-loader": "^4.0.2",
|
||||
"replace-in-file": "^6.2.0",
|
||||
"wav": "^1.0.2",
|
||||
"yargs": "^16.2.0"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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";
|
||||
|
@ -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}"`,
|
||||
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) {
|
||||
|
|
|
@ -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`,
|
||||
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}"`,
|
||||
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 });
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
Loading…
Reference in a new issue