diff --git a/Version b/Version index cbbb5ee..b21f0b7 100644 --- a/Version +++ b/Version @@ -1 +1 @@ -3.7.7 \ No newline at end of file +3.7.8 \ No newline at end of file diff --git a/aklive2d.js b/aklive2d.js index 9a3375d..7d7bab4 100644 --- a/aklive2d.js +++ b/aklive2d.js @@ -7,7 +7,7 @@ import { fork } from 'child_process'; import getConfig from './libs/config.js' import ProjectJson from './libs/project_json.js' import EnvGenerator from './libs/env_generator.js' -import { write, rmdir, copy, writeSync, copyDir } from './libs/file.js' +import { write, rmdir, copy, writeSync, copyDir, readdirSync, exists } from './libs/file.js' import AssetsProcessor from './libs/assets_processor.js' import init from './libs/initializer.js' import directory from './libs/directory.js' @@ -21,6 +21,8 @@ async function main() { global.__projectRoot = path.dirname(fileURLToPath(import.meta.url)) global.__config = getConfig() + global.__error = [] + const op = process.argv[2] let OPERATOR_NAMES = process.argv.slice(3); @@ -65,6 +67,19 @@ async function main() { const backgrounds = ['operator_bg.png', ...background.files] const { musicToCopy, musicMapping } = musicTable.copy() + for (const e of musicToCopy) { + const musicPath = path.join(e.source, e.filename) + if (!exists(musicPath)) { + __error.push(`Music file ${e.filename} is not found in music folder.`) + } + } + + for (const e of Object.keys(musicMapping)) { + if (!backgrounds.includes(e)) { + __error.push(`Background file ${e} is not found in background folder.`) + } + } + for (const OPERATOR_NAME of OPERATOR_NAMES) { const OPERATOR_SOURCE_FOLDER = path.join(__projectRoot, __config.folder.operator) const OPERATOR_RELEASE_FOLDER = path.join(__projectRoot, __config.folder.release, OPERATOR_NAME) @@ -136,6 +151,23 @@ async function main() { break } + // check whether voice files has been added + const customVoiceName = voiceLangs.filter(i => !__config.folder.voice.sub.map(e => e.lang).includes(i))[0] + const voiceLangMapping = __config.folder.voice.sub.filter(e => { + return voiceLangs.includes(e.lang) || (e.lang === "CUSTOM" && typeof customVoiceName !== 'undefined') + }).map(e => { + return { + name: e.name, + lang: e.lang === "CUSTOM" ? customVoiceName : e.lang + } + }) + for (const voiceSubFolderMapping of voiceLangMapping) { + const voiceSubFolder = path.join(OPERATOR_SOURCE_FOLDER, OPERATOR_NAME, __config.folder.voice.main, voiceSubFolderMapping.name) + if (readdirSync(voiceSubFolder).length === 0) { + __error.push(`Voice folder ${voiceSubFolderMapping.name} for ${OPERATOR_NAME} is empty.`) + } + } + const envPath = path.join(OPERATOR_SOURCE_FOLDER, OPERATOR_NAME, '.env') writeSync((new EnvGenerator()).generate([ { @@ -254,11 +286,17 @@ async function main() { foldersToCopy.forEach((folder) => { copyDir(folder.source, folder.target) }) - - fork(path.join(__projectRoot, 'vite.config.js'), [op, OPERATOR_NAME]) } directory({ backgrounds, musicMapping }) + if (__error.length > 0) { + const str = `${__error.length} error${__error.length > 1 ? 's were' : ' was'} found:\n${__error.join('\n')}` + throw new Error(str) + } else { + for (const OPERATOR_NAME of OPERATOR_NAMES) { + fork(path.join(__projectRoot, 'vite.config.js'), [op, OPERATOR_NAME]) + } + } } main(); \ No newline at end of file diff --git a/libs/file.js b/libs/file.js index 58c7ee8..e260716 100644 --- a/libs/file.js +++ b/libs/file.js @@ -67,5 +67,9 @@ export function appendSync(content, filePath) { } export function readdirSync(dir) { + if (!exists(dir)) { + console.warn(`Source ${dir} does not exist.`) + return [] + } return fs.readdirSync(dir) }