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"
|
"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": {
|
"buffer-from": {
|
||||||
"version": "1.1.1",
|
"version": "1.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
|
"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": {
|
"stream-shift": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz",
|
"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": {
|
"wbuf": {
|
||||||
"version": "1.7.3",
|
"version": "1.7.3",
|
||||||
"resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
|
"resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
|
||||||
|
|
|
@ -51,7 +51,6 @@
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"eslint-loader": "^4.0.2",
|
"eslint-loader": "^4.0.2",
|
||||||
"replace-in-file": "^6.2.0",
|
"replace-in-file": "^6.2.0",
|
||||||
"wav": "^1.0.2",
|
|
||||||
"yargs": "^16.2.0"
|
"yargs": "^16.2.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { execSync } from "child_process";
|
import { spawnSync } from "child_process";
|
||||||
import { tmpdir } from "os";
|
import { tmpdir } from "os";
|
||||||
import { mkdtempSync, rmSync, mkdirSync } from "fs";
|
import { mkdtempSync, rmSync, mkdirSync } from "fs";
|
||||||
import { join } from "path";
|
import { join } from "path";
|
||||||
|
@ -43,50 +43,35 @@ const argv = yargs(hideBin(process.argv))
|
||||||
mkdirSync(argv.tempdir, { recursive: true });
|
mkdirSync(argv.tempdir, { recursive: true });
|
||||||
|
|
||||||
const jpsxdec_jar = join("jpsxdec", "jpsxdec.jar");
|
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
|
// generate disc indexes
|
||||||
if (!argv.no_index) {
|
if (!argv.no_index) {
|
||||||
execSync(
|
for (const disc of ["disc1", "disc2"]) {
|
||||||
`java -jar ${jpsxdec_jar} -f ${join(
|
spawnSync(
|
||||||
"discs",
|
"java",
|
||||||
"disc1.bin"
|
[
|
||||||
)} -x "${disc1_index}"`,
|
"-jar",
|
||||||
{ stdio: "inherit" }
|
jpsxdec_jar,
|
||||||
);
|
"-f",
|
||||||
|
join("discs", disc + ".bin"),
|
||||||
execSync(
|
"-x",
|
||||||
`java -jar ${jpsxdec_jar} -f ${join(
|
join(argv.tempdir, disc + ".idx"),
|
||||||
"discs",
|
],
|
||||||
"disc2.bin"
|
|
||||||
)} -x "${disc2_index}"`,
|
|
||||||
{ stdio: "inherit" }
|
{ stdio: "inherit" }
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!argv.no_video) {
|
if (!argv.no_video) {
|
||||||
extract_video(
|
extract_video(argv.tempdir, jpsxdec_jar, argv.no_delete);
|
||||||
argv.tempdir,
|
|
||||||
jpsxdec_jar,
|
|
||||||
disc1_index,
|
|
||||||
disc2_index,
|
|
||||||
argv.no_delete
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!argv.no_audio) {
|
if (!argv.no_audio) {
|
||||||
extract_audio(
|
extract_audio(argv.tempdir, jpsxdec_jar, argv.no_delete);
|
||||||
argv.tempdir,
|
|
||||||
jpsxdec_jar,
|
|
||||||
disc1_index,
|
|
||||||
disc2_index,
|
|
||||||
argv.no_delete
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!argv.no_voice) {
|
if (!argv.no_voice) {
|
||||||
extract_voice(argv.tempdir, jpsxdec_jar, disc1_index);
|
extract_voice(argv.tempdir, jpsxdec_jar);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!argv.no_delete) {
|
if (!argv.no_delete) {
|
||||||
|
|
|
@ -1,24 +1,31 @@
|
||||||
import { execSync, exec } from "child_process";
|
import { spawnSync, spawn } from "child_process";
|
||||||
import { mkdirSync, readdirSync, rmdirSync } from "fs";
|
import { mkdirSync, readdirSync, rmSync } from "fs";
|
||||||
import { join } from "path";
|
import { join } from "path";
|
||||||
|
|
||||||
export function extract_video(
|
export function extract_video(tempdir, jpsxdec_jar, no_delete) {
|
||||||
tempdir,
|
|
||||||
jpsxdec_jar,
|
|
||||||
disc1_index,
|
|
||||||
disc2_index,
|
|
||||||
no_delete
|
|
||||||
) {
|
|
||||||
// extract all video
|
// extract all video
|
||||||
execSync(
|
for (const disc_index of ["disc1.idx", "disc2.idx"]) {
|
||||||
`java -jar ${jpsxdec_jar} -x "${disc1_index}" -a video -dir "${tempdir}" -quality high -vf avi:rgb -up Lanczos3`,
|
spawnSync(
|
||||||
{ stdio: "inherit" }
|
"java",
|
||||||
);
|
[
|
||||||
|
"-jar",
|
||||||
execSync(
|
jpsxdec_jar,
|
||||||
`java -jar ${jpsxdec_jar} -x "${disc2_index}" -a video -dir "${tempdir}" -quality high -vf avi:rgb -up Lanczos3`,
|
"-x",
|
||||||
|
join(tempdir, disc_index),
|
||||||
|
"-a",
|
||||||
|
"video",
|
||||||
|
"-dir",
|
||||||
|
tempdir,
|
||||||
|
"-quality",
|
||||||
|
"high",
|
||||||
|
"-vf",
|
||||||
|
"avi:rgb",
|
||||||
|
"-up",
|
||||||
|
"Lanczos3",
|
||||||
|
],
|
||||||
{ stdio: "inherit" }
|
{ stdio: "inherit" }
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
|
||||||
const output_movie_folder = join(
|
const output_movie_folder = join(
|
||||||
"..",
|
"..",
|
||||||
|
@ -36,43 +43,46 @@ export function extract_video(
|
||||||
for (const movieDir of ["MOVIE", "MOVIE2"]) {
|
for (const movieDir of ["MOVIE", "MOVIE2"]) {
|
||||||
for (let file of readdirSync(`${join(tempdir, movieDir)}`)) {
|
for (let file of readdirSync(`${join(tempdir, movieDir)}`)) {
|
||||||
if (file.endsWith(".wav")) continue;
|
if (file.endsWith(".wav")) continue;
|
||||||
exec(
|
spawnSync(
|
||||||
`ffmpeg -i "${join(
|
"ffmpeg",
|
||||||
tempdir,
|
[
|
||||||
movieDir,
|
"-i",
|
||||||
file
|
join(tempdir, movieDir, file),
|
||||||
)}" -pix_fmt yuv420p -n ${join(
|
"-pix_fmt",
|
||||||
output_movie_folder,
|
"yuv420p",
|
||||||
file.replace("avi", "mp4")
|
"-n",
|
||||||
)}`
|
join(output_movie_folder, file.replace("avi", "mp4")),
|
||||||
).stderr.on("data", (data) => console.log(data));
|
],
|
||||||
|
{ stdio: "inherit" }
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!no_delete) {
|
if (!no_delete) {
|
||||||
// cleanup source folders
|
// cleanup source folders
|
||||||
rmdirSync(join(tempdir, "MOVIE"));
|
rmSync(join(tempdir, "MOVIE"), { recursive: true });
|
||||||
rmdirSync(join(tempdir, "MOVIE2"));
|
rmSync(join(tempdir, "MOVIE2"), { recursive: true });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function extract_audio(
|
export function extract_audio(tempdir, jpsxdec_jar, no_delete) {
|
||||||
tempdir,
|
|
||||||
jpsxdec_jar,
|
|
||||||
disc1_index,
|
|
||||||
disc2_index,
|
|
||||||
no_delete
|
|
||||||
) {
|
|
||||||
// extract all audio
|
// extract all audio
|
||||||
execSync(
|
for (const disc_index of ["disc1.idx", "disc2.idx"]) {
|
||||||
`java -jar ${jpsxdec_jar} -x "${disc1_index}" -a audio -dir "${tempdir}"`,
|
spawnSync(
|
||||||
{ stdio: "inherit" }
|
"java",
|
||||||
);
|
[
|
||||||
|
"-jar",
|
||||||
execSync(
|
jpsxdec_jar,
|
||||||
`java -jar ${jpsxdec_jar} -x "${disc2_index}" -a audio -dir "${tempdir}"`,
|
"-x",
|
||||||
|
join(tempdir, disc_index),
|
||||||
|
"-a",
|
||||||
|
"audio",
|
||||||
|
"-dir",
|
||||||
|
tempdir,
|
||||||
|
],
|
||||||
{ stdio: "inherit" }
|
{ stdio: "inherit" }
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
|
||||||
const output_audio_folder = join(
|
const output_audio_folder = join(
|
||||||
"..",
|
"..",
|
||||||
|
@ -88,16 +98,16 @@ export function extract_audio(
|
||||||
|
|
||||||
// convert all audio to mp4
|
// convert all audio to mp4
|
||||||
for (let file of readdirSync(`${join(tempdir, "XA")}`)) {
|
for (let file of readdirSync(`${join(tempdir, "XA")}`)) {
|
||||||
exec(
|
spawnSync("ffmpeg", [
|
||||||
`ffmpeg -i "${join(tempdir, "XA", file)}" -n ${join(
|
"-i",
|
||||||
output_audio_folder,
|
join(tempdir, "XA", file),
|
||||||
file.replace("wav", "mp4")
|
"-n",
|
||||||
)}`
|
join(output_audio_folder, file.replace("wav", "mp4")),
|
||||||
).stderr.on("data", (data) => console.log(data));
|
], {stdio:'inherit'});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!no_delete) {
|
if (!no_delete) {
|
||||||
// cleanup source folder
|
// cleanup source folder
|
||||||
rmdirSync(join(tempdir, "XA"));
|
rmSync(join(tempdir, "XA"), { recursive: true });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,11 +1,20 @@
|
||||||
import { FileWriter } from "wav";
|
import { spawnSync } from "child_process";
|
||||||
import { execSync } from "child_process";
|
|
||||||
import { readFileSync, mkdirSync, writeFileSync } from "fs";
|
import { readFileSync, mkdirSync, writeFileSync } from "fs";
|
||||||
import { join } from "path";
|
import { join } from "path";
|
||||||
|
|
||||||
export function extract_voice(tempdir, jpsxdec_jar, disc1_index) {
|
export function extract_voice(tempdir, jpsxdec_jar) {
|
||||||
execSync(
|
spawnSync(
|
||||||
`java -jar ${jpsxdec_jar} -x "${disc1_index}" -i VOICE.BIN -dir "${tempdir}"`,
|
"java",
|
||||||
|
[
|
||||||
|
"-jar",
|
||||||
|
jpsxdec_jar,
|
||||||
|
"-x",
|
||||||
|
join(tempdir, "disc1.idx"),
|
||||||
|
"-i",
|
||||||
|
"VOICE.BIN",
|
||||||
|
"-dir",
|
||||||
|
tempdir,
|
||||||
|
],
|
||||||
{ stdio: "inherit" }
|
{ stdio: "inherit" }
|
||||||
);
|
);
|
||||||
const voice_files = JSON.parse(readFileSync("voice.json"));
|
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 });
|
mkdirSync(output_folder, { recursive: true });
|
||||||
|
|
||||||
for (let voice_file of voice_files) {
|
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(
|
let data = voice_data.slice(
|
||||||
voice_file.offset,
|
voice_file.offset,
|
||||||
voice_file.offset + voice_file.size
|
voice_file.offset + voice_file.size
|
||||||
);
|
);
|
||||||
|
writeFileSync(tempfile, data);
|
||||||
if (["BYA.WAV", "BYO.WAV", "BYU.WAV"].includes(voice_file.original_name)) {
|
if (["BYA.WAV", "BYO.WAV", "BYU.WAV"].includes(voice_file.original_name)) {
|
||||||
writeFileSync(path, data);
|
spawnSync("ffmpeg", ["-i", tempfile, outfile]);
|
||||||
} else {
|
} else {
|
||||||
let wav_file = new FileWriter(path, {
|
spawnSync("ffmpeg", [
|
||||||
sampleRate: 22050,
|
"-sample_rate",
|
||||||
channels: 1,
|
22050,
|
||||||
bitDepth: 16,
|
"-f",
|
||||||
});
|
"s16le",
|
||||||
wav_file.write(data);
|
"-i",
|
||||||
wav_file.end();
|
tempfile,
|
||||||
|
outfile,
|
||||||
|
], {stdio:'inherit'});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue