From bd79025305f6ad1652a02714586716f1c76627d0 Mon Sep 17 00:00:00 2001 From: mmcwilliams Date: Sun, 4 Aug 2019 17:42:27 -0400 Subject: [PATCH] Refactored ffmpeg module into a class. Add a logger, not implemented. Not tested. --- app/lib/ffmpeg/index.js | 382 +++++++++++++++++----------------- app/lib/ffmpeg/index.js.map | 2 +- cli/lib/ffmpeg/index.js | 382 +++++++++++++++++----------------- cli/lib/ffmpeg/index.js.map | 2 +- lib/ffmpeg/index.js | 382 +++++++++++++++++----------------- lib/ffmpeg/index.js.map | 2 +- src/ffmpeg/index.ts | 398 ++++++++++++++++++------------------ 7 files changed, 784 insertions(+), 766 deletions(-) diff --git a/app/lib/ffmpeg/index.js b/app/lib/ffmpeg/index.js index 96e8a84..a34514f 100644 --- a/app/lib/ffmpeg/index.js +++ b/app/lib/ffmpeg/index.js @@ -3,205 +3,209 @@ Object.defineProperty(exports, "__esModule", { value: true }); const path_1 = require("path"); const fs_extra_1 = require("fs-extra"); const exec_1 = require("exec"); -let system = {}; -let TMPDIR; -/** - * Add padding to a number to 5 places. Return a string. - * - * @param {integer} i Integer to pad - * - * @returns {string} Padded string - **/ -function padded_frame(i) { - let len = (i + '').length; - let str = i + ''; - for (let x = 0; x < 5 - len; x++) { - str = '0' + str; +/** @class FFMPEG **/ +class FFMPEG { + constructor(sys) { + this.id = 'ffmpeg'; + this.system = sys; + this.TMPDIR = path_1.join(this.system.tmp, 'mcopy_digital'); + this.init(); } - return str; -} -/** - * Render a single frame from a video or image to a png. - * - * @param {object} state State object containing file data - * @param {object} light Object containing color information for frame - * - * @returns {string} Path of frame - **/ -async function frame(state, light) { - const frameNum = state.frame; - const video = state.path; - const w = state.info.width; - const h = state.info.height; - const padded = padded_frame(frameNum); - let ext = 'tif'; - let rgb = light.color; - let tmpoutput; - let cmd; - let output; - let cmd2; - let output2; - let scale = ''; - if (w && h) { - scale = `,scale=${w}:${h}`; + async init() { + const Log = require('log'); + this.log = await Log({ label: this.id }); + await this.checkDir(); } - //console.dir(state) - //if (system.platform !== 'nix') { - ext = 'png'; - //} - tmpoutput = path_1.join(TMPDIR, `export-${padded}.${ext}`); - rgb = rgb.map((e) => { - return parseInt(e); - }); - // - cmd = `ffmpeg -y -i "${video}" -vf "select='gte(n\\,${frameNum})'${scale}" -vframes 1 -compression_algo raw -pix_fmt rgb24 "${tmpoutput}"`; - cmd2 = `convert "${tmpoutput}" -resize ${w}x${h} -size ${w}x${h} xc:"rgb(${rgb[0]},${rgb[1]},${rgb[2]})" +swap -compose Darken -composite "${tmpoutput}"`; - //ffmpeg -i "${video}" -ss 00:00:07.000 -vframes 1 "export-${time}.jpg" - //ffmpeg -i "${video}" -compression_algo raw -pix_fmt rgb24 "export-%05d.tiff" - //-vf "select=gte(n\,${frame})" -compression_algo raw -pix_fmt rgb24 "export-${padded}.png" - try { - console.log(cmd); - output = await exec_1.exec(cmd); + /** + * Add padding to a number to 5 places. Return a string. + * + * @param {integer} i Integer to pad + * + * @returns {string} Padded string + **/ + padded_frame(i) { + let len = (i + '').length; + let str = i + ''; + for (let x = 0; x < 5 - len; x++) { + str = '0' + str; + } + return str; } - catch (err) { - console.error(err); - } - if (output && output.stdout) - console.log(`"${output.stdout}"`); - if (rgb[0] !== 255 || rgb[1] !== 255 || rgb[2] !== 255) { + /** + * Render a single frame from a video or image to a png. + * + * @param {object} state State object containing file data + * @param {object} light Object containing color information for frame + * + * @returns {string} Path of frame + **/ + async frame(state, light) { + const frameNum = state.frame; + const video = state.path; + const w = state.info.width; + const h = state.info.height; + const padded = this.padded_frame(frameNum); + let ext = 'tif'; + let rgb = light.color; + let tmpoutput; + let cmd; + let output; + let cmd2; + let output2; + let scale = ''; + if (w && h) { + scale = `,scale=${w}:${h}`; + } + //console.dir(state) + //if (system.platform !== 'nix') { + ext = 'png'; + //} + tmpoutput = path_1.join(this.TMPDIR, `export-${padded}.${ext}`); + rgb = rgb.map((e) => { + return parseInt(e); + }); + // + cmd = `ffmpeg -y -i "${video}" -vf "select='gte(n\\,${frameNum})'${scale}" -vframes 1 -compression_algo raw -pix_fmt rgb24 "${tmpoutput}"`; + cmd2 = `convert "${tmpoutput}" -resize ${w}x${h} -size ${w}x${h} xc:"rgb(${rgb[0]},${rgb[1]},${rgb[2]})" +swap -compose Darken -composite "${tmpoutput}"`; + //ffmpeg -i "${video}" -ss 00:00:07.000 -vframes 1 "export-${time}.jpg" + //ffmpeg -i "${video}" -compression_algo raw -pix_fmt rgb24 "export-%05d.tiff" + //-vf "select=gte(n\,${frame})" -compression_algo raw -pix_fmt rgb24 "export-${padded}.png" try { - console.log(cmd2); - output2 = await exec_1.exec(cmd2); + console.log(cmd); + output = await exec_1.exec(cmd); + } + catch (err) { + console.error(err); + } + if (output && output.stdout) + console.log(`"${output.stdout}"`); + if (rgb[0] !== 255 || rgb[1] !== 255 || rgb[2] !== 255) { + try { + console.log(cmd2); + output2 = await exec_1.exec(cmd2); + } + catch (err) { + console.error(err); + } + } + if (output2 && output2.stdout) + console.log(`"${output2.stdout}"`); + return tmpoutput; + } + /** + * Render all frames in a video to the temp directory. + * Not in use. + * + * @param {string} video Path to video + * @param {object} obj Not sure + * + * @returns {?} + **/ + async frames(video, obj) { + const tmppath = this.TMPDIR; + let ext = 'tif'; + let tmpoutput; + //if (system.platform !== 'nix') { + ext = 'png'; + //} + tmpoutput = path_1.join(tmppath, `export-%05d.${ext}`); + try { + await fs_extra_1.mkdir(tmppath); + } + catch (err) { + console.error(err); + } + //ffmpeg -i "${video}" -compression_algo raw -pix_fmt rgb24 "${tmpoutput}" + } + /** + * Clears a specific frame from the tmp directory + * + * @param {integer} frame Integer of frame to clear + * + * @returns {boolean} True if successful, false if not + **/ + async clear(frame) { + const padded = this.padded_frame(frame); + let ext = 'tif'; + let tmppath; + let tmpoutput; + let cmd; + let fileExists; + //if (system.platform !== 'nix') { + ext = 'png'; + //} + tmppath = path_1.join(this.TMPDIR, `export-${padded}.${ext}`); + try { + fileExists = await fs_extra_1.exists(tmppath); + } + catch (err) { + console.error(err); + } + if (!fs_extra_1.exists) + return false; + try { + await fs_extra_1.unlink(tmppath); + console.log(`Cleared frame ${tmppath}`); + } + catch (err) { + console.error(err); + } + return true; + } + /** + * Delete all frames in temp directory. + * + **/ + async clearAll() { + const tmppath = this.TMPDIR; + let files; + try { + files = await fs_extra_1.readdir(tmppath); + } + catch (err) { + console.error(err); + } + if (files) { + files.forEach(async (file, index) => { + try { + await fs_extra_1.unlink(path_1.join(tmppath, file)); + } + catch (err) { + console.error(err); + } + }); + } + } + /** + * Checks if mcopy temp directory exists. If it doesn't, + * create it. + **/ + async checkDir() { + let fileExists; + try { + fileExists = await fs_extra_1.exists(this.TMPDIR); + } + catch (err) { + console.error('Error checking for tmp dir', err); + } + if (!fileExists) { + try { + await fs_extra_1.mkdir(this.TMPDIR); + console.log(`Created tmpdir ${this.TMPDIR}`); + } + catch (err) { + console.error('Error creating tmp dir', err); + } + } + try { + await this.clearAll(); } catch (err) { console.error(err); } } - if (output2 && output2.stdout) - console.log(`"${output2.stdout}"`); - return tmpoutput; -} -/** - * Render all frames in a video to the temp directory. - * Not in use. - * - * @param {string} video Path to video - * @param {object} obj Not sure - * - * @returns {?} - **/ -async function frames(video, obj) { - const tmppath = TMPDIR; - let ext = 'tif'; - let tmpoutput; - //if (system.platform !== 'nix') { - ext = 'png'; - //} - tmpoutput = path_1.join(tmppath, `export-%05d.${ext}`); - try { - await fs_extra_1.mkdir(tmppath); - } - catch (err) { - console.error(err); - } - //ffmpeg -i "${video}" -compression_algo raw -pix_fmt rgb24 "${tmpoutput}" -} -/** - * Clears a specific frame from the tmp directory - * - * @param {integer} frame Integer of frame to clear - * - * @returns {boolean} True if successful, false if not - **/ -async function clear(frame) { - const padded = padded_frame(frame); - let ext = 'tif'; - let tmppath; - let tmpoutput; - let cmd; - let fileExists; - //if (system.platform !== 'nix') { - ext = 'png'; - //} - tmppath = path_1.join(TMPDIR, `export-${padded}.${ext}`); - try { - fileExists = await fs_extra_1.exists(tmppath); - } - catch (err) { - console.error(err); - } - if (!fs_extra_1.exists) - return false; - try { - await fs_extra_1.unlink(tmppath); - console.log(`Cleared frame ${tmppath}`); - } - catch (err) { - console.error(err); - } - return true; -} -/** - * Delete all frames in temp directory. - * - **/ -async function clearAll() { - const tmppath = TMPDIR; - let files; - try { - files = await fs_extra_1.readdir(tmppath); - } - catch (err) { - console.error(err); - } - if (files) { - files.forEach(async (file, index) => { - try { - await fs_extra_1.unlink(path_1.join(tmppath, file)); - } - catch (err) { - console.error(err); - } - }); - } -} -/** - * Checks if mcopy temp directory exists. If it doesn't, - * create it. - **/ -async function checkDir() { - let fileExists; - try { - fileExists = await fs_extra_1.exists(TMPDIR); - } - catch (err) { - console.error('Error checking for tmp dir', err); - } - if (!fileExists) { - try { - await fs_extra_1.mkdir(TMPDIR); - console.log(`Created tmpdir ${TMPDIR}`); - } - catch (err) { - console.error('Error creating tmp dir', err); - } - } - try { - await clearAll(); - } - catch (err) { - console.error(err); - } } module.exports = (sys) => { - system = sys; - TMPDIR = path_1.join(system.tmp, 'mcopy_digital'); - checkDir(); - return { - frames, - frame, - clear, - clearAll - }; + return new FFMPEG(sys); }; //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/app/lib/ffmpeg/index.js.map b/app/lib/ffmpeg/index.js.map index 7de0141..8975f0c 100644 --- a/app/lib/ffmpeg/index.js.map +++ b/app/lib/ffmpeg/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ffmpeg/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ffmpeg/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/cli/lib/ffmpeg/index.js b/cli/lib/ffmpeg/index.js index 96e8a84..a34514f 100644 --- a/cli/lib/ffmpeg/index.js +++ b/cli/lib/ffmpeg/index.js @@ -3,205 +3,209 @@ Object.defineProperty(exports, "__esModule", { value: true }); const path_1 = require("path"); const fs_extra_1 = require("fs-extra"); const exec_1 = require("exec"); -let system = {}; -let TMPDIR; -/** - * Add padding to a number to 5 places. Return a string. - * - * @param {integer} i Integer to pad - * - * @returns {string} Padded string - **/ -function padded_frame(i) { - let len = (i + '').length; - let str = i + ''; - for (let x = 0; x < 5 - len; x++) { - str = '0' + str; +/** @class FFMPEG **/ +class FFMPEG { + constructor(sys) { + this.id = 'ffmpeg'; + this.system = sys; + this.TMPDIR = path_1.join(this.system.tmp, 'mcopy_digital'); + this.init(); } - return str; -} -/** - * Render a single frame from a video or image to a png. - * - * @param {object} state State object containing file data - * @param {object} light Object containing color information for frame - * - * @returns {string} Path of frame - **/ -async function frame(state, light) { - const frameNum = state.frame; - const video = state.path; - const w = state.info.width; - const h = state.info.height; - const padded = padded_frame(frameNum); - let ext = 'tif'; - let rgb = light.color; - let tmpoutput; - let cmd; - let output; - let cmd2; - let output2; - let scale = ''; - if (w && h) { - scale = `,scale=${w}:${h}`; + async init() { + const Log = require('log'); + this.log = await Log({ label: this.id }); + await this.checkDir(); } - //console.dir(state) - //if (system.platform !== 'nix') { - ext = 'png'; - //} - tmpoutput = path_1.join(TMPDIR, `export-${padded}.${ext}`); - rgb = rgb.map((e) => { - return parseInt(e); - }); - // - cmd = `ffmpeg -y -i "${video}" -vf "select='gte(n\\,${frameNum})'${scale}" -vframes 1 -compression_algo raw -pix_fmt rgb24 "${tmpoutput}"`; - cmd2 = `convert "${tmpoutput}" -resize ${w}x${h} -size ${w}x${h} xc:"rgb(${rgb[0]},${rgb[1]},${rgb[2]})" +swap -compose Darken -composite "${tmpoutput}"`; - //ffmpeg -i "${video}" -ss 00:00:07.000 -vframes 1 "export-${time}.jpg" - //ffmpeg -i "${video}" -compression_algo raw -pix_fmt rgb24 "export-%05d.tiff" - //-vf "select=gte(n\,${frame})" -compression_algo raw -pix_fmt rgb24 "export-${padded}.png" - try { - console.log(cmd); - output = await exec_1.exec(cmd); + /** + * Add padding to a number to 5 places. Return a string. + * + * @param {integer} i Integer to pad + * + * @returns {string} Padded string + **/ + padded_frame(i) { + let len = (i + '').length; + let str = i + ''; + for (let x = 0; x < 5 - len; x++) { + str = '0' + str; + } + return str; } - catch (err) { - console.error(err); - } - if (output && output.stdout) - console.log(`"${output.stdout}"`); - if (rgb[0] !== 255 || rgb[1] !== 255 || rgb[2] !== 255) { + /** + * Render a single frame from a video or image to a png. + * + * @param {object} state State object containing file data + * @param {object} light Object containing color information for frame + * + * @returns {string} Path of frame + **/ + async frame(state, light) { + const frameNum = state.frame; + const video = state.path; + const w = state.info.width; + const h = state.info.height; + const padded = this.padded_frame(frameNum); + let ext = 'tif'; + let rgb = light.color; + let tmpoutput; + let cmd; + let output; + let cmd2; + let output2; + let scale = ''; + if (w && h) { + scale = `,scale=${w}:${h}`; + } + //console.dir(state) + //if (system.platform !== 'nix') { + ext = 'png'; + //} + tmpoutput = path_1.join(this.TMPDIR, `export-${padded}.${ext}`); + rgb = rgb.map((e) => { + return parseInt(e); + }); + // + cmd = `ffmpeg -y -i "${video}" -vf "select='gte(n\\,${frameNum})'${scale}" -vframes 1 -compression_algo raw -pix_fmt rgb24 "${tmpoutput}"`; + cmd2 = `convert "${tmpoutput}" -resize ${w}x${h} -size ${w}x${h} xc:"rgb(${rgb[0]},${rgb[1]},${rgb[2]})" +swap -compose Darken -composite "${tmpoutput}"`; + //ffmpeg -i "${video}" -ss 00:00:07.000 -vframes 1 "export-${time}.jpg" + //ffmpeg -i "${video}" -compression_algo raw -pix_fmt rgb24 "export-%05d.tiff" + //-vf "select=gte(n\,${frame})" -compression_algo raw -pix_fmt rgb24 "export-${padded}.png" try { - console.log(cmd2); - output2 = await exec_1.exec(cmd2); + console.log(cmd); + output = await exec_1.exec(cmd); + } + catch (err) { + console.error(err); + } + if (output && output.stdout) + console.log(`"${output.stdout}"`); + if (rgb[0] !== 255 || rgb[1] !== 255 || rgb[2] !== 255) { + try { + console.log(cmd2); + output2 = await exec_1.exec(cmd2); + } + catch (err) { + console.error(err); + } + } + if (output2 && output2.stdout) + console.log(`"${output2.stdout}"`); + return tmpoutput; + } + /** + * Render all frames in a video to the temp directory. + * Not in use. + * + * @param {string} video Path to video + * @param {object} obj Not sure + * + * @returns {?} + **/ + async frames(video, obj) { + const tmppath = this.TMPDIR; + let ext = 'tif'; + let tmpoutput; + //if (system.platform !== 'nix') { + ext = 'png'; + //} + tmpoutput = path_1.join(tmppath, `export-%05d.${ext}`); + try { + await fs_extra_1.mkdir(tmppath); + } + catch (err) { + console.error(err); + } + //ffmpeg -i "${video}" -compression_algo raw -pix_fmt rgb24 "${tmpoutput}" + } + /** + * Clears a specific frame from the tmp directory + * + * @param {integer} frame Integer of frame to clear + * + * @returns {boolean} True if successful, false if not + **/ + async clear(frame) { + const padded = this.padded_frame(frame); + let ext = 'tif'; + let tmppath; + let tmpoutput; + let cmd; + let fileExists; + //if (system.platform !== 'nix') { + ext = 'png'; + //} + tmppath = path_1.join(this.TMPDIR, `export-${padded}.${ext}`); + try { + fileExists = await fs_extra_1.exists(tmppath); + } + catch (err) { + console.error(err); + } + if (!fs_extra_1.exists) + return false; + try { + await fs_extra_1.unlink(tmppath); + console.log(`Cleared frame ${tmppath}`); + } + catch (err) { + console.error(err); + } + return true; + } + /** + * Delete all frames in temp directory. + * + **/ + async clearAll() { + const tmppath = this.TMPDIR; + let files; + try { + files = await fs_extra_1.readdir(tmppath); + } + catch (err) { + console.error(err); + } + if (files) { + files.forEach(async (file, index) => { + try { + await fs_extra_1.unlink(path_1.join(tmppath, file)); + } + catch (err) { + console.error(err); + } + }); + } + } + /** + * Checks if mcopy temp directory exists. If it doesn't, + * create it. + **/ + async checkDir() { + let fileExists; + try { + fileExists = await fs_extra_1.exists(this.TMPDIR); + } + catch (err) { + console.error('Error checking for tmp dir', err); + } + if (!fileExists) { + try { + await fs_extra_1.mkdir(this.TMPDIR); + console.log(`Created tmpdir ${this.TMPDIR}`); + } + catch (err) { + console.error('Error creating tmp dir', err); + } + } + try { + await this.clearAll(); } catch (err) { console.error(err); } } - if (output2 && output2.stdout) - console.log(`"${output2.stdout}"`); - return tmpoutput; -} -/** - * Render all frames in a video to the temp directory. - * Not in use. - * - * @param {string} video Path to video - * @param {object} obj Not sure - * - * @returns {?} - **/ -async function frames(video, obj) { - const tmppath = TMPDIR; - let ext = 'tif'; - let tmpoutput; - //if (system.platform !== 'nix') { - ext = 'png'; - //} - tmpoutput = path_1.join(tmppath, `export-%05d.${ext}`); - try { - await fs_extra_1.mkdir(tmppath); - } - catch (err) { - console.error(err); - } - //ffmpeg -i "${video}" -compression_algo raw -pix_fmt rgb24 "${tmpoutput}" -} -/** - * Clears a specific frame from the tmp directory - * - * @param {integer} frame Integer of frame to clear - * - * @returns {boolean} True if successful, false if not - **/ -async function clear(frame) { - const padded = padded_frame(frame); - let ext = 'tif'; - let tmppath; - let tmpoutput; - let cmd; - let fileExists; - //if (system.platform !== 'nix') { - ext = 'png'; - //} - tmppath = path_1.join(TMPDIR, `export-${padded}.${ext}`); - try { - fileExists = await fs_extra_1.exists(tmppath); - } - catch (err) { - console.error(err); - } - if (!fs_extra_1.exists) - return false; - try { - await fs_extra_1.unlink(tmppath); - console.log(`Cleared frame ${tmppath}`); - } - catch (err) { - console.error(err); - } - return true; -} -/** - * Delete all frames in temp directory. - * - **/ -async function clearAll() { - const tmppath = TMPDIR; - let files; - try { - files = await fs_extra_1.readdir(tmppath); - } - catch (err) { - console.error(err); - } - if (files) { - files.forEach(async (file, index) => { - try { - await fs_extra_1.unlink(path_1.join(tmppath, file)); - } - catch (err) { - console.error(err); - } - }); - } -} -/** - * Checks if mcopy temp directory exists. If it doesn't, - * create it. - **/ -async function checkDir() { - let fileExists; - try { - fileExists = await fs_extra_1.exists(TMPDIR); - } - catch (err) { - console.error('Error checking for tmp dir', err); - } - if (!fileExists) { - try { - await fs_extra_1.mkdir(TMPDIR); - console.log(`Created tmpdir ${TMPDIR}`); - } - catch (err) { - console.error('Error creating tmp dir', err); - } - } - try { - await clearAll(); - } - catch (err) { - console.error(err); - } } module.exports = (sys) => { - system = sys; - TMPDIR = path_1.join(system.tmp, 'mcopy_digital'); - checkDir(); - return { - frames, - frame, - clear, - clearAll - }; + return new FFMPEG(sys); }; //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/cli/lib/ffmpeg/index.js.map b/cli/lib/ffmpeg/index.js.map index 7de0141..8975f0c 100644 --- a/cli/lib/ffmpeg/index.js.map +++ b/cli/lib/ffmpeg/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ffmpeg/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ffmpeg/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/ffmpeg/index.js b/lib/ffmpeg/index.js index 96e8a84..a34514f 100644 --- a/lib/ffmpeg/index.js +++ b/lib/ffmpeg/index.js @@ -3,205 +3,209 @@ Object.defineProperty(exports, "__esModule", { value: true }); const path_1 = require("path"); const fs_extra_1 = require("fs-extra"); const exec_1 = require("exec"); -let system = {}; -let TMPDIR; -/** - * Add padding to a number to 5 places. Return a string. - * - * @param {integer} i Integer to pad - * - * @returns {string} Padded string - **/ -function padded_frame(i) { - let len = (i + '').length; - let str = i + ''; - for (let x = 0; x < 5 - len; x++) { - str = '0' + str; +/** @class FFMPEG **/ +class FFMPEG { + constructor(sys) { + this.id = 'ffmpeg'; + this.system = sys; + this.TMPDIR = path_1.join(this.system.tmp, 'mcopy_digital'); + this.init(); } - return str; -} -/** - * Render a single frame from a video or image to a png. - * - * @param {object} state State object containing file data - * @param {object} light Object containing color information for frame - * - * @returns {string} Path of frame - **/ -async function frame(state, light) { - const frameNum = state.frame; - const video = state.path; - const w = state.info.width; - const h = state.info.height; - const padded = padded_frame(frameNum); - let ext = 'tif'; - let rgb = light.color; - let tmpoutput; - let cmd; - let output; - let cmd2; - let output2; - let scale = ''; - if (w && h) { - scale = `,scale=${w}:${h}`; + async init() { + const Log = require('log'); + this.log = await Log({ label: this.id }); + await this.checkDir(); } - //console.dir(state) - //if (system.platform !== 'nix') { - ext = 'png'; - //} - tmpoutput = path_1.join(TMPDIR, `export-${padded}.${ext}`); - rgb = rgb.map((e) => { - return parseInt(e); - }); - // - cmd = `ffmpeg -y -i "${video}" -vf "select='gte(n\\,${frameNum})'${scale}" -vframes 1 -compression_algo raw -pix_fmt rgb24 "${tmpoutput}"`; - cmd2 = `convert "${tmpoutput}" -resize ${w}x${h} -size ${w}x${h} xc:"rgb(${rgb[0]},${rgb[1]},${rgb[2]})" +swap -compose Darken -composite "${tmpoutput}"`; - //ffmpeg -i "${video}" -ss 00:00:07.000 -vframes 1 "export-${time}.jpg" - //ffmpeg -i "${video}" -compression_algo raw -pix_fmt rgb24 "export-%05d.tiff" - //-vf "select=gte(n\,${frame})" -compression_algo raw -pix_fmt rgb24 "export-${padded}.png" - try { - console.log(cmd); - output = await exec_1.exec(cmd); + /** + * Add padding to a number to 5 places. Return a string. + * + * @param {integer} i Integer to pad + * + * @returns {string} Padded string + **/ + padded_frame(i) { + let len = (i + '').length; + let str = i + ''; + for (let x = 0; x < 5 - len; x++) { + str = '0' + str; + } + return str; } - catch (err) { - console.error(err); - } - if (output && output.stdout) - console.log(`"${output.stdout}"`); - if (rgb[0] !== 255 || rgb[1] !== 255 || rgb[2] !== 255) { + /** + * Render a single frame from a video or image to a png. + * + * @param {object} state State object containing file data + * @param {object} light Object containing color information for frame + * + * @returns {string} Path of frame + **/ + async frame(state, light) { + const frameNum = state.frame; + const video = state.path; + const w = state.info.width; + const h = state.info.height; + const padded = this.padded_frame(frameNum); + let ext = 'tif'; + let rgb = light.color; + let tmpoutput; + let cmd; + let output; + let cmd2; + let output2; + let scale = ''; + if (w && h) { + scale = `,scale=${w}:${h}`; + } + //console.dir(state) + //if (system.platform !== 'nix') { + ext = 'png'; + //} + tmpoutput = path_1.join(this.TMPDIR, `export-${padded}.${ext}`); + rgb = rgb.map((e) => { + return parseInt(e); + }); + // + cmd = `ffmpeg -y -i "${video}" -vf "select='gte(n\\,${frameNum})'${scale}" -vframes 1 -compression_algo raw -pix_fmt rgb24 "${tmpoutput}"`; + cmd2 = `convert "${tmpoutput}" -resize ${w}x${h} -size ${w}x${h} xc:"rgb(${rgb[0]},${rgb[1]},${rgb[2]})" +swap -compose Darken -composite "${tmpoutput}"`; + //ffmpeg -i "${video}" -ss 00:00:07.000 -vframes 1 "export-${time}.jpg" + //ffmpeg -i "${video}" -compression_algo raw -pix_fmt rgb24 "export-%05d.tiff" + //-vf "select=gte(n\,${frame})" -compression_algo raw -pix_fmt rgb24 "export-${padded}.png" try { - console.log(cmd2); - output2 = await exec_1.exec(cmd2); + console.log(cmd); + output = await exec_1.exec(cmd); + } + catch (err) { + console.error(err); + } + if (output && output.stdout) + console.log(`"${output.stdout}"`); + if (rgb[0] !== 255 || rgb[1] !== 255 || rgb[2] !== 255) { + try { + console.log(cmd2); + output2 = await exec_1.exec(cmd2); + } + catch (err) { + console.error(err); + } + } + if (output2 && output2.stdout) + console.log(`"${output2.stdout}"`); + return tmpoutput; + } + /** + * Render all frames in a video to the temp directory. + * Not in use. + * + * @param {string} video Path to video + * @param {object} obj Not sure + * + * @returns {?} + **/ + async frames(video, obj) { + const tmppath = this.TMPDIR; + let ext = 'tif'; + let tmpoutput; + //if (system.platform !== 'nix') { + ext = 'png'; + //} + tmpoutput = path_1.join(tmppath, `export-%05d.${ext}`); + try { + await fs_extra_1.mkdir(tmppath); + } + catch (err) { + console.error(err); + } + //ffmpeg -i "${video}" -compression_algo raw -pix_fmt rgb24 "${tmpoutput}" + } + /** + * Clears a specific frame from the tmp directory + * + * @param {integer} frame Integer of frame to clear + * + * @returns {boolean} True if successful, false if not + **/ + async clear(frame) { + const padded = this.padded_frame(frame); + let ext = 'tif'; + let tmppath; + let tmpoutput; + let cmd; + let fileExists; + //if (system.platform !== 'nix') { + ext = 'png'; + //} + tmppath = path_1.join(this.TMPDIR, `export-${padded}.${ext}`); + try { + fileExists = await fs_extra_1.exists(tmppath); + } + catch (err) { + console.error(err); + } + if (!fs_extra_1.exists) + return false; + try { + await fs_extra_1.unlink(tmppath); + console.log(`Cleared frame ${tmppath}`); + } + catch (err) { + console.error(err); + } + return true; + } + /** + * Delete all frames in temp directory. + * + **/ + async clearAll() { + const tmppath = this.TMPDIR; + let files; + try { + files = await fs_extra_1.readdir(tmppath); + } + catch (err) { + console.error(err); + } + if (files) { + files.forEach(async (file, index) => { + try { + await fs_extra_1.unlink(path_1.join(tmppath, file)); + } + catch (err) { + console.error(err); + } + }); + } + } + /** + * Checks if mcopy temp directory exists. If it doesn't, + * create it. + **/ + async checkDir() { + let fileExists; + try { + fileExists = await fs_extra_1.exists(this.TMPDIR); + } + catch (err) { + console.error('Error checking for tmp dir', err); + } + if (!fileExists) { + try { + await fs_extra_1.mkdir(this.TMPDIR); + console.log(`Created tmpdir ${this.TMPDIR}`); + } + catch (err) { + console.error('Error creating tmp dir', err); + } + } + try { + await this.clearAll(); } catch (err) { console.error(err); } } - if (output2 && output2.stdout) - console.log(`"${output2.stdout}"`); - return tmpoutput; -} -/** - * Render all frames in a video to the temp directory. - * Not in use. - * - * @param {string} video Path to video - * @param {object} obj Not sure - * - * @returns {?} - **/ -async function frames(video, obj) { - const tmppath = TMPDIR; - let ext = 'tif'; - let tmpoutput; - //if (system.platform !== 'nix') { - ext = 'png'; - //} - tmpoutput = path_1.join(tmppath, `export-%05d.${ext}`); - try { - await fs_extra_1.mkdir(tmppath); - } - catch (err) { - console.error(err); - } - //ffmpeg -i "${video}" -compression_algo raw -pix_fmt rgb24 "${tmpoutput}" -} -/** - * Clears a specific frame from the tmp directory - * - * @param {integer} frame Integer of frame to clear - * - * @returns {boolean} True if successful, false if not - **/ -async function clear(frame) { - const padded = padded_frame(frame); - let ext = 'tif'; - let tmppath; - let tmpoutput; - let cmd; - let fileExists; - //if (system.platform !== 'nix') { - ext = 'png'; - //} - tmppath = path_1.join(TMPDIR, `export-${padded}.${ext}`); - try { - fileExists = await fs_extra_1.exists(tmppath); - } - catch (err) { - console.error(err); - } - if (!fs_extra_1.exists) - return false; - try { - await fs_extra_1.unlink(tmppath); - console.log(`Cleared frame ${tmppath}`); - } - catch (err) { - console.error(err); - } - return true; -} -/** - * Delete all frames in temp directory. - * - **/ -async function clearAll() { - const tmppath = TMPDIR; - let files; - try { - files = await fs_extra_1.readdir(tmppath); - } - catch (err) { - console.error(err); - } - if (files) { - files.forEach(async (file, index) => { - try { - await fs_extra_1.unlink(path_1.join(tmppath, file)); - } - catch (err) { - console.error(err); - } - }); - } -} -/** - * Checks if mcopy temp directory exists. If it doesn't, - * create it. - **/ -async function checkDir() { - let fileExists; - try { - fileExists = await fs_extra_1.exists(TMPDIR); - } - catch (err) { - console.error('Error checking for tmp dir', err); - } - if (!fileExists) { - try { - await fs_extra_1.mkdir(TMPDIR); - console.log(`Created tmpdir ${TMPDIR}`); - } - catch (err) { - console.error('Error creating tmp dir', err); - } - } - try { - await clearAll(); - } - catch (err) { - console.error(err); - } } module.exports = (sys) => { - system = sys; - TMPDIR = path_1.join(system.tmp, 'mcopy_digital'); - checkDir(); - return { - frames, - frame, - clear, - clearAll - }; + return new FFMPEG(sys); }; //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/lib/ffmpeg/index.js.map b/lib/ffmpeg/index.js.map index 7de0141..8975f0c 100644 --- a/lib/ffmpeg/index.js.map +++ b/lib/ffmpeg/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ffmpeg/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ffmpeg/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/ffmpeg/index.ts b/src/ffmpeg/index.ts index 4b682ea..44a7f60 100644 --- a/src/ffmpeg/index.ts +++ b/src/ffmpeg/index.ts @@ -9,220 +9,226 @@ import { exec } from 'exec'; //const spawn = require('spawn'); import { exit } from 'exit'; -let system : any = {}; -let TMPDIR : string; +/** @class FFMPEG **/ -/** - * Add padding to a number to 5 places. Return a string. - * - * @param {integer} i Integer to pad - * - * @returns {string} Padded string - **/ - -function padded_frame (i : number) { - let len = (i + '').length; - let str = i + ''; - for (let x = 0; x < 5 - len; x++) { - str = '0' + str; +class FFMPEG { + private system : any; + private log : any; + private id : string = 'ffmpeg'; + private TMPDIR : string; + constructor (sys : any) { + this.system = sys; + this.TMPDIR = join(this.system.tmp, 'mcopy_digital'); + this.init() } - return str; -} + async init () { + const Log = require('log'); + this.log = await Log({ label : this.id }); + await this.checkDir(); + } + /** + * Add padding to a number to 5 places. Return a string. + * + * @param {integer} i Integer to pad + * + * @returns {string} Padded string + **/ -/** - * Render a single frame from a video or image to a png. - * - * @param {object} state State object containing file data - * @param {object} light Object containing color information for frame - * - * @returns {string} Path of frame - **/ -async function frame (state : any, light : any) { - const frameNum : number = state.frame; - const video : string = state.path; - const w : number = state.info.width; - const h : number = state.info.height; - const padded : string = padded_frame(frameNum); - let ext : string = 'tif'; - let rgb : any[] = light.color; - let tmpoutput : string; - let cmd : string; - let output : any; - let cmd2 : string; - let output2 : any; - - let scale : string = ''; - if (w && h) { - scale = `,scale=${w}:${h}`; + private padded_frame (i : number) { + let len = (i + '').length; + let str = i + ''; + for (let x = 0; x < 5 - len; x++) { + str = '0' + str; + } + return str; } - //console.dir(state) + /** + * Render a single frame from a video or image to a png. + * + * @param {object} state State object containing file data + * @param {object} light Object containing color information for frame + * + * @returns {string} Path of frame + **/ + public async frame (state : any, light : any) { + const frameNum : number = state.frame; + const video : string = state.path; + const w : number = state.info.width; + const h : number = state.info.height; + const padded : string = this.padded_frame(frameNum); + let ext : string = 'tif'; + let rgb : any[] = light.color; + let tmpoutput : string; + let cmd : string; + let output : any; + let cmd2 : string; + let output2 : any; - //if (system.platform !== 'nix') { - ext = 'png'; - //} + let scale : string = ''; + if (w && h) { + scale = `,scale=${w}:${h}`; + } - tmpoutput = join(TMPDIR, `export-${padded}.${ext}`); + //console.dir(state) - rgb = rgb.map((e : string) => { - return parseInt(e); - }); -// - cmd = `ffmpeg -y -i "${video}" -vf "select='gte(n\\,${frameNum})'${scale}" -vframes 1 -compression_algo raw -pix_fmt rgb24 "${tmpoutput}"`; - cmd2 = `convert "${tmpoutput}" -resize ${w}x${h} -size ${w}x${h} xc:"rgb(${rgb[0]},${rgb[1]},${rgb[2]})" +swap -compose Darken -composite "${tmpoutput}"`; + //if (system.platform !== 'nix') { + ext = 'png'; + //} - //ffmpeg -i "${video}" -ss 00:00:07.000 -vframes 1 "export-${time}.jpg" - //ffmpeg -i "${video}" -compression_algo raw -pix_fmt rgb24 "export-%05d.tiff" - //-vf "select=gte(n\,${frame})" -compression_algo raw -pix_fmt rgb24 "export-${padded}.png" + tmpoutput = join(this.TMPDIR, `export-${padded}.${ext}`); - try { - console.log(cmd); - output = await exec(cmd); - } catch (err) { - console.error(err); - } - if (output && output.stdout) console.log(`"${output.stdout}"`); + rgb = rgb.map((e : string) => { + return parseInt(e); + }); + // + cmd = `ffmpeg -y -i "${video}" -vf "select='gte(n\\,${frameNum})'${scale}" -vframes 1 -compression_algo raw -pix_fmt rgb24 "${tmpoutput}"`; + cmd2 = `convert "${tmpoutput}" -resize ${w}x${h} -size ${w}x${h} xc:"rgb(${rgb[0]},${rgb[1]},${rgb[2]})" +swap -compose Darken -composite "${tmpoutput}"`; + + //ffmpeg -i "${video}" -ss 00:00:07.000 -vframes 1 "export-${time}.jpg" + //ffmpeg -i "${video}" -compression_algo raw -pix_fmt rgb24 "export-%05d.tiff" + //-vf "select=gte(n\,${frame})" -compression_algo raw -pix_fmt rgb24 "export-${padded}.png" - if (rgb[0] !== 255 || rgb[1] !== 255 || rgb[2] !== 255) { try { - console.log(cmd2); - output2 = await exec(cmd2); + console.log(cmd); + output = await exec(cmd); + } catch (err) { + console.error(err); + } + if (output && output.stdout) console.log(`"${output.stdout}"`); + + if (rgb[0] !== 255 || rgb[1] !== 255 || rgb[2] !== 255) { + try { + console.log(cmd2); + output2 = await exec(cmd2); + } catch (err) { + console.error(err); + } + } + + if (output2 && output2.stdout) console.log(`"${output2.stdout}"`); + return tmpoutput + } + + /** + * Render all frames in a video to the temp directory. + * Not in use. + * + * @param {string} video Path to video + * @param {object} obj Not sure + * + * @returns {?} + **/ + public async frames (video : string, obj : any) { + const tmppath : string = this.TMPDIR; + let ext : string = 'tif'; + let tmpoutput : string; + + //if (system.platform !== 'nix') { + ext = 'png'; + //} + + tmpoutput = join(tmppath, `export-%05d.${ext}`); + try { + await mkdir(tmppath); + } catch (err) { + console.error(err); + } + + //ffmpeg -i "${video}" -compression_algo raw -pix_fmt rgb24 "${tmpoutput}" + } + + /** + * Clears a specific frame from the tmp directory + * + * @param {integer} frame Integer of frame to clear + * + * @returns {boolean} True if successful, false if not + **/ + public async clear (frame : number) { + const padded : string = this.padded_frame(frame); + let ext : string = 'tif'; + let tmppath : string; + let tmpoutput : string; + let cmd : string; + let fileExists : boolean; + + //if (system.platform !== 'nix') { + ext = 'png'; + //} + + tmppath = join(this.TMPDIR, `export-${padded}.${ext}`); + + try { + fileExists = await exists(tmppath); + } catch (err) { + console.error(err); + } + + if (!exists) return false; + + try { + await unlink(tmppath); + console.log(`Cleared frame ${tmppath}`); + } catch (err) { + console.error(err); + } + + return true; + } + + /** + * Delete all frames in temp directory. + * + **/ + public async clearAll () { + const tmppath : string = this.TMPDIR; + let files : any; + try { + files = await readdir(tmppath); + } catch (err) { + console.error(err); + } + if (files) { + files.forEach(async (file : string, index : any) => { + try { + await unlink(join(tmppath, file)); + } catch (err) { + console.error(err); + } + }); + } + } + + /** + * Checks if mcopy temp directory exists. If it doesn't, + * create it. + **/ + private async checkDir () { + let fileExists : boolean; + try { + fileExists = await exists(this.TMPDIR); + } catch (err) { + console.error('Error checking for tmp dir', err); + } + + if (!fileExists) { + try { + await mkdir(this.TMPDIR); + console.log(`Created tmpdir ${this.TMPDIR}`); + } catch (err) { + console.error('Error creating tmp dir', err); + } + } + try { + await this.clearAll(); } catch (err) { console.error(err); } } - - if (output2 && output2.stdout) console.log(`"${output2.stdout}"`); - return tmpoutput } -/** - * Render all frames in a video to the temp directory. - * Not in use. - * - * @param {string} video Path to video - * @param {object} obj Not sure - * - * @returns {?} - **/ -async function frames (video : string, obj : any) { - const tmppath : string = TMPDIR; - let ext : string = 'tif'; - let tmpoutput : string; - - //if (system.platform !== 'nix') { - ext = 'png'; - //} - - tmpoutput = join(tmppath, `export-%05d.${ext}`); - try { - await mkdir(tmppath); - } catch (err) { - console.error(err); - } - - //ffmpeg -i "${video}" -compression_algo raw -pix_fmt rgb24 "${tmpoutput}" -} - -/** - * Clears a specific frame from the tmp directory - * - * @param {integer} frame Integer of frame to clear - * - * @returns {boolean} True if successful, false if not - **/ -async function clear (frame : number) { - const padded : string = padded_frame(frame); - let ext : string = 'tif'; - let tmppath : string; - let tmpoutput : string; - let cmd : string; - let fileExists : boolean; - - //if (system.platform !== 'nix') { - ext = 'png'; - //} - - tmppath = join(TMPDIR, `export-${padded}.${ext}`); - - try { - fileExists = await exists(tmppath); - } catch (err) { - console.error(err); - } - - if (!exists) return false; - - try { - await unlink(tmppath); - console.log(`Cleared frame ${tmppath}`); - } catch (err) { - console.error(err); - } - - return true; -} - -/** - * Delete all frames in temp directory. - * - **/ -async function clearAll () { - const tmppath : string = TMPDIR; - let files : any; - try { - files = await readdir(tmppath); - } catch (err) { - console.error(err); - } - if (files) { - files.forEach(async (file : string, index : any) => { - try { - await unlink(join(tmppath, file)); - } catch (err) { - console.error(err); - } - }); - } -} - -/** - * Checks if mcopy temp directory exists. If it doesn't, - * create it. - **/ -async function checkDir () { - let fileExists : boolean; - try { - fileExists = await exists(TMPDIR); - } catch (err) { - console.error('Error checking for tmp dir', err); - } - - if (!fileExists) { - try { - await mkdir(TMPDIR); - console.log(`Created tmpdir ${TMPDIR}`); - } catch (err) { - console.error('Error creating tmp dir', err); - } - } - try { - await clearAll(); - } catch (err) { - console.error(err); - } -} module.exports = (sys : any) => { - system = sys; - TMPDIR = join(system.tmp, 'mcopy_digital'); - - checkDir(); - - return { - frames, - frame, - clear, - clearAll - } + return new FFMPEG(sys); } \ No newline at end of file