added output image resize
[node-red-contrib-onvif.git] / onvif / snapshot.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
module.exports = (RED) => {
    "use strict";
    let onvif = require("node-onvif");
 
    function snapshot(config) {
        RED.nodes.createNode(this, config);
        let node = this;
 
        node.on("input", function (msg) {
            try {
                let _msg = JSON.parse(msg.payload);
                if (typeof _msg === "object") {
                    if(_msg.hasOwnProperty("name")) {
                        msg.name = _msg.name;
                    }
                    if(_msg.hasOwnProperty("url")) {
                        msg.url = _msg.url;
                    }
                    if(_msg.hasOwnProperty("username")) {
                        msg.username = _msg.username;
                    }
                    if(_msg.hasOwnProperty("password")) {
                        msg.password = _msg.password;
                    }
                }
            }
            catch (ex) {}
 
            config.name     = msg.name || config.name;
            config.url      = msg.url || config.url;
            config.username = msg.username || config.username;
            config.password = msg.password || config.password;
 
            if(msg.hasOwnProperty("payload")) {
                msg._payload = msg.payload;
            }
            msg.node = this.type;
 
            run(msg, node, config);
        });
 
        if (!config.url) {
            node.warn("No URL is specified. Please specify in node configuration.");
            return;
        }
    }
    RED.nodes.registerType("ONVIF Snapshot", snapshot);
 
    function run(msg, node, config) {
        let onvifInstance = new onvif.OnvifDevice({
            xaddr: config.url,
            user : config.username,
            pass : config.password
        });
 
        onvifInstance.init().then((info) => {
            node.log('Fetching snapshot from ' + config.url);
            return onvifInstance.fetchSnapshot();
        }).then((res) => {
            let prefix = 'data:' + res.headers['content-type'] + ';base64,';
            let base64Image = Buffer.from(res.body, 'binary').toString('base64');
            msg.payload = {
                config: config,
                image: {
                    base64: (prefix + base64Image),
                    binary: res.body
                }
            };
            node.send(msg);
        }).catch((error) => {
            msg.payload = null;
            msg.error = error;
            node.send(msg);
        });
    }
}
 
comments