poto-siril
Version:
Automatization around Siril (<https://siril.org/>) for deep sky astrophotography.
131 lines (117 loc) • 4.21 kB
text/typescript
import path from "path";
import fs from "fs-extra";
import { logger } from "../utils/logger";
import { LayerSet, PotoProject } from "../utils/types";
import {
GENERATED_SCRIPT_PREFIX,
POTO_JSON,
POTO_VERSION,
} from "../utils/const";
export const generateScripts = async (
projectDirectory: string,
scriptTemplatePath: string,
) => {
const scriptTemplate = fs.readFileSync(scriptTemplatePath, {
encoding: "utf8",
});
const potoProject: PotoProject = JSON.parse(
fs.readFileSync(path.join(projectDirectory, POTO_JSON), {
encoding: "utf8",
}),
);
if (POTO_VERSION !== potoProject.potoVersion) {
logger.errorThrow(
`Project version mismatch. Expected ${POTO_VERSION}, got ${potoProject.potoVersion}. Please regenerate the project using the dispatch command.`,
);
}
potoProject.layerSets.forEach(set => {
generateScriptForLightSet(
projectDirectory,
set,
path.basename(scriptTemplatePath),
scriptTemplate,
);
});
logger.success("Scripts were generated ✅.");
};
const generateScriptForLightSet = (
projectDirectory: string,
set: LayerSet,
scriptName: string,
scriptTemplate: string,
) => {
const filterDirectory = set.filter
? path.join(projectDirectory, set.filter)
: projectDirectory;
const processDirectory = path.join(
filterDirectory,
`${set.layerSetId}_process`,
);
if (!fs.existsSync(processDirectory)) {
fs.mkdirSync(processDirectory, { recursive: true });
}
const mastersDirectory = path.join(
filterDirectory,
`${set.layerSetId}_masters`,
);
if (!fs.existsSync(mastersDirectory)) {
fs.mkdirSync(mastersDirectory, { recursive: false });
}
const lightsdirs = [...new Set(set.lights.map(x => x.projectFileDirectory))];
if (lightsdirs.length === 0) {
throw new Error("No lights found for filter " + set.layerSetId);
}
if (lightsdirs.length > 1) {
logger.errorThrow("Multiple sets of light for ", lightsdirs);
}
const lightsDir = path.resolve(lightsdirs[0]);
const flatsDirs = [...new Set(set.flats.map(x => x.projectFileDirectory))];
if (flatsDirs.length === 0) {
throw new Error("No flats found for filter " + set.layerSetId);
}
if (flatsDirs.length > 1) {
throw new Error("Multiple sets of flat for " + set.layerSetId);
}
const flatsDir = path.resolve(flatsDirs[0]);
const darksDirs = [...new Set(set.darks.map(x => x.projectFileDirectory))];
if (darksDirs.length === 0) {
throw new Error("No darks found for filter " + set.layerSetId);
}
if (darksDirs.length > 1) {
throw new Error("Multiple sets of darks for " + set.layerSetId);
}
const darksDir = path.resolve(darksDirs[0]);
const biasesDirs = [...new Set(set.biases.map(x => x.projectFileDirectory))];
if (biasesDirs.length === 0) {
throw new Error("No biases found for filter " + set.layerSetId);
}
if (biasesDirs.length > 1) {
throw new Error("Multiple sets of biases for " + set.layerSetId);
}
const biasesDir = path.resolve(biasesDirs[0]);
const projectDirectoryAbs = path.resolve(projectDirectory);
const processDirAbs = path.resolve(processDirectory);
const masterDirAbs = path.resolve(mastersDirectory);
// TODO. Check that the script has the variables, warn if none.
const script = scriptTemplate
.replaceAll("{{poto-dir}}", projectDirectoryAbs)
.replaceAll("{{biases}}", biasesDir)
.replaceAll("{{darks}}", darksDir)
.replaceAll("{{flats}}", flatsDir)
.replaceAll("{{lights}}", lightsDir)
.replaceAll("{{process}}", processDirAbs)
.replaceAll("{{masters}}", masterDirAbs);
const processingScriptPath = path.join(
processDirectory,
`${GENERATED_SCRIPT_PREFIX}${scriptName}`,
);
fs.writeFileSync(processingScriptPath, script);
logger.info(`Generated ${processingScriptPath}`);
logger.debug(`- {{poto-dir}} 👉 ${projectDirectoryAbs}`);
logger.debug(`- {{lights}} 👉 ${lightsDir}`);
logger.debug(`- {{flats}} 👉 ${flatsDir}`);
logger.debug(`- {{darks}} 👉 ${darksDir}`);
logger.debug(`- {{biases}} 👉 ${biasesDir}`);
logger.debug(`- {{process}} 👉 ${processDirAbs}`);
logger.debug(`- {{masters}} 👉 ${masterDirAbs}`);
};