const exec = require('child_process').exec const path = require('path') const async = require('async') const splitLines = require('split-lines') const mkdirp = require('mkdirp') const fs = require('fs-extra') require('colors') var CFG = require('../config') let tools = {} function execGphoto2 (pArgs, pCallback) { exec(`gphoto2 ${pArgs}`, function (pErr, pStdout, pStderr) { if (pErr) { console.log(`[!] Please install gphoto2`.red) console.log(`sudo apt-get install gphoto2`.bgMagenta) console.log(`[-] Bobinoscope will close in 10 seconds...`) setTimeout(function () { process.exit(1) }, 10000) return } let error = null let outInLines = [] if (/Error/i.test(pStderr)) { error = pStderr } if (pStdout) { outInLines = splitLines(pStdout) } pCallback(error, outInLines) }) } tools.checkVersion = function (pCb) { console.log('[-] Checking gphoto2 installation...'.bgBlue) execGphoto2('--version', function (pErr, pStdout) { console.log(`OK: ${pStdout[0]}`.green) pCb() }) } tools.checkCameraConnection = function (pCb) { console.log('[-] Checking camera connection...'.bgBlue) execGphoto2('--auto-detect', function (pErr, pStdout) { let device = pStdout[2] if (!device) { console.log(`[!] Camera not connected`.red) console.log('1. Connect camera via USB'.bgMagenta) console.log('2. Turn on the camera'.bgMagenta) console.log('3. Maybe - Force manual focus on camera'.bgMagenta) console.log(`\n\n[-] Bobinoscope will close in 10 seconds...`) setTimeout(function () { process.exit(1) }, 10000) return } console.log(`OK: ${device}`.green) pCb() }) } tools.__takeOnePicture = function (pPath, pCb) { execGphoto2(`--capture-image-and-download --filename=${pPath} --force-overwrite`, pCb) } tools.takeOnePicture = function (pBoothId, pPictId, pCallback) { let destPict = '/tmp/bobine.jpg' var destPath = path.join(CFG.paths.original, pBoothId) var pictOrig = path.join(destPath, CFG.pictNames[pPictId]) mkdirp.sync(path.join(CFG.paths.prebuilt, pBoothId)) tools.__takeOnePicture(destPict, function (pErr) { // If error occurs if (pErr) return pCallback(pErr) mkdirp(destPath, function () { fs.copy(destPict, pictOrig, function (pErr) { return pCallback(pErr, pictOrig) }) }) }) } tools.init = function (pCb) { let tasks = [] tasks.push(tools.checkVersion) tasks.push(tools.checkCameraConnection) tasks.push(function (pCb) { let output = '/tmp/bobine-dummy.jpg' console.log('[-] Taking dummy photo...'.bgBlue) tools.__takeOnePicture(output, function (pErr) { if (pErr) { console.log(`[!] Failed to take picture`.red) console.log(pErr.grey) console.log('1. Add one SDCard into the device') console.log('2. Take one picture manually') process.exit(1) } console.log(`OK: ${output}`.green) pCb() }) // opn(output) // .then(function () { // console.log('OK'.green) // pCb() // }) }) async.waterfall(tasks, pCb) } module.exports = tools