import fs from "node:fs"; import path from "path"; // @ts-ignore import minimist from 'minimist'; import * as childProcess from 'child_process'; let mini_arguments: any = minimist(process.argv.slice(2)) let enable_batch_move_assembled_files = false; let should_exec_geovisio_upload = false; const reallyMoveFiles = false; let folder = `/home/poule/encrypted/stockage-syncable/photos/imageries/gopro/INBOX_a_assembler/` let subfolder = `` if (mini_arguments['folder']) { subfolder = mini_arguments['folder'] } /** * trouver les valeux min et max de numéros de séquence gopro dans un dossier contenant des photos jpg * @param dirPath */ function findMinMaxNumberOfPhotos(dirPath: string): { min: number, max: number } { console.log('dirPath', dirPath) let minNumber: number = 0; let maxNumber: number = 0; let previousFileName = 0 // Boucler sur chaque fichier JPG dans le dossier fs.readdirSync(dirPath).forEach(file => { let currentFileName = path.extname(file) // Vérifier si le fichier est un fichier JPG if (currentFileName === '.jpg' || currentFileName === '.JPG') { // Éxtraire le nombre du nom de fichier let matches: any = file.match(/(\d+)/); if (matches && matches.length && matches[0]) { let number = parseInt(matches[0]); if ((previousFileName + 1) !== number) { console.log('saut de nombre / séquence à ', previousFileName, number) } // Sauver le nombre minimal et maximal trouvé jusqu'à présent if (minNumber === 0 && number > 0) { minNumber = number; } if (number > maxNumber) { maxNumber = number; } previousFileName = number } } }); return { min: minNumber, max: maxNumber, } } let result = findMinMaxNumberOfPhotos(folder + subfolder) console.log('result', result) console.log("script à lancer:\n", ` # création des fichiers d'assemblage PTO et du script d'exécution en batch ts-node /home/poule/encrypted/stockage-syncable/www/development/html/scripts/hugin-gopro-fusion/main.ts --goproSubFolder=INBOX_a_assembler/${subfolder} # invocation de l'éxécution de la séquence d'assemblage bash /home/poule/encrypted/stockage-syncable/photos/imageries/gopro/INBOX_PTO_hugin/hugin_executor_from_${result.min}_to_${result.max}.sh # application des informations exif bash /home/poule/encrypted/stockage-syncable/www/development/html/scripts/hugin-gopro-fusion/exif_batch.sh ${result.min} ${result.max} INBOX_a_assembler/${subfolder} # envoi vers panoramax geovisio_cli upload --api-url https://panoramax.openstreetmap.fr /home/poule/encrypted/stockage-syncable/photos/imageries/gopro/PANORAMAX_envois_todo/${subfolder} `) const hugin_assemblages_script_output_path = '/home/poule/encrypted/stockage-syncable/photos/imageries/gopro/hugin_assemblages_script_output'; const envois_todo_panoramax = '/home/poule/encrypted/stockage-syncable/photos/imageries/gopro/PANORAMAX_envois_todo/' + subfolder; const startNumber = result.min; const endNumber = result.max; function renameFile(fileName: string): void { const filePath = path.join(hugin_assemblages_script_output_path, fileName); if (fs.existsSync(filePath)) { const newFileName = `assemblage_${startNumber}.jpg`; const newFilePath = path.join(envois_todo_panoramax, newFileName); // console.log('rename: ', filePath, newFilePath) if (reallyMoveFiles) { fs.renameSync(filePath, newFilePath); } } else { console.log('ce fichier est inexistant', filePath) } console.log('fin de déplacement des fichiers assemblés') } function createDirectory(folderName: string): void { console.log('createDirectory', folderName) if (!fs.existsSync(folderName)) { fs.mkdirSync(folderName, { recursive: true }); }else{ console.log('folder already existing', folderName) } } function getFileNames(): string[] { const files = fs.readdirSync(hugin_assemblages_script_output_path); const fileNames = files.filter((fileName) => { const regex = /^assemblage_\d+(\.\d+)?\.jpg$/; return regex.test(fileName); }); return fileNames; } /** * déplacer des imageries assemblées en masse dans un dossier "à envoyer" * @param startNumber * @param endNumber */ function batch_move_assembled_files(startNumber: number, endNumber: number) { const fileNames = getFileNames(); console.log('fileNames', fileNames) for (let i = startNumber; i <= endNumber; i++) { const fileName = `assemblage_${i}.jpg`; renameFile(fileName); } } function executeCommand(command: string, folderName: string): void { const fullCommand = `${command} "${folderName}"`; childProcess.exec(fullCommand, (error, stdout, stderr) => { if (error) { console.error(`Error executing command: ${fullCommand}`); console.error(error); } else { console.log(`Output of command: ${fullCommand}`); console.log(stdout); } }); } function exec_geovisio(envois_todo_panoramax: string): void { const folderName = envois_todo_panoramax; const command = 'geovisio upload --api-url https://panoramax.openstreetmap.fr'; executeCommand(command, folderName); } if (should_exec_geovisio_upload) { exec_geovisio(envois_todo_panoramax); } else { console.log(' l envoi vers geovisio automatique est désactivé ') } console.log("exécuter geovisio upload") createDirectory(envois_todo_panoramax); if (enable_batch_move_assembled_files) { console.log(' déplacer les assemblages dans ' + envois_todo_panoramax, startNumber, endNumber) batch_move_assembled_files(startNumber, endNumber) }