<entry file="file://$PROJECT_DIR$/index.js">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
- <caret line="16" column="38" selection-start-line="16" selection-start-column="25" selection-end-line="16" selection-end-column="38" />
+ <caret line="112" column="3" selection-start-line="112" selection-start-column="3" selection-end-line="112" selection-end-column="3" />
<folding />
</state>
</provider>
<file leaf-file-name="notules.js" pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/1.0.0/routes/notules.js">
<provider selected="true" editor-type-id="text-editor">
- <state vertical-scroll-proportion="0.7075209">
- <caret line="67" column="28" selection-start-line="67" selection-start-column="28" selection-end-line="67" selection-end-column="28" />
+ <state vertical-scroll-proportion="0.44058746">
+ <caret line="53" column="0" selection-start-line="53" selection-start-column="0" selection-end-line="53" selection-end-column="0" />
<folding />
</state>
</provider>
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
+ <PATH>
+ <PATH_ELEMENT>
+ <option name="myItemId" value="amiesserver" />
+ <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
+ </PATH_ELEMENT>
+ <PATH_ELEMENT>
+ <option name="myItemId" value="AM" />
+ <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+ </PATH_ELEMENT>
+ <PATH_ELEMENT>
+ <option name="myItemId" value="node_modules" />
+ <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+ </PATH_ELEMENT>
+ </PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="amiesserver" />
<servers />
</component>
<component name="TimeTrackingManager">
- <option name="totallyTimeSpent" value="51695000" />
+ <option name="totallyTimeSpent" value="51808000" />
</component>
<component name="ToolWindowManager">
<frame x="65" y="-904" width="1375" height="904" extended-state="6" />
<window_info id="Designer" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
<window_info id="Palette" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
<window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
+ <window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Database" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
<window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
<window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
<window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
<window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
- <window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
<window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" />
<window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
</state>
</provider>
</entry>
- <entry file="file://$PROJECT_DIR$/index.js">
- <provider selected="true" editor-type-id="text-editor">
- <state vertical-scroll-proportion="0.0">
- <caret line="16" column="38" selection-start-line="16" selection-start-column="25" selection-end-line="16" selection-end-column="38" />
- <folding />
- </state>
- </provider>
- </entry>
<entry file="file://$PROJECT_DIR$/1.0.0/routes/collectivities.js">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
</state>
</provider>
</entry>
+ <entry file="file://$PROJECT_DIR$/index.js">
+ <provider selected="true" editor-type-id="text-editor">
+ <state vertical-scroll-proportion="0.0">
+ <caret line="112" column="3" selection-start-line="112" selection-start-column="3" selection-end-line="112" selection-end-column="3" />
+ <folding />
+ </state>
+ </provider>
+ </entry>
<entry file="file://$PROJECT_DIR$/1.0.0/routes/notules.js">
<provider selected="true" editor-type-id="text-editor">
- <state vertical-scroll-proportion="0.7075209">
- <caret line="67" column="28" selection-start-line="67" selection-start-column="28" selection-end-line="67" selection-end-column="28" />
+ <state vertical-scroll-proportion="0.44058746">
+ <caret line="53" column="0" selection-start-line="53" selection-start-column="0" selection-end-line="53" selection-end-column="0" />
<folding />
</state>
</provider>
*/
-router.post('/newSend', function(req, res{
-});
--- /dev/null
+# Ignore the binaries folder
+build
+# Ignore wscript lock
+.lock-wscript
+# Test output image
+output.jpg
+# Windows image preview
+Thumbs.db
+
--- /dev/null
+= Graphics Magick =\r
+\r
+This package contains Graphics Magick bindings for node.js.
\ No newline at end of file
--- /dev/null
+{
+ "_args": [
+ [
+ "graphicsmagick",
+ "/home/rdubourget/amiesserver"
+ ]
+ ],
+ "_defaultsLoaded": true,
+ "_engineSupported": true,
+ "_from": "graphicsmagick@latest",
+ "_id": "graphicsmagick@0.0.1",
+ "_inCache": true,
+ "_installable": true,
+ "_location": "/graphicsmagick",
+ "_nodeVersion": "v0.6.8",
+ "_npmUser": {
+ "email": "izaakschroeder@aelatis.com",
+ "name": "izaakschroeder"
+ },
+ "_npmVersion": "1.1.0-2",
+ "_phantomChildren": {},
+ "_requested": {
+ "name": "graphicsmagick",
+ "raw": "graphicsmagick",
+ "rawSpec": "",
+ "scope": null,
+ "spec": "latest",
+ "type": "tag"
+ },
+ "_requiredBy": [
+ "#USER"
+ ],
+ "_resolved": "https://registry.npmjs.org/graphicsmagick/-/graphicsmagick-0.0.1.tgz",
+ "_shasum": "0af95878190dcbd1028e46c13526f5284245bf29",
+ "_shrinkwrap": null,
+ "_spec": "graphicsmagick",
+ "_where": "/home/rdubourget/amiesserver",
+ "author": {
+ "name": "Izaak Schroeder"
+ },
+ "dependencies": {},
+ "description": "Bindings to the graphicsmagick library.",
+ "devDependencies": {},
+ "directories": {},
+ "dist": {
+ "shasum": "0af95878190dcbd1028e46c13526f5284245bf29",
+ "tarball": "https://registry.npmjs.org/graphicsmagick/-/graphicsmagick-0.0.1.tgz"
+ },
+ "engine": "node >= 0.6.0",
+ "engines": {
+ "node": "*"
+ },
+ "maintainers": [
+ {
+ "email": "izaakschroeder@aelatis.com",
+ "name": "izaakschroeder"
+ }
+ ],
+ "name": "graphicsmagick",
+ "optionalDependencies": {},
+ "readme": "ERROR: No README data found!",
+ "scripts": {
+ "preinstall": "node-waf clean || (exit 0); node-waf configure build"
+ },
+ "version": "0.0.1"
+}
--- /dev/null
+var \r
+ graphicsMagick = require('./build/Release/GraphicsMagick'),\r
+ fs = require('fs');\r
+\r
+var inputFile = "test.jpg";\r
+var outputFile = "output.jpg";\r
+\r
+console.log("Opening "+inputFile+"...")\r
+fs.readFile(inputFile, function (err, data) {\r
+ \r
+ if (err) \r
+ throw err;\r
+ \r
+ console.log("Reading image...");\r
+ var inputImage = graphicsMagick.image(data);\r
+ \r
+ console.log("Image has following properties: ");\r
+ console.log("Width: "+inputImage.width);\r
+ console.log("Height: "+inputImage.height);\r
+ \r
+ console.log("Creating output image...");\r
+ var outputImage = inputImage\r
+ .crop(Math.floor(inputImage.width/2 - 200/2), Math.floor(inputImage.height/2 - 200/2), 200, 200)\r
+ .resize(100, 100);\r
+ \r
+ console.log("Creating write stream for "+outputFile+"...");\r
+ var writeStream = fs.createWriteStream(outputFile);\r
+ \r
+ writeStream.on("end", function(){\r
+ console.log("Done.");\r
+ });\r
+ \r
+ console.log("Writing new image data...");\r
+ writeStream.write(outputImage.buffer);\r
+ console.log("Closing stream...");\r
+ writeStream.end();\r
+ \r
+ \r
+ \r
+ \r
+});\r
--- /dev/null
+**.DS_Store
+*.jpg
--- /dev/null
+# node-imagemagick
+
+[Imagemagick](http://www.imagemagick.org/) module for [Node](http://nodejs.org/).
+
+You can install this module using [npm](http://github.com/isaacs/npm):
+
+ npm install imagemagick
+
+Requires imagemagick CLI tools to be installed. There are numerous ways to install them. For instance, if you're on OS X you can use [Homebrew](http://mxcl.github.com/homebrew/): `brew install imagemagick`.
+
+## Example
+
+```javascript
+var im = require('imagemagick');
+im.readMetadata('kittens.jpg', function(err, metadata){
+ if (err) throw err;
+ console.log('Shot at '+metadata.exif.dateTimeOriginal);
+})
+// -> Shot at Tue, 06 Feb 2007 21:13:54 GMT
+```
+
+## API
+
+### convert.path
+
+Path to the `convert` program. Defaults to `"convert"`.
+
+### identify.path
+
+Path to the `identify` program. Defaults to `"identify"`.
+
+### identify(path, callback(err, features))
+
+Identify file at `path` and return an object `features`.
+
+Example:
+
+```javascript
+im.identify('kittens.jpg', function(err, features){
+ if (err) throw err;
+ console.log(features);
+ // { format: 'JPEG', width: 3904, height: 2622, depth: 8 }
+});
+```
+
+### identify(args, callback(err, output))
+
+Custom identification where `args` is an array of arguments. The result is returned as a raw string to `output`.
+
+Example:
+
+```javascript
+im.identify(['-format', '%wx%h', 'kittens.jpg'], function(err, output){
+ if (err) throw err;
+ console.log('dimension: '+output);
+ // dimension: 3904x2622
+});
+```
+
+### readMetadata(path, callback(err, metadata))
+
+Read metadata (i.e. exif) in `path` and return an object `metadata`. Modelled on top of `identify`.
+
+Example:
+
+```javascript
+im.readMetadata('kittens.jpg', function(err, metadata){
+ if (err) throw err;
+ console.log('Shot at '+metadata.exif.dateTimeOriginal);
+ // -> Shot at Tue, 06 Feb 2007 21:13:54 GMT
+});
+```
+
+### convert(args, callback(err, stdout, stderr))
+
+Raw interface to `convert` passing arguments in the array `args`.
+
+Example:
+
+```javascript
+im.convert(['kittens.jpg', '-resize', '25x120', 'kittens-small.jpg'],
+function(err, stdout){
+ if (err) throw err;
+ console.log('stdout:', stdout);
+});
+```
+
+### resize(options, callback(err, stdout, stderr))
+
+Convenience function for resizing an image, modelled on top of `convert`.
+
+The `options` argument have the following default values:
+
+```javascript
+{
+ srcPath: undefined,
+ srcData: null,
+ srcFormat: null,
+ dstPath: undefined,
+ quality: 0.8,
+ format: 'jpg',
+ progressive: false,
+ width: 0,
+ height: 0,
+ strip: true,
+ filter: 'Lagrange',
+ sharpening: 0.2,
+ customArgs: []
+}
+```
+
+srcPath, dstPath and (at least one of) width and height are required. The rest is optional.
+
+Example:
+
+```javascript
+im.resize({
+ srcPath: 'kittens.jpg',
+ dstPath: 'kittens-small.jpg',
+ width: 256
+}, function(err, stdout, stderr){
+ if (err) throw err;
+ console.log('resized kittens.jpg to fit within 256x256px');
+});
+```
+
+Example with stdin/stdout:
+
+```javascript
+var fs = require('fs');
+im.resize({
+ srcData: fs.readFileSync('kittens.jpg', 'binary'),
+ width: 256
+}, function(err, stdout, stderr){
+ if (err) throw err
+ fs.writeFileSync('kittens-resized.jpg', stdout, 'binary');
+ console.log('resized kittens.jpg to fit within 256x256px')
+});
+```
+
+### crop(options, callback) ###
+Convenience function for resizing and cropping an image. _crop_ uses the resize method, so _options_ and _callback_ are the same. _crop_ uses _options.srcPath_, so make sure you set it :) Using only _options.width_ or _options.height_ will create a square dimensioned image. Gravity can also be specified, it defaults to Center. Available gravity options are [NorthWest, North, NorthEast, West, Center, East, SouthWest, South, SouthEast]
+
+Example:
+
+```javascript
+im.crop({
+ srcPath: path,
+ dstPath: 'cropped.jpg',
+ width: 800,
+ height: 600,
+ quality: 1,
+ gravity: "North"
+}, function(err, stdout, stderr){
+ // foo
+});
+```
+
+## License (MIT)
+
+Copyright (c) 2010-2012 Rasmus Andersson <http://hunch.se/>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
--- /dev/null
+var childproc = require('child_process'),
+ EventEmitter = require('events').EventEmitter;
+
+
+function exec2(file, args /*, options, callback */) {
+ var options = { encoding: 'utf8'
+ , timeout: 0
+ , maxBuffer: 500*1024
+ , killSignal: 'SIGKILL'
+ , output: null
+ };
+
+ var callback = arguments[arguments.length-1];
+ if ('function' != typeof callback) callback = null;
+
+ if (typeof arguments[2] == 'object') {
+ var keys = Object.keys(options);
+ for (var i = 0; i < keys.length; i++) {
+ var k = keys[i];
+ if (arguments[2][k] !== undefined) options[k] = arguments[2][k];
+ }
+ }
+
+ var child = childproc.spawn(file, args);
+ var killed = false;
+ var timedOut = false;
+
+ var Wrapper = function(proc) {
+ this.proc = proc;
+ this.stderr = new Accumulator();
+ proc.emitter = new EventEmitter();
+ proc.on = proc.emitter.on.bind(proc.emitter);
+ this.out = proc.emitter.emit.bind(proc.emitter, 'data');
+ this.err = this.stderr.out.bind(this.stderr);
+ this.errCurrent = this.stderr.current.bind(this.stderr);
+ };
+ Wrapper.prototype.finish = function(err) {
+ this.proc.emitter.emit('end', err, this.errCurrent());
+ };
+
+ var Accumulator = function(cb) {
+ this.stdout = {contents: ""};
+ this.stderr = {contents: ""};
+ this.callback = cb;
+
+ var limitedWrite = function(stream) {
+ return function(chunk) {
+ stream.contents += chunk;
+ if (!killed && stream.contents.length > options.maxBuffer) {
+ child.kill(options.killSignal);
+ killed = true;
+ }
+ };
+ };
+ this.out = limitedWrite(this.stdout);
+ this.err = limitedWrite(this.stderr);
+ };
+ Accumulator.prototype.current = function() { return this.stdout.contents; };
+ Accumulator.prototype.errCurrent = function() { return this.stderr.contents; };
+ Accumulator.prototype.finish = function(err) { this.callback(err, this.stdout.contents, this.stderr.contents); };
+
+ var std = callback ? new Accumulator(callback) : new Wrapper(child);
+
+ var timeoutId;
+ if (options.timeout > 0) {
+ timeoutId = setTimeout(function () {
+ if (!killed) {
+ child.kill(options.killSignal);
+ timedOut = true;
+ killed = true;
+ timeoutId = null;
+ }
+ }, options.timeout);
+ }
+
+ child.stdout.setEncoding(options.encoding);
+ child.stderr.setEncoding(options.encoding);
+
+ child.stdout.addListener("data", function (chunk) { std.out(chunk, options.encoding); });
+ child.stderr.addListener("data", function (chunk) { std.err(chunk, options.encoding); });
+
+ var version = process.versions.node.split('.');
+ child.addListener(version[0] == 0 && version[1] < 7 ? "exit" : "close", function (code, signal) {
+ if (timeoutId) clearTimeout(timeoutId);
+ if (code === 0 && signal === null) {
+ std.finish(null);
+ } else {
+ var e = new Error("Command "+(timedOut ? "timed out" : "failed")+": " + std.errCurrent());
+ e.timedOut = timedOut;
+ e.killed = killed;
+ e.code = code;
+ e.signal = signal;
+ std.finish(e);
+ }
+ });
+
+ return child;
+};
+
+
+function parseIdentify(input) {
+ var lines = input.split("\n"),
+ prop = {},
+ props = [prop],
+ prevIndent = 0,
+ indents = [indent],
+ currentLine, comps, indent, i;
+
+ lines.shift(); //drop first line (Image: name.jpg)
+
+ for (i in lines) {
+ currentLine = lines[i];
+ indent = currentLine.search(/\S/);
+ if (indent >= 0) {
+ comps = currentLine.split(': ');
+ if (indent > prevIndent) indents.push(indent);
+ while (indent < prevIndent && props.length) {
+ indents.pop();
+ prop = props.pop();
+ prevIndent = indents[indents.length - 1];
+ }
+ if (comps.length < 2) {
+ props.push(prop);
+ prop = prop[currentLine.split(':')[0].trim().toLowerCase()] = {};
+ } else {
+ prop[comps[0].trim().toLowerCase()] = comps[1].trim()
+ }
+ prevIndent = indent;
+ }
+ }
+ return prop;
+};
+
+exports.identify = function(pathOrArgs, callback) {
+ var isCustom = Array.isArray(pathOrArgs),
+ isData,
+ args = isCustom ? ([]).concat(pathOrArgs) : ['-verbose', pathOrArgs];
+
+ if (typeof args[args.length-1] === 'object') {
+ isData = true;
+ pathOrArgs = args[args.length-1];
+ args[args.length-1] = '-';
+ if (!pathOrArgs.data)
+ throw new Error('first argument is missing the "data" member');
+ } else if (typeof pathOrArgs === 'function') {
+ args[args.length-1] = '-';
+ callback = pathOrArgs;
+ }
+ var proc = exec2(exports.identify.path, args, {timeout:120000}, function(err, stdout, stderr) {
+ var result, geometry;
+ if (!err) {
+ if (isCustom) {
+ result = stdout;
+ } else {
+ result = parseIdentify(stdout);
+ geometry = result['geometry'].split(/x/);
+
+ result.format = result.format.match(/\S*/)[0]
+ result.width = parseInt(geometry[0]);
+ result.height = parseInt(geometry[1]);
+ result.depth = parseInt(result.depth);
+ if (result.quality !== undefined) result.quality = parseInt(result.quality) / 100;
+ }
+ }
+ callback(err, result);
+ });
+ if (isData) {
+ if ('string' === typeof pathOrArgs.data) {
+ proc.stdin.setEncoding('binary');
+ proc.stdin.write(pathOrArgs.data, 'binary');
+ proc.stdin.end();
+ } else {
+ proc.stdin.end(pathOrArgs.data);
+ }
+ }
+ return proc;
+}
+exports.identify.path = 'identify';
+
+function ExifDate(value) {
+ // YYYY:MM:DD HH:MM:SS -> Date(YYYY-MM-DD HH:MM:SS +0000)
+ value = value.split(/ /);
+ return new Date(value[0].replace(/:/g, '-')+' '+
+ value[1]+' +0000');
+}
+
+function exifKeyName(k) {
+ return k.replace(exifKeyName.RE, function(x){
+ if (x.length === 1) return x.toLowerCase();
+ else return x.substr(0,x.length-1).toLowerCase()+x.substr(x.length-1);
+ });
+}
+exifKeyName.RE = /^[A-Z]+/;
+
+var exifFieldConverters = {
+ // Numbers
+ bitsPerSample:Number, compression:Number, exifImageLength:Number,
+ exifImageWidth:Number, exifOffset:Number, exposureProgram:Number,
+ flash:Number, imageLength:Number, imageWidth:Number, isoSpeedRatings:Number,
+ jpegInterchangeFormat:Number, jpegInterchangeFormatLength:Number,
+ lightSource:Number, meteringMode:Number, orientation:Number,
+ photometricInterpretation:Number, planarConfiguration:Number,
+ resolutionUnit:Number, rowsPerStrip:Number, samplesPerPixel:Number,
+ sensingMethod:Number, stripByteCounts:Number, subSecTime:Number,
+ subSecTimeDigitized:Number, subSecTimeOriginal:Number, customRendered:Number,
+ exposureMode:Number, focalLengthIn35mmFilm:Number, gainControl:Number,
+ saturation:Number, sharpness:Number, subjectDistanceRange:Number,
+ subSecTime:Number, subSecTimeDigitized:Number, subSecTimeOriginal:Number,
+ whiteBalance:Number, sceneCaptureType:Number,
+
+ // Dates
+ dateTime:ExifDate, dateTimeDigitized:ExifDate, dateTimeOriginal:ExifDate
+};
+
+exports.readMetadata = function(path, callback) {
+ return exports.identify(['-format', '%[EXIF:*]', path], function(err, stdout) {
+ var meta = {};
+ if (!err) {
+ stdout.split(/\n/).forEach(function(line){
+ var eq_p = line.indexOf('=');
+ if (eq_p === -1) return;
+ var key = line.substr(0, eq_p).replace('/','-'),
+ value = line.substr(eq_p+1).trim(),
+ typekey = 'default';
+ var p = key.indexOf(':');
+ if (p !== -1) {
+ typekey = key.substr(0, p);
+ key = key.substr(p+1);
+ if (typekey === 'exif') {
+ key = exifKeyName(key);
+ var converter = exifFieldConverters[key];
+ if (converter) value = converter(value);
+ }
+ }
+ if (!(typekey in meta)) meta[typekey] = {key:value};
+ else meta[typekey][key] = value;
+ })
+ }
+ callback(err, meta);
+ });
+}
+
+exports.convert = function(args, timeout, callback) {
+ var procopt = {encoding: 'binary'};
+ if (typeof timeout === 'function') {
+ callback = timeout;
+ timeout = 0;
+ } else if (typeof timeout !== 'number') {
+ timeout = 0;
+ }
+ if (timeout && (timeout = parseInt(timeout)) > 0 && !isNaN(timeout))
+ procopt.timeout = timeout;
+ return exec2(exports.convert.path, args, procopt, callback);
+}
+exports.convert.path = 'convert';
+
+var resizeCall = function(t, callback) {
+ var proc = exports.convert(t.args, t.opt.timeout, callback);
+ if (t.opt.srcPath.match(/-$/)) {
+ if ('string' === typeof t.opt.srcData) {
+ proc.stdin.setEncoding('binary');
+ proc.stdin.write(t.opt.srcData, 'binary');
+ proc.stdin.end();
+ } else {
+ proc.stdin.end(t.opt.srcData);
+ }
+ }
+ return proc;
+}
+
+exports.resize = function(options, callback) {
+ var t = exports.resizeArgs(options);
+ return resizeCall(t, callback)
+}
+
+exports.crop = function (options, callback) {
+ if (typeof options !== 'object')
+ throw new TypeError('First argument must be an object');
+ if (!options.srcPath && !options.srcData)
+ throw new TypeError("No srcPath or data defined");
+ if (!options.height && !options.width)
+ throw new TypeError("No width or height defined");
+
+ if (options.srcPath){
+ var args = options.srcPath;
+ } else {
+ var args = {
+ data: options.srcData
+ };
+ }
+
+ exports.identify(args, function(err, meta) {
+ if (err) return callback && callback(err);
+ var t = exports.resizeArgs(options),
+ ignoreArg = false,
+ printNext = false,
+ args = [];
+ t.args.forEach(function (arg) {
+ if (printNext === true){
+ console.log("arg", arg);
+ printNext = false;
+ }
+ // ignoreArg is set when resize flag was found
+ if (!ignoreArg && (arg != '-resize'))
+ args.push(arg);
+ // found resize flag! ignore the next argument
+ if (arg == '-resize'){
+ console.log("resize arg");
+ ignoreArg = true;
+ printNext = true;
+ }
+ if (arg === "-crop"){
+ console.log("crop arg");
+ printNext = true;
+ }
+ // found the argument after the resize flag; ignore it and set crop options
+ if ((arg != "-resize") && ignoreArg) {
+ var dSrc = meta.width / meta.height,
+ dDst = t.opt.width / t.opt.height,
+ resizeTo = (dSrc < dDst) ? ''+t.opt.width+'x' : 'x'+t.opt.height,
+ dGravity = options.gravity ? options.gravity : "Center";
+ args = args.concat([
+ '-resize', resizeTo,
+ '-gravity', dGravity,
+ '-crop', ''+t.opt.width + 'x' + t.opt.height + '+0+0',
+ '+repage'
+ ]);
+ ignoreArg = false;
+ }
+ })
+
+ t.args = args;
+ resizeCall(t, callback);
+ })
+}
+
+exports.resizeArgs = function(options) {
+ var opt = {
+ srcPath: null,
+ srcData: null,
+ srcFormat: null,
+ dstPath: null,
+ quality: 0.8,
+ format: 'jpg',
+ progressive: false,
+ colorspace: null,
+ width: 0,
+ height: 0,
+ strip: true,
+ filter: 'Lagrange',
+ sharpening: 0.2,
+ customArgs: [],
+ timeout: 0
+ }
+
+ // check options
+ if (typeof options !== 'object')
+ throw new Error('first argument must be an object');
+ for (var k in opt) if (k in options) opt[k] = options[k];
+ if (!opt.srcPath && !opt.srcData)
+ throw new Error('both srcPath and srcData are empty');
+
+ // normalize options
+ if (!opt.format) opt.format = 'jpg';
+ if (!opt.srcPath) {
+ opt.srcPath = (opt.srcFormat ? opt.srcFormat +':-' : '-'); // stdin
+ }
+ if (!opt.dstPath)
+ opt.dstPath = (opt.format ? opt.format+':-' : '-'); // stdout
+ if (opt.width === 0 && opt.height === 0)
+ throw new Error('both width and height can not be 0 (zero)');
+
+ // build args
+ var args = [opt.srcPath];
+ if (opt.sharpening > 0) {
+ args = args.concat([
+ '-set', 'option:filter:blur', String(1.0-opt.sharpening)]);
+ }
+ if (opt.filter) {
+ args.push('-filter');
+ args.push(opt.filter);
+ }
+ if (opt.strip) {
+ args.push('-strip');
+ }
+ if (opt.width || opt.height) {
+ args.push('-resize');
+ if (opt.height === 0) args.push(String(opt.width));
+ else if (opt.width === 0) args.push('x'+String(opt.height));
+ else args.push(String(opt.width)+'x'+String(opt.height));
+ }
+ opt.format = opt.format.toLowerCase();
+ var isJPEG = (opt.format === 'jpg' || opt.format === 'jpeg');
+ if (isJPEG && opt.progressive) {
+ args.push('-interlace');
+ args.push('plane');
+ }
+ if (isJPEG || opt.format === 'png') {
+ args.push('-quality');
+ args.push(Math.round(opt.quality * 100.0).toString());
+ }
+ else if (opt.format === 'miff' || opt.format === 'mif') {
+ args.push('-quality');
+ args.push(Math.round(opt.quality * 9.0).toString());
+ }
+ if (opt.colorspace) {
+ args.push('-colorspace');
+ args.push(opt.colorspace);
+ }
+ if (Array.isArray(opt.customArgs) && opt.customArgs.length)
+ args = args.concat(opt.customArgs);
+ args.push(opt.dstPath);
+
+ return {opt:opt, args:args};
+}
--- /dev/null
+{
+ "name": "imagemagick",
+ "description": "A wrapper around the imagemagick cli",
+ "version": "0.1.3",
+ "author": {
+ "name": "Rasmus Andersson",
+ "email": "http://rsms.me/"
+ },
+ "licenses": [
+ "MIT"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "http://github.com/rsms/node-imagemagick.git"
+ },
+ "engine": [
+ "node >=0.6"
+ ],
+ "main": "imagemagick",
+ "_id": "imagemagick@0.1.3",
+ "dist": {
+ "shasum": "7483cea093b4d9f2e2f396857adc8821b537c56a",
+ "tarball": "https://registry.npmjs.org/imagemagick/-/imagemagick-0.1.3.tgz"
+ },
+ "_npmVersion": "1.1.59",
+ "_npmUser": {
+ "name": "rsms",
+ "email": "rasmus@notion.se"
+ },
+ "maintainers": [
+ {
+ "name": "rsms",
+ "email": "rasmus@notion.se"
+ }
+ ],
+ "directories": {},
+ "_shasum": "7483cea093b4d9f2e2f396857adc8821b537c56a",
+ "_resolved": "https://registry.npmjs.org/imagemagick/-/imagemagick-0.1.3.tgz",
+ "_from": "imagemagick@latest"
+}
--- /dev/null
+var fs = require('fs'),
+ im = require('./imagemagick');
+
+var path = __dirname+'/sample-images/blue-bottle-coffee.jpg';
+
+(function () {
+ var opt, timeStarted = new Date;
+ im.crop(opt = {
+ srcPath: path,
+ dstPath: 'cropped.jpg',
+ width: 200,
+ height: 90,
+ quality: 1
+ }, function (err, stdout, stderr){
+ if (err) return console.error(err.stack || err);
+ console.log('crop(',opt,') ->', stdout);
+ console.log('Real time spent: '+(new Date() - timeStarted) + ' ms');
+ });
+})();
+
+(function () {
+ var opt, timeStarted = new Date;
+ im.crop(opt = {
+ srcPath: path,
+ dstPath: 'cropped2.jpg',
+ width: 200,
+ height: 90,
+ gravity: "North",
+ quality: 1
+ }, function (err, stdout, stderr){
+ if (err) return console.error(err.stack || err);
+ console.log('crop(',opt,') ->', stdout);
+ console.log('Real time spent: '+(new Date() - timeStarted) + ' ms');
+ });
+})();
--- /dev/null
+var fs = require('fs'),
+ im = require('./imagemagick');
+
+var path = __dirname+'/sample-images/blue-bottle-coffee.jpg';
+var imdata = fs.readFileSync(path, 'binary');
+
+im.identify(path, function (err, features){
+ if (err) return console.error(err.stack || err);
+ console.log('identify(path) ->', features);
+})
+
+im.identify({data:imdata}, function (err, features){
+ if (err) return console.error(err.stack || err);
+ console.log('identify({data:imdata}) ->', features);
+})
+
+im.readMetadata(path, function (err, metadata){
+ if (err) return console.error(err.stack || err);
+ console.log('readMetadata(path) ->', metadata);
+})
+
+im.readMetadata({data:imdata}, function (err, metadata){
+ if (err) return console.error(err.stack || err);
+ console.log('readMetadata({data:imdata} ->', metadata);
+})
+
+var timeStarted = new Date;
+im.resize({
+ srcPath: path,
+ dstPath: 'test-resized.jpg',
+ width: 256
+}, function (err, stdout, stderr){
+ if (err) return console.error(err.stack || err);
+ console.log('resize(...) wrote "test-resized.jpg"');
+ console.log('real time taken for convert: '+((new Date)-timeStarted)+' ms');
+ im.identify(['-format', '%b', 'test-resized.jpg'], function (err, r){
+ if (err) throw err;
+ console.log("identify(['-format', '%b', 'test-resized.jpg']) ->", r);
+ })
+})
+
+timeStarted = new Date;
+im.resize({
+ srcData: imdata,
+ width: 256
+}, function (err, stdout, stderr){
+ if (err) return console.error(err.stack || err);
+ console.log('real time taken for convert (with buffers): '+
+ ((new Date)-timeStarted)+' ms');
+ fs.writeFileSync('test-resized-io.jpg', stdout, 'binary');
+ console.log('resize(...) wrote "test-resized.jpg" ('+stdout.length+' Bytes)');
+})
--- /dev/null
+0 info it worked if it ends with ok
+1 verbose cli [ '/usr/bin/nodejs', '/usr/bin/npm', 'install', 'graphicsmagick' ]
+2 info using npm@2.15.5
+3 info using node@v4.4.5
+4 verbose install initial load of /var/www/amiesserver/package.json
+5 warn package.json amies@1.0.0 No description
+6 warn package.json amies@1.0.0 No repository field.
+7 warn package.json amies@1.0.0 No README data
+8 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/accepts/package.json
+9 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/ansi-regex/package.json
+10 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/ansi-styles/package.json
+11 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/ap/package.json
+12 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/array-flatten/package.json
+13 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/array-parallel/package.json
+14 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/array-series/package.json
+15 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/async/package.json
+16 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/babel-runtime/package.json
+17 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/balanced-match/package.json
+18 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/base64-url/package.json
+19 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/base64url/package.json
+20 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/basic-auth/package.json
+21 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/bluebird/package.json
+22 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/body-parser/package.json
+23 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/bookshelf/package.json
+24 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/brace-expansion/package.json
+25 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/buffer-equal-constant-time/package.json
+26 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/buffer-writer/package.json
+27 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/bytes/package.json
+28 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/camelcase/package.json
+29 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/camelcase-keys/package.json
+30 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/chalk/package.json
+31 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/charenc/package.json
+32 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/colors/package.json
+33 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/commander/package.json
+34 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/concat-map/package.json
+35 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/concat-stream/package.json
+36 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/content-disposition/package.json
+37 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/content-type/package.json
+38 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/cookie/package.json
+39 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/cookie-signature/package.json
+40 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/core-js/package.json
+41 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/core-util-is/package.json
+42 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/create-error/package.json
+43 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/crypt/package.json
+44 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/cycle/package.json
+45 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/debug/package.json
+46 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/depd/package.json
+47 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/destroy/package.json
+48 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/double-ended-queue/package.json
+49 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/ecdsa-sig-formatter/package.json
+50 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/ee-first/package.json
+51 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/escape-html/package.json
+52 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/escape-string-regexp/package.json
+53 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/etag/package.json
+54 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/express/package.json
+55 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/extend/package.json
+56 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/eyes/package.json
+57 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/finalhandler/package.json
+58 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/findup-sync/package.json
+59 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/flagged-respawn/package.json
+60 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/forwarded/package.json
+61 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/fresh/package.json
+62 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/generic-pool/package.json
+63 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/get-stdin/package.json
+64 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/glob/package.json
+65 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/gm/package.json
+66 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/graceful-readlink/package.json
+67 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/has-ansi/package.json
+68 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/hashmap/package.json
+69 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/hoek/package.json
+70 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/http-errors/package.json
+71 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/iconv-lite/package.json
+72 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/imagemagick/package.json
+73 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/indent-string/package.json
+74 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/inflection/package.json
+75 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/inflight/package.json
+76 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/inherits/package.json
+77 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/interpret/package.json
+78 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/ipaddr.js/package.json
+79 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/is-finite/package.json
+80 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/isarray/package.json
+81 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/isemail/package.json
+82 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/isstream/package.json
+83 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/joi/package.json
+84 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/jsonwebtoken/package.json
+85 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/jwa/package.json
+86 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/jws/package.json
+87 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/knex/package.json
+88 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/liftoff/package.json
+89 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/lodash/package.json
+90 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/map-obj/package.json
+91 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/media-typer/package.json
+92 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/meow/package.json
+93 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/merge-descriptors/package.json
+94 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/methods/package.json
+95 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/mime/package.json
+96 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/mime-db/package.json
+97 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/mime-types/package.json
+98 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/minimatch/package.json
+99 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/minimist/package.json
+100 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/mkdirp/package.json
+101 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/moment/package.json
+102 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/morgan/package.json
+103 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/ms/package.json
+104 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/negotiator/package.json
+105 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/node-rest-client/package.json
+106 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/number-is-nan/package.json
+107 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/object-assign/package.json
+108 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/on-finished/package.json
+109 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/on-headers/package.json
+110 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/once/package.json
+111 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/packet-reader/package.json
+112 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/parseurl/package.json
+113 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/path-is-absolute/package.json
+114 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/path-to-regexp/package.json
+115 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/pg/package.json
+116 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/pg-connection-string/package.json
+117 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/pg-types/package.json
+118 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/pgpass/package.json
+119 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/pkginfo/package.json
+120 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/pool2/package.json
+121 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/postgres-array/package.json
+122 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/postgres-bytea/package.json
+123 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/postgres-date/package.json
+124 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/postgres-interval/package.json
+125 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/proxy-addr/package.json
+126 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/qs/package.json
+127 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/range-parser/package.json
+128 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/raw-body/package.json
+129 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/readable-stream/package.json
+130 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/rechoir/package.json
+131 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/regenerator-runtime/package.json
+132 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/repeating/package.json
+133 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/resolve/package.json
+134 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/sax/package.json
+135 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/semver/package.json
+136 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/send/package.json
+137 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/serve-static/package.json
+138 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/sha1/package.json
+139 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/simple-backoff/package.json
+140 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/split/package.json
+141 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/squel/package.json
+142 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/stack-trace/package.json
+143 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/statuses/package.json
+144 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/string_decoder/package.json
+145 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/strip-ansi/package.json
+146 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/supports-color/package.json
+147 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/through/package.json
+148 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/tildify/package.json
+149 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/topo/package.json
+150 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/type-is/package.json
+151 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/typedarray/package.json
+152 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/unpipe/package.json
+153 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/user-home/package.json
+154 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/utils-merge/package.json
+155 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/v8flags/package.json
+156 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/vary/package.json
+157 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/winston/package.json
+158 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/wrappy/package.json
+159 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/xml2js/package.json
+160 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/xmlbuilder/package.json
+161 verbose installManyTop reading scoped package data from /var/www/amiesserver/node_modules/xtend/package.json
+162 info package.json ap@0.2.0 license should be a valid SPDX license expression
+163 info package.json charenc@0.0.1 No license field.
+164 info package.json crypt@0.0.1 No license field.
+165 info package.json cycle@1.0.3 No license field.
+166 info package.json eyes@0.1.8 No repository field.
+167 info package.json eyes@0.1.8 No license field.
+168 info package.json findup-sync@0.3.0 No license field.
+169 info package.json flagged-respawn@0.3.2 No license field.
+170 info package.json mime@1.3.4 No license field.
+171 info package.json ms@0.7.1 No license field.
+172 info package.json rechoir@0.6.2 No license field.
+173 info package.json squel@5.2.1 No license field.
+174 info package.json stack-trace@0.0.9 No license field.
+175 info package.json string_decoder@0.10.31 string_decoder is also the name of a node core module.
+176 info package.json utils-merge@1.0.0 No license field.
+177 info package.json v8flags@2.0.11 No license field.
+178 info package.json imagemagick@0.1.3 No license field.
+179 verbose readDependencies loading dependencies from /var/www/amiesserver/package.json
+180 silly cache add args [ 'graphicsmagick', null ]
+181 verbose cache add spec graphicsmagick
+182 silly cache add parsed spec Result {
+182 silly cache add raw: 'graphicsmagick',
+182 silly cache add scope: null,
+182 silly cache add name: 'graphicsmagick',
+182 silly cache add rawSpec: '',
+182 silly cache add spec: 'latest',
+182 silly cache add type: 'tag' }
+183 silly addNamed graphicsmagick@latest
+184 verbose addNamed "latest" is being treated as a dist-tag for graphicsmagick
+185 info addNameTag [ 'graphicsmagick', 'latest' ]
+186 silly mapToRegistry name graphicsmagick
+187 silly mapToRegistry using default registry
+188 silly mapToRegistry registry https://registry.npmjs.org/
+189 silly mapToRegistry data Result {
+189 silly mapToRegistry raw: 'graphicsmagick',
+189 silly mapToRegistry scope: null,
+189 silly mapToRegistry name: 'graphicsmagick',
+189 silly mapToRegistry rawSpec: '',
+189 silly mapToRegistry spec: 'latest',
+189 silly mapToRegistry type: 'tag' }
+190 silly mapToRegistry uri https://registry.npmjs.org/graphicsmagick
+191 verbose addNameTag registry:https://registry.npmjs.org/graphicsmagick not in flight; fetching
+192 verbose request uri https://registry.npmjs.org/graphicsmagick
+193 verbose request no auth needed
+194 info attempt registry request try #1 at 19:00:48
+195 verbose request id 6b2159a79d2be8c0
+196 verbose etag "2LXYCD85N7Y9NXZV18HYVFW7G"
+197 http request GET https://registry.npmjs.org/graphicsmagick
+198 http 304 https://registry.npmjs.org/graphicsmagick
+199 verbose headers { date: 'Sat, 11 Jun 2016 17:00:48 GMT',
+199 verbose headers via: '1.1 varnish',
+199 verbose headers 'cache-control': 'max-age=300',
+199 verbose headers etag: '"2LXYCD85N7Y9NXZV18HYVFW7G"',
+199 verbose headers age: '36',
+199 verbose headers connection: 'keep-alive',
+199 verbose headers 'x-served-by': 'cache-ams4134-AMS',
+199 verbose headers 'x-cache': 'HIT',
+199 verbose headers 'x-cache-hits': '1',
+199 verbose headers 'x-timer': 'S1465664448.622451,VS0,VE0',
+199 verbose headers vary: 'Accept-Encoding' }
+200 silly get cb [ 304,
+200 silly get { date: 'Sat, 11 Jun 2016 17:00:48 GMT',
+200 silly get via: '1.1 varnish',
+200 silly get 'cache-control': 'max-age=300',
+200 silly get etag: '"2LXYCD85N7Y9NXZV18HYVFW7G"',
+200 silly get age: '36',
+200 silly get connection: 'keep-alive',
+200 silly get 'x-served-by': 'cache-ams4134-AMS',
+200 silly get 'x-cache': 'HIT',
+200 silly get 'x-cache-hits': '1',
+200 silly get 'x-timer': 'S1465664448.622451,VS0,VE0',
+200 silly get vary: 'Accept-Encoding' } ]
+201 verbose etag https://registry.npmjs.org/graphicsmagick from cache
+202 verbose get saving graphicsmagick to /home/rdubourget/.npm/registry.npmjs.org/graphicsmagick/.cache.json
+203 verbose correctMkdir /home/rdubourget/.npm correctMkdir not in flight; initializing
+204 silly addNameTag next cb for graphicsmagick with tag latest
+205 silly addNamed graphicsmagick@0.0.1
+206 verbose addNamed "0.0.1" is a plain semver version for graphicsmagick
+207 silly cache afterAdd graphicsmagick@0.0.1
+208 verbose afterAdd /home/rdubourget/.npm/graphicsmagick/0.0.1/package/package.json not in flight; writing
+209 verbose correctMkdir /home/rdubourget/.npm correctMkdir not in flight; initializing
+210 verbose afterAdd /home/rdubourget/.npm/graphicsmagick/0.0.1/package/package.json written
+211 silly install resolved [ { name: 'graphicsmagick',
+211 silly install resolved description: 'Bindings to the graphicsmagick library.',
+211 silly install resolved version: '0.0.1',
+211 silly install resolved author: { name: 'Izaak Schroeder' },
+211 silly install resolved engine: 'node >= 0.6.0',
+211 silly install resolved _npmUser: { name: 'izaakschroeder', email: 'izaakschroeder@aelatis.com' },
+211 silly install resolved _id: 'graphicsmagick@0.0.1',
+211 silly install resolved scripts: { preinstall: 'node-waf clean || (exit 0); node-waf configure build' },
+211 silly install resolved dependencies: {},
+211 silly install resolved devDependencies: {},
+211 silly install resolved optionalDependencies: {},
+211 silly install resolved engines: { node: '*' },
+211 silly install resolved _engineSupported: true,
+211 silly install resolved _npmVersion: '1.1.0-2',
+211 silly install resolved _nodeVersion: 'v0.6.8',
+211 silly install resolved _defaultsLoaded: true,
+211 silly install resolved dist:
+211 silly install resolved { shasum: '0af95878190dcbd1028e46c13526f5284245bf29',
+211 silly install resolved tarball: 'https://registry.npmjs.org/graphicsmagick/-/graphicsmagick-0.0.1.tgz' },
+211 silly install resolved readme: 'ERROR: No README data found!',
+211 silly install resolved maintainers: [ [Object] ],
+211 silly install resolved directories: {},
+211 silly install resolved _shasum: '0af95878190dcbd1028e46c13526f5284245bf29',
+211 silly install resolved _resolved: 'https://registry.npmjs.org/graphicsmagick/-/graphicsmagick-0.0.1.tgz',
+211 silly install resolved _from: 'graphicsmagick@latest' } ]
+212 info install graphicsmagick@0.0.1 into /var/www/amiesserver
+213 info installOne graphicsmagick@0.0.1
+214 verbose installOne of graphicsmagick to /var/www/amiesserver not in flight; installing
+215 verbose correctMkdir /home/rdubourget/.npm/_locks correctMkdir not in flight; initializing
+216 verbose lock using /home/rdubourget/.npm/_locks/graphicsmagick-2bbddd8a9360ceb2.lock for /var/www/amiesserver/node_modules/graphicsmagick
+217 silly install write writing graphicsmagick 0.0.1 to /var/www/amiesserver/node_modules/graphicsmagick
+218 verbose unbuild node_modules/graphicsmagick
+219 silly gentlyRm /var/www/amiesserver/node_modules/graphicsmagick is being purged from base /var/www/amiesserver
+220 verbose gentlyRm don't care about contents; nuking /var/www/amiesserver/node_modules/graphicsmagick
+221 verbose tar unpack /home/rdubourget/.npm/graphicsmagick/0.0.1/package.tgz
+222 verbose tar unpacking to /var/www/amiesserver/node_modules/graphicsmagick
+223 silly gentlyRm /var/www/amiesserver/node_modules/graphicsmagick is being purged
+224 verbose gentlyRm don't care about contents; nuking /var/www/amiesserver/node_modules/graphicsmagick
+225 silly gunzTarPerm modes [ '755', '644' ]
+226 silly gunzTarPerm extractEntry wscript
+227 silly gunzTarPerm extractEntry GraphicsMagick.cc
+228 silly gunzTarPerm extractEntry README.creole
+229 silly gunzTarPerm extractEntry test.jpg
+230 silly gunzTarPerm extractEntry .npmignore
+231 silly gunzTarPerm extractEntry build/
+232 silly gunzTarPerm extractEntry build/.wafpickle-7
+233 silly gunzTarPerm extractEntry test.js
+234 silly gunzTarPerm extractEntry package.json
+235 verbose write writing to /var/www/amiesserver/node_modules/graphicsmagick/package.json
+236 info preinstall graphicsmagick@0.0.1
+237 verbose unsafe-perm in lifecycle false
+238 info graphicsmagick@0.0.1 Failed to exec preinstall script
+239 verbose unlock done using /home/rdubourget/.npm/_locks/graphicsmagick-2bbddd8a9360ceb2.lock for /var/www/amiesserver/node_modules/graphicsmagick
+240 verbose stack Error: graphicsmagick@0.0.1 preinstall: `node-waf clean || (exit 0); node-waf configure build`
+240 verbose stack spawn ENOENT
+240 verbose stack at ChildProcess.<anonymous> (/usr/lib/node_modules/npm/lib/utils/spawn.js:17:16)
+240 verbose stack at emitTwo (events.js:87:13)
+240 verbose stack at ChildProcess.emit (events.js:172:7)
+240 verbose stack at maybeClose (internal/child_process.js:827:16)
+240 verbose stack at Process.ChildProcess._handle.onexit (internal/child_process.js:211:5)
+241 verbose pkgid graphicsmagick@0.0.1
+242 verbose cwd /var/www/amiesserver
+243 error Linux 3.19.0-59-generic
+244 error argv "/usr/bin/nodejs" "/usr/bin/npm" "install" "graphicsmagick"
+245 error node v4.4.5
+246 error npm v2.15.5
+247 error file sh
+248 error code ELIFECYCLE
+249 error errno ENOENT
+250 error syscall spawn
+251 error graphicsmagick@0.0.1 preinstall: `node-waf clean || (exit 0); node-waf configure build`
+251 error spawn ENOENT
+252 error Failed at the graphicsmagick@0.0.1 preinstall script 'node-waf clean || (exit 0); node-waf configure build'.
+252 error This is most likely a problem with the graphicsmagick package,
+252 error not with npm itself.
+252 error Tell the author that this fails on your system:
+252 error node-waf clean || (exit 0); node-waf configure build
+252 error You can get information on how to open an issue for this project with:
+252 error npm bugs graphicsmagick
+252 error Or if that isn't available, you can get their info via:
+252 error
+252 error npm owner ls graphicsmagick
+252 error There is likely additional logging output above.
+253 verbose exit [ 1, true ]
+254 verbose unbuild node_modules/graphicsmagick
+255 info preuninstall graphicsmagick@0.0.1
+256 info uninstall graphicsmagick@0.0.1
+257 verbose unbuild rmStuff graphicsmagick@0.0.1 from /var/www/amiesserver/node_modules
+258 info postuninstall graphicsmagick@0.0.1
+259 silly gentlyRm /var/www/amiesserver/node_modules/graphicsmagick is being purged from base /var/www/amiesserver
+260 verbose gentlyRm don't care about contents; nuking /var/www/amiesserver/node_modules/graphicsmagick
+261 silly vacuum-fs purging /var/www/amiesserver/node_modules/graphicsmagick
+262 silly vacuum-fs quitting because other entries in /var/www/amiesserver/node_modules