From 8d34291c1de1598e8ef3c1c3c644cdc2070e8052 Mon Sep 17 00:00:00 2001 From: wx-chevalier Date: Fri, 19 Jun 2020 17:16:58 +0800 Subject: [PATCH] feat: update articles or snippets --- docs/README.md | 1 + node-desktop-capturer/.gitignore | 31 ++++++ node-desktop-capturer/.npmignore | 33 ++++++ node-desktop-capturer/LICENSE | 22 ++++ node-desktop-capturer/README.md | 64 +++++++++++ node-desktop-capturer/capture/bin/nircmd.exe | Bin 0 -> 44032 bytes .../capture/bin/scrot/LICENSE | 12 +++ node-desktop-capturer/capture/bin/scrot/scrot | Bin 0 -> 27928 bytes node-desktop-capturer/capture/darwin.js | 59 +++++++++++ node-desktop-capturer/capture/linux.js | 17 +++ node-desktop-capturer/capture/win32.js | 18 ++++ node-desktop-capturer/module.js | 100 ++++++++++++++++++ node-desktop-capturer/package.json | 19 ++++ websocket-proxy/README.md | 1 + 14 files changed, 377 insertions(+) create mode 100644 docs/README.md create mode 100644 node-desktop-capturer/.gitignore create mode 100644 node-desktop-capturer/.npmignore create mode 100644 node-desktop-capturer/LICENSE create mode 100755 node-desktop-capturer/README.md create mode 100755 node-desktop-capturer/capture/bin/nircmd.exe create mode 100644 node-desktop-capturer/capture/bin/scrot/LICENSE create mode 100755 node-desktop-capturer/capture/bin/scrot/scrot create mode 100644 node-desktop-capturer/capture/darwin.js create mode 100755 node-desktop-capturer/capture/linux.js create mode 100755 node-desktop-capturer/capture/win32.js create mode 100755 node-desktop-capturer/module.js create mode 100755 node-desktop-capturer/package.json create mode 100644 websocket-proxy/README.md diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..ee933a7 --- /dev/null +++ b/docs/README.md @@ -0,0 +1 @@ +# Electron 模板:远程控制、进程/数据监控、软件/服务管理、网页插件 diff --git a/node-desktop-capturer/.gitignore b/node-desktop-capturer/.gitignore new file mode 100644 index 0000000..cb4e535 --- /dev/null +++ b/node-desktop-capturer/.gitignore @@ -0,0 +1,31 @@ +# Created by .ignore support plugin (hsz.mobi) +### Node template +# Logs +logs +*.log + +# Runtime data +pids +*.pid +*.seed + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directory +# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git +node_modules + + diff --git a/node-desktop-capturer/.npmignore b/node-desktop-capturer/.npmignore new file mode 100644 index 0000000..8962746 --- /dev/null +++ b/node-desktop-capturer/.npmignore @@ -0,0 +1,33 @@ +# Created by .ignore support plugin (hsz.mobi) +### Node template +# Logs +logs +*.log + +# Runtime data +pids +*.pid +*.seed + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directory +# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git +node_modules + +# IntelliJ +.idea +*.iml \ No newline at end of file diff --git a/node-desktop-capturer/LICENSE b/node-desktop-capturer/LICENSE new file mode 100644 index 0000000..f9dfd77 --- /dev/null +++ b/node-desktop-capturer/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2015 johnvmt + +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. + diff --git a/node-desktop-capturer/README.md b/node-desktop-capturer/README.md new file mode 100755 index 0000000..b0a7b99 --- /dev/null +++ b/node-desktop-capturer/README.md @@ -0,0 +1,64 @@ +# node-node-desktop-capturer + +Take a screenshot of the computer on which Node is running, using platform-specific external tools included with the package. + +Supports Windows (win32), OSX (darwin) and Linux platforms + +- Windows version uses nircmd (http://nircmd.nirsoft.net) +- Linux version uses scrot + +## How to install + +This is a forked version of a module, so to install it in your project use `yarn add https://github.com/jhotujec/node-node-desktop-capturer` + +## Available Options + +- quality: JPEG quality (0 to 100) +- width: use in conjunction with height, or by itself to maintain aspect ratio +- height: use in conjunction with width, or by itself to maintain aspect ratio + +## Examples + +### Full resolution + +```js +var screenshot = require("node-desktop-capturer"); + +screenshot("screenshot.png", function (error, complete) { + if (error) console.log("Screenshot failed", error); + else console.log("Screenshot succeeded"); +}); +``` + +### Resize to 400px wide, maintain aspect ratio + +```js +var screenshot = require("node-desktop-capturer"); + +screenshot("screenshot.png", { width: 400 }, function (error, complete) { + if (error) console.log("Screenshot failed", error); + else console.log("Screenshot succeeded"); +}); +``` + +### Resize to 400x300, set JPG quality to 60% + +```js +var screenshot = require("node-desktop-capturer"); + +screenshot( + "screenshot.jpg", + { width: 400, height: 300, quality: 60 }, + function (error, complete) { + if (error) console.log("Screenshot failed", error); + else console.log("Screenshot succeeded"); + } +); +``` + +## TODOs + +- Tests +- Multi-screen support +- Cropping +- Return contents of image, rather than writing file diff --git a/node-desktop-capturer/capture/bin/nircmd.exe b/node-desktop-capturer/capture/bin/nircmd.exe new file mode 100755 index 0000000000000000000000000000000000000000..54f843685c2bf8af105dec83e6ea91aef9daa702 GIT binary patch literal 44032 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 P&gC16PXrnjr?&sUfcQLr literal 0 HcmV?d00001 diff --git a/node-desktop-capturer/capture/darwin.js b/node-desktop-capturer/capture/darwin.js new file mode 100644 index 0000000..a71a55b --- /dev/null +++ b/node-desktop-capturer/capture/darwin.js @@ -0,0 +1,59 @@ +module.exports = function(options, callback) { + var path = require('path'); + var fs = require('fs'); + var childProcess = require('child_process'); + + // due to bug in jpgjs processing OSX jpg images https://github.com/notmasteryet/jpgjs/issues/34 + // when requesting JPG capture as PNG, so JIMP can read it + var ext = extension(options.output); + if(ext === "jpeg" || ext === "jpg") { + options.intermediate = path.resolve(path.join(__dirname.replace('app.asar', 'app.asar.unpacked'), uniqueId() + ".png")); // create an intermediate file that can be processed, then deleted + capture(options.intermediate, callbackReturn); + } + else + capture(options.output, callbackReturn); // when jpegjs bug fixed, only need this line + + function callbackReturn(error, success) { + // called from capture + // callback with options, in case options added + callback(error, options); + } + + function uniqueId() { + function s4() { + return Math.floor((1 + Math.random()) * 0x10000) + .toString(16) + .substring(1); + } + return s4() + s4() + '-' + s4() + '-' + s4() + '-' + + s4() + '-' + s4() + s4() + s4(); + } + + function extension(file) { + return path.extname(file).toLowerCase().substring(1); + } + + function capture(output, callback) { + var cmd = "screencapture"; + var args = [ + // will create PNG by default + "-t", + path.extname(output).toLowerCase().substring(1), + "-x", + output + ]; + + var captureChild = childProcess.spawn(cmd, args); + + captureChild.on('close', function(error) { + if (error) + callback(error.toString()); + else + callback(); + }); + + captureChild.stderr.on('data', function(data) { + callback(data.toString()); + }); + } +}; \ No newline at end of file diff --git a/node-desktop-capturer/capture/linux.js b/node-desktop-capturer/capture/linux.js new file mode 100755 index 0000000..b4a9b67 --- /dev/null +++ b/node-desktop-capturer/capture/linux.js @@ -0,0 +1,17 @@ +module.exports = function(options, callback) { + + var fs = require('fs'); + var childProcess = require('child_process'); + var path = require('path'); + + var scrot = childProcess.spawn(path.join(__dirname, "bin", "scrot", "scrot"), [options.output]); + scrot.on('close', function(code, signal) { + try { + fs.statSync(options.output); + callback(null, options); // callback with options, in case options added + } + catch(error) { + callback("file_not_found", null); + } + }); +}; \ No newline at end of file diff --git a/node-desktop-capturer/capture/win32.js b/node-desktop-capturer/capture/win32.js new file mode 100755 index 0000000..1220c1b --- /dev/null +++ b/node-desktop-capturer/capture/win32.js @@ -0,0 +1,18 @@ +module.exports = function(options, callback) { + + var fs = require('fs'); + var childProcess = require('child_process'); + var path = require('path'); + + var nircmd = childProcess.spawn(path.join(__dirname.replace('app.asar', 'app.asar.unpacked'), "bin", "nircmd.exe"), ["savescreenshot", options.output]); + + nircmd.on('close', function(code, signal) { + try { + fs.statSync(options.output); + callback(null, options); // callback with options, in case options added + } + catch(error) { + callback("file_not_found", null); + } + }); +}; \ No newline at end of file diff --git a/node-desktop-capturer/module.js b/node-desktop-capturer/module.js new file mode 100755 index 0000000..fdaee33 --- /dev/null +++ b/node-desktop-capturer/module.js @@ -0,0 +1,100 @@ +module.exports = function() { + return new Screenshot(arguments); +}; + +var path = require('flavored-path'); +var jimp = require('jimp'); +var fs = require('fs'); + +function Screenshot(args) { + var config = this.parseArgs(args); + var self = this; + + try { + require("./capture/" + process.platform + ".js")(config.options, function(error, options) { + // TODO add option for string, rather than file + if(error && typeof config.callback === "function") + config.callback(error, null); + else if(!error) { + if (typeof options.intermediate === "string") { + self.processImage(options.intermediate, options.output, options, function (error, success) { + fs.unlink(options.intermediate, handleCallback); // delete intermediate + }); + } + else + self.processImage(options.output, options.output, options, handleCallback); + } + }); + } + catch(error) { + if(typeof error == "object" && typeof error.code === "string" && error.code === "MODULE_NOT_FOUND") + handleCallback("unsupported_platform"); + } + + function handleCallback(error, success) { + if(typeof config.callback === "function") { + if(typeof success === "undefined") + success = !error; + config.callback(error, success); + } + } +} + +Screenshot.prototype.processImage = function(input, output, options, callback) { + if(typeof options.width !== "number" && typeof options.height !== "number" && typeof options.quality !== "number") // no processing required + callback(null); + else { + new jimp(input, function (err, image) { + if(typeof options.width === "number") + var resWidth = Math.floor(options.width); + if(typeof options.height === "number") + var resHeight = Math.floor(options.height); + + if(typeof resWidth === "number" && typeof resHeight !== "number") // resize to width, maintain aspect ratio + var resHeight = Math.floor(image.bitmap.height * (resWidth / image.bitmap.width)); + else if(typeof resHeight === "number" && typeof resWidth !== "number") // resize to height, maintain aspect ratio + var resWidth = Math.floor(image.bitmap.width * (resHeight / image.bitmap.height)); + + try { + image.resize(resWidth, resHeight); + + if(typeof options.quality === "number" && options.quality >= 0 && options.quality <= 100) + image.quality(Math.floor(options.quality)); // only works with JPEGs + + image.write(output, callback); + } + catch(error) { + callback(error); + } + }); + } +}; + +Screenshot.prototype.parseArgs = function(args) { + var config = {options: {}}; + + for(var property in args) { + if (args.hasOwnProperty(property)) { + switch(typeof args[property]) { + case "string": + var file = args[property]; + break; + case "function": + config.callback = args[property]; + break; + case "object": + if(args[property] != null) + config.options = args[property]; + break; + } + } + } + + if(typeof file === "string") + config.options.output = file; + + if(typeof config.options.output === "string") + config.options.output = path.normalize(config.options.output); + + return config; +}; diff --git a/node-desktop-capturer/package.json b/node-desktop-capturer/package.json new file mode 100755 index 0000000..79145c2 --- /dev/null +++ b/node-desktop-capturer/package.json @@ -0,0 +1,19 @@ +{ + "name": "node-desktop-capturer", + "version": "0.0.1", + "description": "Cross-platform screenshot module, using external tools", + "license": "MIT", + "author": { + "name": "John Murphy-Teixidor", + "email": "johnvmt@gmail.com" + }, + "repository": { + "type": "git", + "url": "https://github.com/FE-Kits/electron-screen-sharing" + }, + "dependencies": { + "jimp": "0.2.x", + "flavored-path": "0.0.x" + }, + "main": "module.js" +} diff --git a/websocket-proxy/README.md b/websocket-proxy/README.md new file mode 100644 index 0000000..1918e9b --- /dev/null +++ b/websocket-proxy/README.md @@ -0,0 +1 @@ +# websocket-proxy