image-hash 3.3.9 → 5.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -36,6 +36,27 @@ imageHash('./_95695590_tv039055678.jpg', 16, true, (error, data) => {
36
36
  console.log(data);
37
37
  // 0773063f063f36070e070a070f378e7f1f000fff0fff020103f00ffb0f810ff0
38
38
  });
39
+
40
+ //Buffer
41
+ const fBuffer = fs.readFileSync(__dirname + '/example/_95695591_tv039055678.jpeg');
42
+ imageHash({
43
+ ext: 'image/jpeg',
44
+ data: fBuffer
45
+ }, 16, true, (error, data) => {
46
+ if(error) throw error;
47
+ console.log(data);
48
+ // 0773063f063f36070e070a070f378e7f1f000fff0fff020103f00ffb0f810ff0
49
+ });
50
+
51
+ //Buffer, without ext arg
52
+ const fBuffer = fs.readFileSync(__dirname + '/example/_95695591_tv039055678.jpeg');
53
+ imageHash({
54
+ data: fBuffer
55
+ }, 16, true, (error, data) => {
56
+ if(error) throw error;
57
+ console.log(data);
58
+ // 0773063f063f36070e070a070f378e7f1f000fff0fff020103f00ffb0f810ff0
59
+ });
39
60
  ```
40
61
 
41
62
  ## API
@@ -49,19 +70,35 @@ imageHash(string|object, int, bool, function)
49
70
 
50
71
  ### Image-Hash Arguments
51
72
 
52
- Argument | Type | Description | Mandatory | Example
53
- --- | --- | --- | --- | ---
54
- location | `object` or `string` | A [RequestJS Object](https://github.com/request/request#requestoptions-callback) or `String` with a valid url or file location | Yes | see above
55
- bits | `int` | The number of bits in a row. The more bits, the more unique the hash. | Yes | 8
56
- precise | `bool` | Whether a precision algorithm is used. `true` Precise but slower, non-overlapping blocks. `false` Quick and crude, non-overlapping blocks. Method 2 is recommended as a good tradeoff between speed and good matches on any image size. The quick ones are only advisable when the image width and height are an even multiple of the number of blocks used. | Yes | `true`
57
- callback | `function` | A function with `error` and `data` arguments - see below |
73
+ | Argument | Type | Description | Mandatory | Example |
74
+ | -------- | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------- | --------- |
75
+ | location | `object` or `string` | A [RequestJS Object](https://github.com/request/request#requestoptions-callback), `Buffer` object (See input types below for more details), or `String` with a valid url or file location | Yes | see above |
76
+ | bits | `int` | The number of bits in a row. The more bits, the more unique the hash. | Yes | 8 |
77
+ | precise | `bool` | Whether a precision algorithm is used. `true` Precise but slower, non-overlapping blocks. `false` Quick and crude, non-overlapping blocks. Method 2 is recommended as a good tradeoff between speed and good matches on any image size. The quick ones are only advisable when the image width and height are an even multiple of the number of blocks used. | Yes | `true` |
78
+ | callback | `function` | A function with `error` and `data` arguments - see below |
79
+
80
+ #### Location Object Types
81
+
82
+ ```typescript
83
+ // Url Request Object
84
+ interface UrlRequestObject {
85
+ encoding?: string | null,
86
+ url: string | null,
87
+ };
88
+ // Buffer Object
89
+ interface BufferObject {
90
+ ext?: string, // mime type of buffered file
91
+ data: Buffer,
92
+ name?: string // file name for buffered file
93
+ };
94
+ ```
58
95
 
59
96
  ### Callback Arguments
60
97
 
61
- Argument | Type | Description
62
- --- | --- | --- | --- | ---
63
- error | `Error Object` or `null` | If a run time error is detected this will be an `Error Object`, otherwise `null`
64
- data | `string` or `null` | If there is no run time error, this be will be your hashed result, otherwise `null`
98
+ | Argument | Type | Description |
99
+ | -------- | ------------------------ | ----------------------------------------------------------------------------------- | | |
100
+ | error | `Error Object` or `null` | If a run time error is detected this will be an `Error Object`, otherwise `null` |
101
+ | data | `string` or `null` | If there is no run time error, this be will be your hashed result, otherwise `null` |
65
102
 
66
103
  ## Development
67
104
  I have made this with Typescript, ESLint, Jest, Babel and VSCode. All config files and global binaries are included. For developers using VS Code, make sure you have ESLint extension installed.
@@ -1 +1,11 @@
1
- export declare const imageHash: (oldSrc: any, bits: any, method: any, cb: any) => void;
1
+ /// <reference types="node" />
2
+ export interface UrlRequestObject {
3
+ encoding?: string | null;
4
+ url: string | null;
5
+ }
6
+ export interface BufferObject {
7
+ ext?: string;
8
+ data: Buffer;
9
+ name?: string;
10
+ }
11
+ export declare const imageHash: (oldSrc: string | UrlRequestObject | BufferObject, bits: any, method: any, cb: any) => void;
package/lib/imageHash.js CHANGED
@@ -1,14 +1,25 @@
1
1
  "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
2
10
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
11
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
12
  };
5
13
  Object.defineProperty(exports, "__esModule", { value: true });
6
14
  const fs_1 = __importDefault(require("fs"));
15
+ const buffer_1 = require("buffer");
7
16
  const file_type_1 = __importDefault(require("file-type"));
8
17
  const jpeg_js_1 = __importDefault(require("jpeg-js"));
9
18
  const pngjs_1 = require("pngjs");
10
19
  const request_1 = __importDefault(require("request"));
20
+ const url_1 = require("url");
11
21
  const block_hash_1 = __importDefault(require("./block-hash"));
22
+ const webp_1 = __importDefault(require("@cwasm/webp"));
12
23
  const processPNG = (data, bits, method, cb) => {
13
24
  try {
14
25
  const png = pngjs_1.PNG.sync.read(data);
@@ -29,50 +40,97 @@ const processJPG = (data, bits, method, cb) => {
29
40
  cb(e);
30
41
  }
31
42
  };
43
+ const processWebp = (data, bits, method, cb) => {
44
+ try {
45
+ const decoded = webp_1.default.decode(data);
46
+ const res = block_hash_1.default(decoded, bits, method ? 2 : 1);
47
+ cb(null, res);
48
+ }
49
+ catch (e) {
50
+ cb(e);
51
+ }
52
+ };
53
+ const isUrlRequestObject = (obj) => {
54
+ const casted = obj;
55
+ return casted.url && casted.url.length > 0;
56
+ };
57
+ const isBufferObject = (obj) => {
58
+ const casted = obj;
59
+ return buffer_1.Buffer.isBuffer(casted.data)
60
+ || (buffer_1.Buffer.isBuffer(casted.data) && (casted.ext && casted.ext.length > 0));
61
+ };
32
62
  // eslint-disable-next-line
33
63
  exports.imageHash = (oldSrc, bits, method, cb) => {
34
64
  const src = oldSrc;
35
- const checkFileType = (name, data) => {
36
- // what is the image type
37
- const type = file_type_1.default(data);
38
- if (!type || !type.mime) {
39
- cb(new Error('Mime type not found'));
40
- return;
65
+ const getFileType = (data) => __awaiter(this, void 0, void 0, function* () {
66
+ if (typeof src !== 'string' && isBufferObject(src) && src.ext) {
67
+ return {
68
+ mime: src.ext,
69
+ };
41
70
  }
42
- if (name.lastIndexOf('.') > 0) {
43
- const ext = name
44
- .split('.')
45
- .pop()
46
- .toLowerCase();
47
- if (ext === 'png' && type.mime === 'image/png') {
48
- processPNG(data, bits, method, cb);
71
+ try {
72
+ if (buffer_1.Buffer.isBuffer(data)) {
73
+ return yield file_type_1.default.fromBuffer(data);
49
74
  }
50
- else if ((ext === 'jpg' || ext === 'jpeg') && type.mime === 'image/jpeg') {
51
- processJPG(data, bits, method, cb);
52
- }
53
- else {
54
- cb(new Error(`Unrecognized file extension, mime type or mismatch, ext: ${ext} / mime: ${type.mime}`));
75
+ if (typeof src === 'string') {
76
+ return yield file_type_1.default.fromFile(src);
55
77
  }
78
+ return '';
56
79
  }
57
- else {
58
- console.warn('No file extension found, attempting mime typing.');
59
- if (type.mime === 'image/png') {
60
- processPNG(data, bits, method, cb);
80
+ catch (err) {
81
+ throw err;
82
+ }
83
+ });
84
+ const checkFileType = (name, data) => {
85
+ getFileType(data).then((type) => {
86
+ // what is the image type
87
+ if (!type) {
88
+ cb(new Error('Mime type not found'));
89
+ return;
61
90
  }
62
- else if (type.mime === 'image/jpeg') {
63
- processJPG(data, bits, method, cb);
91
+ if (name && name.lastIndexOf('.') > 0) {
92
+ const ext = name
93
+ .split('.')
94
+ .pop()
95
+ .toLowerCase();
96
+ if (ext === 'png' && type.mime === 'image/png') {
97
+ processPNG(data, bits, method, cb);
98
+ }
99
+ else if ((ext === 'jpg' || ext === 'jpeg') && type.mime === 'image/jpeg') {
100
+ processJPG(data, bits, method, cb);
101
+ }
102
+ else if (ext === 'webp' && type.mime === 'image/webp') {
103
+ processWebp(data, bits, method, cb);
104
+ }
105
+ else {
106
+ cb(new Error(`Unrecognized file extension, mime type or mismatch, ext: ${ext} / mime: ${type}`));
107
+ }
64
108
  }
65
109
  else {
66
- cb(new Error(`Unrecognized mime type: ${type.mime}`));
110
+ console.warn('No file extension found, attempting mime typing.');
111
+ if (type.mime === 'image/png') {
112
+ processPNG(data, bits, method, cb);
113
+ }
114
+ else if (type.mime === 'image/jpeg') {
115
+ processJPG(data, bits, method, cb);
116
+ }
117
+ else if (type.mime === 'image/webp') {
118
+ processWebp(data, bits, method, cb);
119
+ }
120
+ else {
121
+ cb(new Error(`Unrecognized mime type: ${type}`));
122
+ }
67
123
  }
68
- }
124
+ }).catch((err) => {
125
+ cb(err);
126
+ });
69
127
  };
70
128
  const handleRequest = (err, res) => {
71
129
  if (err) {
72
130
  cb(new Error(err));
73
131
  }
74
132
  else {
75
- const url = new URL(res.request.uri.href);
133
+ const url = new url_1.URL(res.request.uri.href);
76
134
  const name = url.pathname;
77
135
  checkFileType(name, res.body);
78
136
  }
@@ -91,7 +149,7 @@ exports.imageHash = (oldSrc, bits, method, cb) => {
91
149
  return;
92
150
  }
93
151
  // is src url or file
94
- if (typeof src === 'string' && src.indexOf('http') === 0) {
152
+ if (typeof src === 'string' && (src.indexOf('http') === 0 || src.indexOf('https') === 0)) {
95
153
  // url
96
154
  const req = {
97
155
  url: src,
@@ -99,7 +157,11 @@ exports.imageHash = (oldSrc, bits, method, cb) => {
99
157
  };
100
158
  request_1.default(req, handleRequest);
101
159
  }
102
- else if (typeof src === 'object') {
160
+ else if (typeof src !== 'string' && isBufferObject(src)) {
161
+ // image buffers
162
+ checkFileType(src.name, src.data);
163
+ }
164
+ else if (typeof src !== 'string' && isUrlRequestObject(src)) {
103
165
  // Request Object
104
166
  src.encoding = null;
105
167
  request_1.default(src, handleRequest);
@@ -1 +1 @@
1
- {"version":3,"file":"imageHash.js","sourceRoot":"","sources":["../src/imageHash.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"imageHash.js","sourceRoot":"","sources":["../src/imageHash.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,12 +1,14 @@
1
1
  {
2
2
  "name": "image-hash",
3
- "version": "3.3.9",
3
+ "version": "5.0.1",
4
4
  "description": "Create a hash from an image",
5
5
  "main": "lib/imageHash.js",
6
6
  "types": "lib/imageHash.d.ts",
7
7
  "scripts": {
8
- "test": "jest",
9
- "build": "tsc"
8
+ "test": "npx mocha -r ts-node/register __tests__/*.test.ts ",
9
+ "build": "tsc",
10
+ "lint": "eslint src/*.ts",
11
+ "lint:fix": "eslint src/*.ts --fix"
10
12
  },
11
13
  "files": [
12
14
  "lib"
@@ -28,26 +30,30 @@
28
30
  },
29
31
  "homepage": "https://github.com/danm/image-hash#readme",
30
32
  "dependencies": {
31
- "file-type": "^9.0.0",
32
- "jpeg-js": "^0.2.0",
33
+ "@cwasm/webp": "^0.1.5",
34
+ "file-type": "^14.6.2",
35
+ "jpeg-js": "^0.4.0",
33
36
  "pngjs": "^3.3.3",
34
37
  "request": "^2.81.0"
35
38
  },
36
39
  "devDependencies": {
40
+ "@types/chai": "^4.2.12",
37
41
  "@babel/cli": "^7.2.3",
38
42
  "@babel/core": "^7.2.2",
39
43
  "@babel/plugin-transform-modules-commonjs": "^7.4.4",
40
44
  "@babel/preset-env": "^7.3.1",
41
45
  "@babel/preset-typescript": "^7.1.0",
42
46
  "@babel/runtime": "^7.3.1",
43
- "@types/jest": "^24.0.12",
47
+ "@types/mocha": "^8.0.0",
44
48
  "@types/node": "^11.13.8",
45
49
  "@typescript-eslint/eslint-plugin": "^1.7.0",
46
50
  "@typescript-eslint/parser": "^1.7.0",
51
+ "chai": "^4.2.0",
47
52
  "eslint": "^5.16.0",
48
53
  "eslint-config-airbnb-typescript": "^3.0.0",
49
54
  "eslint-plugin-import": "^2.17.2",
50
- "jest": "^24.0.0",
55
+ "mocha": "^8.1.0",
56
+ "ts-node": "^8.10.2",
51
57
  "typescript": "^3.3.1"
52
58
  }
53
59
  }