diff --git a/package.json b/package.json index 08c1e6af..bf551b0a 100644 --- a/package.json +++ b/package.json @@ -40,22 +40,22 @@ "grunt-lint-inline": "^1.0.0", "grunt-simple-mocha": "^0.4.1", "imap": "^0.8.19", - "mailparser": "^3.0.0", + "mailparser": "~3.0.1", "markdown-it": "^11.0.0", "mocha": "~6.2.3", "msgpack-lite": "^0.1.26", "multilang-sentiment": "^1.2.0", "ngeohash": "^0.6.3", - "node-red": "^1.1.3", + "node-red": "~1.2.6", "node-red-node-test-helper": "~0.2.5", - "nodemailer": "^6.4.10", + "nodemailer": "~6.4.16", "poplib": "^0.1.7", "proxyquire": "^2.1.3", "pushbullet": "^2.4.0", "sentiment": "^2.1.0", "should": "^13.2.3", "sinon": "~7.5.0", - "smtp-server": "^3.7.0", + "smtp-server": "~3.8.0", "supertest": "^4.0.2", "when": "^3.7.8" }, diff --git a/test/utility/exif/94-exif_spec.js b/test/utility/exif/94-exif_spec.js index 6a4d01cb..1e2efd37 100644 --- a/test/utility/exif/94-exif_spec.js +++ b/test/utility/exif/94-exif_spec.js @@ -26,7 +26,7 @@ describe('exif node', function() { //var data = fs.readFileSync("test/utility/exif/exif_test_image.jpg", null); // extracting genuine exif data to be fed back as the result of the stubbed ExifImage constructor //var data = fs.readFileSync("exif_test_image.jpg", null); // extracting genuine exif data to be fed back as the result of the stubbed ExifImage constructor var flow = [{id:"exifNode1", type:"exif", wires:[["helperNode1"]]}, - {id:"helperNode1", type:"helper"}]; + {id:"helperNode1", type:"helper"}]; var gpsmsg = { gps: { GPSLatitudeRef: 'N', GPSLatitude: [ 50, 57, 22.4697 ], @@ -65,7 +65,7 @@ describe('exif node', function() { //var data = fs.readFileSync("test/utility/exif/exif_test_image.jpg", null); // extracting genuine exif data to be fed back as the result of the stubbed ExifImage constructor //var data = fs.readFileSync("exif_test_image.jpg", null); // extracting genuine exif data to be fed back as the result of the stubbed ExifImage constructor var flow = [{id:"exifNode1", type:"exif", wires:[["helperNode1"]]}, - {id:"helperNode1", type:"helper"}]; + {id:"helperNode1", type:"helper"}]; var gpsmsg = { gps: { GPSLatitudeRef: 'S', GPSLatitude: [ 50, 57, 22.4697 ], @@ -101,7 +101,7 @@ describe('exif node', function() { var data = new Buffer.from("hello"); var eD; var flow = [{id:"exifNode1", type:"exif", wires:[["helperNode1"]]}, - {id:"helperNode1", type:"helper"}]; + {id:"helperNode1", type:"helper"}]; helper.load(exifNode, flow, function() { var exifNode1 = helper.getNode("exifNode1"); @@ -127,7 +127,7 @@ describe('exif node', function() { var data = "hello"; var eD; var flow = [{id:"exifNode1", type:"exif", wires:[["helperNode1"]]}, - {id:"helperNode1", type:"helper"}]; + {id:"helperNode1", type:"helper"}]; helper.load(exifNode, flow, function() { var exifNode1 = helper.getNode("exifNode1"); @@ -153,7 +153,7 @@ describe('exif node', function() { var data = new Buffer.from("hello"); var eD; var flow = [{id:"exifNode1", type:"exif", wires:[["helperNode1"]]}, - {id:"helperNode1", type:"helper"}]; + {id:"helperNode1", type:"helper"}]; helper.load(exifNode, flow, function() { var exifNode1 = helper.getNode("exifNode1"); @@ -179,7 +179,7 @@ describe('exif node', function() { var data = new Buffer.from("hello"); var eD; var flow = [{id:"exifNode1", type:"exif", wires:[["helperNode1"]]}, - {id:"helperNode1", type:"helper"}]; + {id:"helperNode1", type:"helper"}]; var gpsmsg = { gps: { GPSLatitudeRef: 'N', GPSLatitude: [ 50, 57 ], @@ -219,7 +219,7 @@ describe('exif node', function() { var data = new Buffer.from("hello"); var eD; var flow = [{id:"exifNode1", type:"exif", wires:[["helperNode1"]]}, - {id:"helperNode1", type:"helper"}]; + {id:"helperNode1", type:"helper"}]; var gpsmsg = { gps: { GPSLatitudeRef: 'N', GPSLatitude: [ 50, 57, 1.3 ], @@ -259,7 +259,7 @@ describe('exif node', function() { var data = new Buffer.from("hello"); var eD; var flow = [{id:"exifNode1", type:"exif", wires:[["helperNode1"]]}, - {id:"helperNode1", type:"helper"}]; + {id:"helperNode1", type:"helper"}]; var gpsmsg = { gps: { GPSLatitudeRef: 'N', GPSLatitude: [ 50, 57, 1.3 ], @@ -291,6 +291,4 @@ describe('exif node', function() { }); }); - - }); diff --git a/utility/exif/94-exif.html b/utility/exif/94-exif.html index 3b019849..47c79101 100644 --- a/utility/exif/94-exif.html +++ b/utility/exif/94-exif.html @@ -1,17 +1,22 @@ - - diff --git a/utility/exif/94-exif.js b/utility/exif/94-exif.js index 93ba0b3b..dbddba9f 100644 --- a/utility/exif/94-exif.js +++ b/utility/exif/94-exif.js @@ -11,6 +11,7 @@ module.exports = function(RED) { function ExifNode(n) { RED.nodes.createNode(this,n); + this.property = n.property || "payload"; var node = this; /*** @@ -20,7 +21,7 @@ module.exports = function(RED) { * Assumes that the msg object will always have exifData available as msg.exif. * Assume that the GPS data saved into Exif provides a valid value */ - function addMsgLocationDataFromExifGPSData(msg) { + function addMsgLocationDataFromExifGPSData(msg,val) { var gpsData = msg.exif.gps; // declaring variable purely to make checks more readable if (gpsData.GPSAltitude) { /* istanbul ignore else */ @@ -31,14 +32,12 @@ module.exports = function(RED) { // The data provided in Exif is in degrees, minutes, seconds, this is to be converted into a single floating point degree if (gpsData.GPSLatitude.length === 3) { // OK to convert latitude if (gpsData.GPSLongitude.length === 3) { // OK to convert longitude - var latitude = convertDegreesMinutesSecondsToDecimals(gpsData.GPSLatitude[0], gpsData.GPSLatitude[1], gpsData.GPSLatitude[2]); latitude = Math.round(latitude * 100000)/100000; // 5dp is approx 1m resolution... // (N)orth means positive latitude, (S)outh means negative latitude if (gpsData.GPSLatitudeRef.toString() === 'S' || gpsData.GPSLatitudeRef.toString() === 's') { latitude = latitude * -1; } - var longitude = convertDegreesMinutesSecondsToDecimals(gpsData.GPSLongitude[0], gpsData.GPSLongitude[1], gpsData.GPSLongitude[2]); longitude = Math.round(longitude * 100000)/100000; // 5dp is approx 1m resolution... // (E)ast means positive longitude, (W)est means negative longitude @@ -49,7 +48,6 @@ module.exports = function(RED) { if (!msg.location) { msg.location = {}; } msg.location.lat = latitude; msg.location.lon = longitude; - return; } else { node.log("Invalid longitude data, no location information has been added to the message."); @@ -62,13 +60,32 @@ module.exports = function(RED) { else { node.log("The location of this image cannot be determined safely so no location information has been added to the message."); } + msg.location.arc = { + ranges: [500,1000,2000], + pan: gpsData.GPSImgDirection, + fov: (2 * Math.atan(36 / (2 * msg.exif.exif.FocalLengthIn35mmFormat)) * 180 / Math.PI), + color: '#910000' + } + msg.location.icon = "fa-camera"; + var na; + if (val.hasOwnProperty("name")) { na = val.name; } + else if (msg.hasOwnProperty("filename")) { na = msg.filename.split('/').pop(); } + else { na = msg.exif.image.Make+"_"+msg.exif.image.ModifyDate; } + msg.location.name = na; + msg.location.popup = '' } this.on("input", function(msg) { try { - if (msg.payload) { - if (Buffer.isBuffer(msg.payload)) { - new ExifImage({ image : msg.payload }, function (error, exifData) { + var value = RED.util.getMessageProperty(msg,node.property); + if (value !== undefined) { + if (typeof value === "string") { // it must be a base64 encoded inline image type + if (value.indexOf('data:image') !== -1) { + value = new Buffer.from(value.replace(/^data:image\/[a-z]+;base64,/, ""), 'base64'); + } + } + if (Buffer.isBuffer(value)) { // or a proper jpg buffer + new ExifImage({ image:value }, function (error, exifData) { if (error) { node.log(error.toString()); } @@ -76,7 +93,7 @@ module.exports = function(RED) { if (exifData) { msg.exif = exifData; if ((exifData.hasOwnProperty("gps")) && (Object.keys(exifData.gps).length !== 0)) { - addMsgLocationDataFromExifGPSData(msg); + addMsgLocationDataFromExifGPSData(msg,value); } //else { node.log("The incoming image did not contain Exif GPS data."); } } @@ -93,7 +110,7 @@ module.exports = function(RED) { } } else { - node.error("No payload received, the Exif node cannot proceed, no messages sent.",msg); + node.warn("No input received, the Exif node cannot proceed, no messages sent.",msg); return; } } diff --git a/utility/exif/package.json b/utility/exif/package.json index fec3db6c..5eb5e30b 100644 --- a/utility/exif/package.json +++ b/utility/exif/package.json @@ -1,23 +1,30 @@ { - "name" : "node-red-node-exif", - "version" : "0.0.7", - "description" : "A Node-RED node that extracts Exif information from JPEG image buffers.", - "dependencies" : { - "exif": "0.4.0" + "name": "node-red-node-exif", + "version": "0.1.0", + "description": "A Node-RED node that extracts Exif information from JPEG image buffers.", + "dependencies": { + "exif": "^0.6.0" }, - "repository" : { - "type":"git", - "url":"https://github.com/node-red/node-red-nodes/tree/master/utility/exif" + "repository": { + "type": "git", + "url": "https://github.com/node-red/node-red-nodes/tree/master/utility/exif" }, "license": "Apache-2.0", - "keywords": [ "node-red", "exif"], - "node-red" : { - "nodes" : { + "keywords": [ + "node-red", + "exif" + ], + "node-red": { + "nodes": { "exif": "94-exif.js" } }, "contributors": [ - {"name": "Dave Conway-Jones"}, - {"name": "Zoltan Balogh"} + { + "name": "Dave Conway-Jones" + }, + { + "name": "Zoltan Balogh" + } ] }