From 60ffb862dce4fabc85fc2b15b7fdce5a7e57f2c2 Mon Sep 17 00:00:00 2001 From: Janis Hutz Date: Sun, 4 Jun 2023 14:44:13 +0200 Subject: [PATCH] add socket.io --- frontend/logo.png | Bin 0 -> 44230 bytes frontend/package-lock.json | 357 ++++++++++++++++++++++++++-- frontend/package.json | 12 +- frontend/src/app.js | 17 +- frontend/src/socket.js | 29 +++ frontend/src/upscalingHandler.js | 48 ++-- frontend/src/views/HomeView.vue | 59 ++++- frontend/src/views/SettingsView.vue | 1 + packaging/package.sh | 31 ++- 9 files changed, 494 insertions(+), 60 deletions(-) create mode 100755 frontend/logo.png create mode 100644 frontend/src/socket.js diff --git a/frontend/logo.png b/frontend/logo.png new file mode 100755 index 0000000000000000000000000000000000000000..63204b969584ec69d2e78b1c2a23747db47b0a16 GIT binary patch literal 44230 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" } }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" + }, "node_modules/@soda/friendly-errors-webpack-plugin": { "version": "1.8.1", "resolved": "https://registry.npmmirror.com/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.8.1.tgz", @@ -4552,6 +4560,19 @@ "@types/node": "*" } }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" + }, + "node_modules/@types/cors": { + "version": "2.8.13", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", + "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/debug": { "version": "4.1.8", "resolved": "https://registry.npmmirror.com/@types/debug/-/debug-4.1.8.tgz", @@ -4695,8 +4716,7 @@ "node_modules/@types/node": { "version": "20.2.3", "resolved": "https://registry.npmmirror.com/@types/node/-/node-20.2.3.tgz", - "integrity": "sha512-pg9d0yC4rVNWQzX8U7xb4olIOFuuVL9za3bzMT2pu2SU0SNEi66i2qrvhE2qt0HvkhuCaWJu7pLNOt/Pj8BIrw==", - "dev": true + "integrity": "sha512-pg9d0yC4rVNWQzX8U7xb4olIOFuuVL9za3bzMT2pu2SU0SNEi66i2qrvhE2qt0HvkhuCaWJu7pLNOt/Pj8BIrw==" }, "node_modules/@types/normalize-package-data": { "version": "2.4.1", @@ -5739,7 +5759,6 @@ "version": "1.3.8", "resolved": "https://registry.npmmirror.com/accepts/-/accepts-1.3.8.tgz", "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -6390,6 +6409,14 @@ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, "node_modules/batch": { "version": "0.6.1", "resolved": "https://registry.npmmirror.com/batch/-/batch-0.6.1.tgz", @@ -8163,7 +8190,6 @@ "version": "4.3.4", "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -9640,6 +9666,94 @@ "once": "^1.4.0" } }, + "node_modules/engine.io": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.2.tgz", + "integrity": "sha512-FKn/3oMiJjrOEOeUub2WCox6JhxBXq/Zn3fZOMCBxKnNYtsdKjxhl7yR3fZhM9PV+rdE75SU5SYMc+2PGzo+Tg==", + "dependencies": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.3", + "ws": "~8.11.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io-client": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.4.0.tgz", + "integrity": "sha512-GyKPDyoEha+XZ7iEqam49vz6auPnNJ9ZBfy89f+rMMas8AuiMWOZ9PVzu8xb9ZC6rafUqiGHSCfu22ih66E+1g==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.3", + "ws": "~8.11.0", + "xmlhttprequest-ssl": "~2.0.0" + } + }, + "node_modules/engine.io-client/node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/engine.io-parser": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.7.tgz", + "integrity": "sha512-P+jDFbvK6lE3n1OL+q9KuzdOFWkkZ/cMV9gol/SbVfpyqfvrfrFTOFJ6fQm2VC3PZHlU3QPhVwmbsCnauHF2MQ==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io/node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/enhanced-resolve": { "version": "5.14.0", "resolved": "https://registry.npmmirror.com/enhanced-resolve/-/enhanced-resolve-5.14.0.tgz", @@ -13726,7 +13840,6 @@ "version": "1.52.0", "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, "engines": { "node": ">= 0.6" } @@ -13735,7 +13848,6 @@ "version": "2.1.35", "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, "dependencies": { "mime-db": "1.52.0" }, @@ -13977,8 +14089,7 @@ "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/multicast-dns": { "version": "7.2.5", @@ -14025,7 +14136,6 @@ "version": "0.6.3", "resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, "engines": { "node": ">= 0.6" } @@ -16670,6 +16780,76 @@ "npm": ">= 3.0.0" } }, + "node_modules/socket.io": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.2.tgz", + "integrity": "sha512-Vp+lSks5k0dewYTfwgPT9UeGGd+ht7sCpB7p0e83VgO4X/AHYWhXITMrNk/pg8syY2bpx23ptClCQuHhqi2BgQ==", + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.4.2", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", + "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", + "dependencies": { + "ws": "~8.11.0" + } + }, + "node_modules/socket.io-adapter/node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/socket.io-client": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.6.2.tgz", + "integrity": "sha512-OwWrMbbA8wSqhBAR0yoPK6EdQLERQAYjXb3A0zLpgxfM1ZGLKoxHx8gVmCHA6pcclRX5oA/zvQf7bghAS11jRA==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.2", + "engine.io-client": "~6.4.0", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/sockjs": { "version": "0.3.24", "resolved": "https://registry.npmmirror.com/sockjs/-/sockjs-0.3.24.tgz", @@ -19414,6 +19594,14 @@ "node": ">=8.0" } }, + "node_modules/xmlhttprequest-ssl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", + "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmmirror.com/xtend/-/xtend-4.0.2.tgz", @@ -22723,6 +22911,11 @@ "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", "dev": true }, + "@socket.io/component-emitter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" + }, "@soda/friendly-errors-webpack-plugin": { "version": "1.8.1", "resolved": "https://registry.npmmirror.com/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.8.1.tgz", @@ -22863,6 +23056,19 @@ "@types/node": "*" } }, + "@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" + }, + "@types/cors": { + "version": "2.8.13", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", + "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", + "requires": { + "@types/node": "*" + } + }, "@types/debug": { "version": "4.1.8", "resolved": "https://registry.npmmirror.com/@types/debug/-/debug-4.1.8.tgz", @@ -23006,8 +23212,7 @@ "@types/node": { "version": "20.2.3", "resolved": "https://registry.npmmirror.com/@types/node/-/node-20.2.3.tgz", - "integrity": "sha512-pg9d0yC4rVNWQzX8U7xb4olIOFuuVL9za3bzMT2pu2SU0SNEi66i2qrvhE2qt0HvkhuCaWJu7pLNOt/Pj8BIrw==", - "dev": true + "integrity": "sha512-pg9d0yC4rVNWQzX8U7xb4olIOFuuVL9za3bzMT2pu2SU0SNEi66i2qrvhE2qt0HvkhuCaWJu7pLNOt/Pj8BIrw==" }, "@types/normalize-package-data": { "version": "2.4.1", @@ -23907,7 +24112,6 @@ "version": "1.3.8", "resolved": "https://registry.npmmirror.com/accepts/-/accepts-1.3.8.tgz", "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, "requires": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -24416,6 +24620,11 @@ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==" + }, "batch": { "version": "0.6.1", "resolved": "https://registry.npmmirror.com/batch/-/batch-0.6.1.tgz", @@ -25825,7 +26034,6 @@ "version": "4.3.4", "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "requires": { "ms": "2.1.2" } @@ -27006,6 +27214,61 @@ "once": "^1.4.0" } }, + "engine.io": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.2.tgz", + "integrity": "sha512-FKn/3oMiJjrOEOeUub2WCox6JhxBXq/Zn3fZOMCBxKnNYtsdKjxhl7yR3fZhM9PV+rdE75SU5SYMc+2PGzo+Tg==", + "requires": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.3", + "ws": "~8.11.0" + }, + "dependencies": { + "cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" + }, + "ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "requires": {} + } + } + }, + "engine.io-client": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.4.0.tgz", + "integrity": "sha512-GyKPDyoEha+XZ7iEqam49vz6auPnNJ9ZBfy89f+rMMas8AuiMWOZ9PVzu8xb9ZC6rafUqiGHSCfu22ih66E+1g==", + "requires": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.3", + "ws": "~8.11.0", + "xmlhttprequest-ssl": "~2.0.0" + }, + "dependencies": { + "ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "requires": {} + } + } + }, + "engine.io-parser": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.7.tgz", + "integrity": "sha512-P+jDFbvK6lE3n1OL+q9KuzdOFWkkZ/cMV9gol/SbVfpyqfvrfrFTOFJ6fQm2VC3PZHlU3QPhVwmbsCnauHF2MQ==" + }, "enhanced-resolve": { "version": "5.14.0", "resolved": "https://registry.npmmirror.com/enhanced-resolve/-/enhanced-resolve-5.14.0.tgz", @@ -30277,14 +30540,12 @@ "mime-db": { "version": "1.52.0", "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" }, "mime-types": { "version": "2.1.35", "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, "requires": { "mime-db": "1.52.0" } @@ -30479,8 +30740,7 @@ "ms": { "version": "2.1.2", "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "multicast-dns": { "version": "7.2.5", @@ -30517,8 +30777,7 @@ "negotiator": { "version": "0.6.3", "resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" }, "neo-async": { "version": "2.6.2", @@ -32569,6 +32828,55 @@ "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "dev": true }, + "socket.io": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.2.tgz", + "integrity": "sha512-Vp+lSks5k0dewYTfwgPT9UeGGd+ht7sCpB7p0e83VgO4X/AHYWhXITMrNk/pg8syY2bpx23ptClCQuHhqi2BgQ==", + "requires": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.4.2", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + } + }, + "socket.io-adapter": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", + "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", + "requires": { + "ws": "~8.11.0" + }, + "dependencies": { + "ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "requires": {} + } + } + }, + "socket.io-client": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.6.2.tgz", + "integrity": "sha512-OwWrMbbA8wSqhBAR0yoPK6EdQLERQAYjXb3A0zLpgxfM1ZGLKoxHx8gVmCHA6pcclRX5oA/zvQf7bghAS11jRA==", + "requires": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.2", + "engine.io-client": "~6.4.0", + "socket.io-parser": "~4.2.4" + } + }, + "socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "requires": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + } + }, "sockjs": { "version": "0.3.24", "resolved": "https://registry.npmmirror.com/sockjs/-/sockjs-0.3.24.tgz", @@ -34783,6 +35091,11 @@ "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", "dev": true }, + "xmlhttprequest-ssl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", + "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==" + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmmirror.com/xtend/-/xtend-4.0.2.tgz", diff --git a/frontend/package.json b/frontend/package.json index 59448d4..b554eb4 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,14 +1,16 @@ { "name": "imagevideoupscaler", "version": "2.0.0-dev1", - "maintainers": [ "Janis Hutz " ], + "maintainers": [ + "Janis Hutz " + ], "description": "An Electron frontend to the ImageVideoUpscaler-CLI", "homepage": "https://janishutz.com/scaler.html", "author": { - "name":"Janis Hutz", + "name": "Janis Hutz", "email": "development@janishutz.com", - "url":"https://janishutz.com" - }, + "url": "https://janishutz.com" + }, "license": "GPL-3.0-or-later", "bugs": { "url": "https://github.com/simplePCBuilding/FSRImageVideoUpscalerFrontend/issues" @@ -32,6 +34,8 @@ "core-js": "^3.8.3", "cors": "^2.8.5", "electron-squirrel-startup": "^1.0.0", + "socket.io": "^4.6.2", + "socket.io-client": "^4.6.2", "vue": "^3.2.13", "vue-router": "^4.0.3" }, diff --git a/frontend/src/app.js b/frontend/src/app.js index 9c06859..2bfd633 100644 --- a/frontend/src/app.js +++ b/frontend/src/app.js @@ -6,11 +6,24 @@ const bodyParser = require( 'body-parser' ); const exec = require( 'child_process' ).exec; const upscaling = require( './upscalingHandler.js' ); const upscalingHandler = new upscaling(); +const http = require( 'http' ); +const server = require( 'socket.io' ).Server; +const Server = http.createServer( app ); + +const io = new server( Server, { + cors: { + origin: 'http://localhost:8080' + } +} ); app.use( bodyParser.urlencoded( { extended: false } ) ); app.use( bodyParser.json() ); app.use( cors() ); +io.on( 'connection', ( socket ) => { + console.log( 'connected' ); +} ) + app.get( '/api/getEngines', ( request, response ) => { console.log( 'engines' ); @@ -45,10 +58,10 @@ app.post( '/api/startUpscaling', ( request, response ) => { let checks = upscalingHandler.verifyDataIntegrity( request.body ); if ( checks[ 0 ] ) { response.send( { 'data': checks[ 1 ] } ); - upscalingHandler.upscale( request.body ); + upscalingHandler.upscale( request.body, io ); } else { response.send( { 'data': checks[ 1 ] } ); } } ); -app.listen( 8081 ); \ No newline at end of file +Server.listen( 8081 ); \ No newline at end of file diff --git a/frontend/src/socket.js b/frontend/src/socket.js new file mode 100644 index 0000000..a4a0d0b --- /dev/null +++ b/frontend/src/socket.js @@ -0,0 +1,29 @@ +import { reactive } from "vue"; +import { io } from "socket.io-client"; + +export const state = reactive({ + connected: false, + fooEvents: [], + barEvents: [] +}); + +// "undefined" means the URL will be computed from the `window.location` object +const URL = process.env.NODE_ENV === "production" ? undefined : "http://localhost:8081"; + +export const socket = io(URL); + +socket.on("connect", () => { + state.connected = true; +}); + +socket.on("disconnect", () => { + state.connected = false; +}); + +socket.on("foo", (...args) => { + state.fooEvents.push(args); +}); + +socket.on("bar", (...args) => { + state.barEvents.push(args); +}); \ No newline at end of file diff --git a/frontend/src/upscalingHandler.js b/frontend/src/upscalingHandler.js index a924565..63050c5 100644 --- a/frontend/src/upscalingHandler.js +++ b/frontend/src/upscalingHandler.js @@ -7,46 +7,62 @@ * */ -const exec = require( 'child_process' ).exec; +const child_process = require( 'child_process' ); const process = require( 'process' ); const Notification = require( 'electron' ).Notification; -function execute(command, callback){ - exec(command, function(error, stdout, stderr){ callback(stdout); }); -}; class UpscalingHandler { constructor () { this.os = process.platform } - upscale( options ) { + upscale( options, io ) { // required options: engine, algorithm, scale, sharpening, InputFile & OutputFile // Options is an object! let baseCommand = ''; // Create cli command to upscale if ( this.os === 'linux' ) { - baseCommand = './imagevideoupscaler -i '; + baseCommand = './imagevideoupscaler'; } else if ( this.os === 'win32' ) { - baseCommand = 'imagevideoupscaler -i '; + baseCommand = 'imagevideoupscaler'; } - baseCommand += options.InputFile + ' -o ' + options.OutputFile - + + let args = [] + args.push( '-i' + options.InputFile ); + args.push( '-o ' + options.OutputFile ); + + args.push( '-s ' + options.scale ) + // add additional options - baseCommand += ' -s ' + options.scale + ' -S ' + options.sharpening - baseCommand += ' -E ' + options.engine + ' -M ' + options.algorithm - - execute( baseCommand, out => { - console.log( out ); - new Notification( { title: 'ImageVideoUpscaler - Job complete', body: 'Your file has been processed successfully' } ) + // baseCommand += + ' -S ' + options.sharpening + // baseCommand += ' -E ' + options.engine + ' -M ' + options.algorithm + + let child = child_process.spawn( baseCommand, args ); + + child.stdout.on( 'data', data => { + console.log( '' + data ); + io.emit( 'progress', '\n' + data ); + } ); + + child.stderr.on( 'data', ( data ) => { + console.error(`stderr: ${ data }`); + } ); + + child.on( 'error', ( error ) => { + new Notification( { title: `ImageVideoUpscaler - Error whilst upscaling', body: 'Your upscaling Job encountered an error whilst upscaling. (Error message: ${ error.message }).`} ) + } ); + + child.on( 'close', ( code ) => { + new Notification( { title: `ImageVideoUpscaler - Job complete', body: 'Your Upscaling job has completed successfully (Code ${ code }). You may find its output here: ` + options.OutputFile } ) } ); } verifyDataIntegrity ( data ) { if ( data[ 'InputFile' ] && data[ 'OutputFile' ] && data[ 'engine' ] && data[ 'algorithm' ] && 1 < data[ 'scale' ] <= 4 && 0 <= data[ 'sharpening' ] <= 1 ) { - if ( data[ 'InputFile' ][ 0 ].substring( data[ 'InputFile' ].length - 4 ) == data[ 'OutputFile' ][ 0 ].substring( data[ 'OutputFile' ].length - 4 ) ) { + if ( data[ 'InputFile' ][ 0 ].substring( data[ 'InputFile' ][ 0 ].length - 4 ) == data[ 'OutputFile' ].substring( data[ 'OutputFile' ].length - 4 ) ) { return [ true, 'upscaling' ]; } else { return [ false, 'differentFileExtensions' ]; diff --git a/frontend/src/views/HomeView.vue b/frontend/src/views/HomeView.vue index fc35626..30b3bfb 100644 --- a/frontend/src/views/HomeView.vue +++ b/frontend/src/views/HomeView.vue @@ -22,9 +22,15 @@
+
+

Command output

+
+
+
+
- Your file is being processed. You will be notified when the upscaling process has finished. A future version of this app will show progress here. + Your file is being processed. You will be notified when the upscaling process has finished.
@@ -55,13 +61,16 @@ diff --git a/frontend/src/views/SettingsView.vue b/frontend/src/views/SettingsView.vue index d8c0bba..d348295 100644 --- a/frontend/src/views/SettingsView.vue +++ b/frontend/src/views/SettingsView.vue @@ -2,6 +2,7 @@

Settings

Engines

+

WIP!

{{ engines }}

diff --git a/packaging/package.sh b/packaging/package.sh index b5835aa..48a5e17 100755 --- a/packaging/package.sh +++ b/packaging/package.sh @@ -4,25 +4,32 @@ cd .. # Make linux executable pyinstaller imagevideoupscaler.spec -cp ./dist/imagevideoupscaler/* ./frontend/src/ +cp -r ./dist/imagevideoupscaler/* ./frontend/ # wine python -m pyinstaller imagevideoupscaler.spec -# cp ./dist/imagevideoupscaler/* ./frontend/src/ +# cp ./dist/imagevideoupscaler/* ./frontend/ -cp -r ./bin ./frontend/src/ -cp -r ./config ./frontend/src/ -cp ./imagevideoupscaler-cli.py ./frontend/src/ -cp ./LICENSE ./frontend/src/ -cp ./logo.png ./frontend/src/ +cp -r ./bin ./frontend/ +cp -r ./config ./frontend/ +cp ./imagevideoupscaler-cli.py ./frontend/ +cp ./LICENSE ./frontend/ +cp ./logo.png ./frontend/ # package for all platforms (includes GUI & CLI) cd frontend npm run electron:build -- --linux deb rpm --win nsis -print '\n\n==> Cleaning up\n\n' -rm -rf ./src/bin -rm -rf ./src/config -rm ./src/imagevideoupscaler-cli.py -rm ./src/LICENSE +printf '\n\n==> Cleaning up\n\n' +# rm -rf ./lib/bin +# rm -rf ./src/config +# rm -rf ./src/libdynload +# rm ./lib/image* +# rm ./lib/lib* +# rm ./lib/ld* +# rm ./lib/base_library.zip +# rm ./lib/imagevideoupscaler-cli.py +# rm ./lib/LICENSE + + # Make windows executable # TODO: create compiler \ No newline at end of file