This commit is contained in:
ad044 2021-03-08 19:59:24 +04:00
commit 65d16f7e3f
6 changed files with 488 additions and 1466 deletions

5
.gitignore vendored
View file

@ -23,9 +23,8 @@ yarn-debug.log*
yarn-error.log*
src/static/media_images
src/static/audio
src/static/movie
src/static/voice
src/static/media/*
src/static/voice/*
scripts/extract/discs
scripts/extract/*.log

1749
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

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

View file

@ -1,35 +1,94 @@
import { execSync } from "child_process";
import { tmpdir } from "os";
import { mkdtempSync, rmdirSync } from "fs";
import { mkdtempSync, rmSync, mkdirSync } from "fs";
import { join } from "path";
import { extract_media } from "./extract_media.mjs";
import { extract_video, extract_audio } from "./extract_media.mjs";
import { extract_voice } from "./extract_voice.mjs";
import yargs from "yargs";
import { hideBin } from "yargs/helpers";
const tempdir = mkdtempSync(join(tmpdir(), "extractor-"));
console.log(tempdir);
const argv = yargs(hideBin(process.argv))
.option("tempdir", {
type: "string",
description: "Path to a temporary directory",
default: mkdtempSync(join(tmpdir(), "extractor-")),
})
.option("no_index", {
type: "boolean",
description:
"Don't generate an index file for each disc, the index files MUST exist already",
})
.option("no_video", {
type: "boolean",
description: "Don't extract video",
})
.option("no_audio", {
type: "boolean",
description: "Don't extract audio",
})
.option("no_voice", {
type: "boolean",
description: "Don't extract voice.bin",
})
.option("no_delete", {
type: "boolean",
description:
"Don't delete any temporary files or directories, useful when using --tempdir (WARNING: uses 6+ GB of space)",
})
.option("no_audio", {
type: "boolean",
description: "Don't extract audio",
}).argv;
mkdirSync(argv.tempdir, { recursive: true });
const jpsxdec_jar = join("jpsxdec", "jpsxdec.jar");
const disc1_index = join(tempdir, "disc1.idx");
const disc2_index = join(tempdir, "disc2.idx");
const disc1_index = join(argv.tempdir, "disc1.idx");
const disc2_index = join(argv.tempdir, "disc2.idx");
// generate disc indexes
execSync(
`java -jar ${jpsxdec_jar} -f ${join(
"discs",
"disc1.bin"
)} -x "${disc1_index}"`,
{ stdio: "inherit" }
);
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" }
);
execSync(
`java -jar ${jpsxdec_jar} -f ${join(
"discs",
"disc2.bin"
)} -x "${disc2_index}"`,
{ stdio: "inherit" }
);
}
extract_media(tempdir, jpsxdec_jar, disc1_index, disc2_index);
extract_voice(tempdir, jpsxdec_jar, disc1_index);
if (!argv.no_video) {
extract_video(
argv.tempdir,
jpsxdec_jar,
disc1_index,
disc2_index,
argv.no_delete
);
}
rmdirSync(tempdir, { recursive: true });
if (!argv.no_audio) {
extract_audio(
argv.tempdir,
jpsxdec_jar,
disc1_index,
disc2_index,
argv.no_delete
);
}
if (!argv.no_voice) {
extract_voice(argv.tempdir, jpsxdec_jar, disc1_index);
}
if (!argv.no_delete) {
rmSync(argv.tempdir, { recursive: true });
}

View file

@ -1,29 +1,25 @@
import { execSync, exec } from "child_process";
import { existsSync, mkdirSync, readdirSync, rmdirSync } from "fs";
import { mkdirSync, readdirSync, rmdirSync } from "fs";
import { join } from "path";
export function extract_media(tempdir, jpsxdec_jar, disc1_index, disc2_index) {
// extract all video and audio
export function extract_video(
tempdir,
jpsxdec_jar,
disc1_index,
disc2_index,
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 "${disc1_index}" -a audio -dir "${tempdir}"`,
{ stdio: "inherit" }
);
execSync(
`java -jar ${jpsxdec_jar} -x "${disc2_index}" -a video -dir "${tempdir}" -quality high -vf avi:rgb -up Lanczos3`,
{ stdio: "inherit" }
);
execSync(
`java -jar ${jpsxdec_jar} -x "${disc2_index}" -a audio -dir "${tempdir}"`,
{ stdio: "inherit" }
);
const output_movie_folder = join(
"..",
"..",
@ -32,23 +28,9 @@ export function extract_media(tempdir, jpsxdec_jar, disc1_index, disc2_index) {
"media",
"movie"
);
const output_audio_folder = join(
"..",
"..",
"src",
"static",
"media",
"audio"
);
// create destination folders
if (!existsSync(output_movie_folder)) {
mkdirSync(output_movie_folder);
}
if (!existsSync(output_audio_folder)) {
mkdirSync(output_audio_folder);
}
// create destination folder
mkdirSync(output_movie_folder, { recursive: true });
// convert all movies to mp4
for (const movieDir of ["MOVIE", "MOVIE2"]) {
@ -67,6 +49,43 @@ export function extract_media(tempdir, jpsxdec_jar, disc1_index, disc2_index) {
}
}
if (!no_delete) {
// cleanup source folders
rmdirSync(join(tempdir, "MOVIE"));
rmdirSync(join(tempdir, "MOVIE2"));
}
}
export function extract_audio(
tempdir,
jpsxdec_jar,
disc1_index,
disc2_index,
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" }
);
const output_audio_folder = join(
"..",
"..",
"src",
"static",
"media",
"audio"
);
// create destination folder
mkdirSync(output_audio_folder, { recursive: true });
// convert all audio to mp4
for (let file of readdirSync(`${join(tempdir, "XA")}`)) {
exec(
@ -77,8 +96,8 @@ export function extract_media(tempdir, jpsxdec_jar, disc1_index, disc2_index) {
).stderr.on("data", (data) => console.log(data));
}
// cleanup source folders
rmdirSync(join(tempdir, "MOVIE"), { recursive: true });
rmdirSync(join(tempdir, "MOVIE2"), { recursive: true });
rmdirSync(join(tempdir, "XA"), { recursive: true });
if (!no_delete) {
// cleanup source folder
rmdirSync(join(tempdir, "XA"));
}
}

View file

@ -1,6 +1,6 @@
import { FileWriter } from "wav";
import { execSync } from "child_process";
import { readFileSync, existsSync, mkdirSync, writeFileSync } from "fs";
import { readFileSync, mkdirSync, writeFileSync } from "fs";
import { join } from "path";
export function extract_voice(tempdir, jpsxdec_jar, disc1_index) {
@ -12,9 +12,8 @@ export function extract_voice(tempdir, jpsxdec_jar, disc1_index) {
let voice_data = readFileSync(join(tempdir, "VOICE.BIN"));
let output_folder = join("..", "..", "src", "static", "voice");
if (!existsSync(output_folder)) {
mkdirSync(output_folder);
}
mkdirSync(output_folder, { recursive: true });
for (let voice_file of voice_files) {
let path = join(output_folder, voice_file.translated_name);