From 818e1abf6d1602bc932ad9a1dfc7cf5856fe6e03 Mon Sep 17 00:00:00 2001 From: henryruhs Date: Mon, 27 Nov 2023 00:09:36 +0100 Subject: [PATCH] Initial commit --- .editorconfig | 8 +++ .eslintrc | 10 ++++ .github/FUNDING.yml | 2 + .github/workflows/ci.yml | 16 ++++++ .gitignore | 3 ++ README.md | 6 +++ icon.png | Bin 0 -> 48925 bytes install.js | 81 ++++++++++++++++++++++++++++++ menu.js | 106 +++++++++++++++++++++++++++++++++++++++ package.json | 16 ++++++ pinokio.js | 7 +++ start.js | 60 ++++++++++++++++++++++ update.js | 27 ++++++++++ 13 files changed, 342 insertions(+) create mode 100644 .editorconfig create mode 100644 .eslintrc create mode 100644 .github/FUNDING.yml create mode 100644 .github/workflows/ci.yml create mode 100644 .gitignore create mode 100644 README.md create mode 100644 icon.png create mode 100644 install.js create mode 100644 menu.js create mode 100644 package.json create mode 100644 pinokio.js create mode 100644 start.js create mode 100644 update.js diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..b88a39d --- /dev/null +++ b/.editorconfig @@ -0,0 +1,8 @@ +root = true + +[*] +end_of_line = lf +insert_final_newline = true +indent_size = 4 +indent_style = tab +trim_trailing_whitespace = true diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..a2127bc --- /dev/null +++ b/.eslintrc @@ -0,0 +1,10 @@ +{ + "extends": + [ + "@isnotdefined/eslint-config/common" + ], + "parserOptions": + { + "ecmaVersion": 2020 + } +} diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..718d8a6 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,2 @@ +github: henryruhs +custom: https://paypal.me/henryruhs diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..84decb6 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,16 @@ +name: ci + +on: [ push, pull_request ] + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Set up Node 20 + uses: actions/setup-node@v4 + with: + node-version: 20 + - run: npm install + - run: npm run lint diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..84fae54 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.idea +.vscode +node_modules diff --git a/README.md b/README.md new file mode 100644 index 0000000..7e42d54 --- /dev/null +++ b/README.md @@ -0,0 +1,6 @@ +FaceFusion Pinokio +================== + +> Next generation face swapper and enhancer. + +[![Build Status](https://img.shields.io/github/actions/workflow/status/facefusion/facefusion-pinokio/ci.yml.svg?branch=master)](https://github.com/facefusion/facefusion-pinokio/actions?query=workflow:ci) diff --git a/icon.png b/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9ff7eb1f259ea974b7d84f1aa955b6bf90844b63 GIT binary patch literal 48925 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 PF@U#nDzeqmCPDuP#J9&% literal 0 HcmV?d00001 diff --git a/install.js b/install.js new file mode 100644 index 0000000..4a05b18 --- /dev/null +++ b/install.js @@ -0,0 +1,81 @@ +function install(kernel) +{ + const { platform, arch, gpu } = kernel; + + if (platform === 'darwin') + { + if (arch === 'arm64') + { + return 'python install.py --onnxruntime coreml-silicon --torch default'; + } + return 'python install.py --onnxruntime default --torch default'; + } + if (gpu === 'nvidia') + { + return 'python install.py --onnxruntime cuda --torch cuda'; + } + if (gpu === 'amd') + { + return 'python install.py --onnxruntime default --torch cpu'; + } + return 'python install.py --onnxruntime default --torch cpu'; +} + +module.exports = async kernel => +{ + const config = + { + requires: + [ + { + type: 'conda', + name: + [ + 'cmake', + 'ffmpeg' + ], + args: '-c conda-forge' + }, + { + gpu: 'nvidia', + name: 'cuda' + } + ], + run: + [ + { + method: 'shell.run', + params: + { + message: 'git clone https://github.com/facefusion/facefusion --branch next --single-branch' + } + }, + { + method: 'shell.run', + params: + { + message: install(kernel), + path: 'facefusion', + venv: 'env' + } + }, + { + method: 'input', + params: + { + title: 'Install complete', + description: 'Go back to the dashboard and launch the application.' + } + }, + { + method: 'browser.open', + params: + { + uri: '/?selected=facefusion' + } + } + ] + }; + + return config; +}; diff --git a/menu.js b/menu.js new file mode 100644 index 0000000..00d41e1 --- /dev/null +++ b/menu.js @@ -0,0 +1,106 @@ +module.exports = async kernel => +{ + const hasEnv = await kernel.exists(__dirname, 'facefusion', 'env'); + const hasRepo = await kernel.exists(__dirname, 'facefusion'); + + let menu = []; + + if (hasEnv && hasRepo) + { + if (kernel.running(__dirname, 'start.js')) + { + const session = await kernel.require(__dirname, 'session.json'); + + menu = + [ + { + icon: 'fa-solid fa-spin fa-circle-notch', + text: 'Running ' + session.mode + }, + { + icon: 'fa-solid fa-desktop', + text: 'Server', + href: 'start.js', + params: + { + fullscreen: true + } + } + ]; + if (session && session.url) + { + menu.push( + { + icon: 'fa-solid fa-rocket', + text: 'Open session', + href: session.url, + target: '_blank' + }); + } + return menu; + } + menu = + [ + { + icon: 'fa-solid fa-photo-film', + text: 'Launch default', + href: 'start.js', + params: + { + run: true, + fullscreen: true, + mode: 'Default' + } + }, + { + icon: 'fa-solid fa-gauge', + text: 'Launch benchmark', + href: 'start.js', + params: + { + run: true, + fullscreen: true, + mode: 'Benchmark' + } + }, + { + icon: 'fa-solid fa-webcam', + text: 'Launch webcam', + href: 'start.js', + params: + { + run: true, + fullscreen: true, + mode: 'Webcam' + } + }, + { + icon: 'fa-solid fa-rotate', + text: 'Update', + href: 'update.js', + params: + { + run: true, + fullscreen: true + } + } + ]; + } + else + { + menu = + [ + { + icon: 'fa-solid fa-plug', + text: 'Install', + href: 'install.js', + params: + { + run: true, + fullscreen: true + } + } + ]; + } + return menu; +}; diff --git a/package.json b/package.json new file mode 100644 index 0000000..3f59407 --- /dev/null +++ b/package.json @@ -0,0 +1,16 @@ +{ + "name": "facefusion-pinokio", + "description": "Next generation face swapper and enhancer", + "version": "2.0.0", + "license": "MIT", + "devDependencies": + { + "@isnotdefined/eslint-config": "9.8.0", + "eslint": "8.54.0" + }, + "scripts": + { + "lint": "eslint . --ext=.js", + "fix": "npm run lint -- --fix" + } +} diff --git a/pinokio.js b/pinokio.js new file mode 100644 index 0000000..9324be2 --- /dev/null +++ b/pinokio.js @@ -0,0 +1,7 @@ +module.exports = +{ + title: 'FaceFusion Next', + description: 'Next generation face swapper and enhancer', + icon: 'icon.png', + menu: require(__dirname + '/menu.js') +}; diff --git a/start.js b/start.js new file mode 100644 index 0000000..b24b688 --- /dev/null +++ b/start.js @@ -0,0 +1,60 @@ +module.exports = () => +{ + const config = + { + daemon: true, + cmd: + { + Default: 'python run.py', + Benchmark: 'python run.py --ui-layouts benchmark', + Webcam: 'python run.py --ui-layouts webcam' + }, + run: + [ + { + method: 'local.set', + params: + { + mode: '{{input.mode}}' + } + }, + { + method: 'shell.run', + params: + { + message: '{{self.cmd[local.mode]}}', + path: 'facefusion', + venv: 'env', + on: + [ + { + event: '/(http:\/\/[0-9.:]+)/', + done: true + } + ] + } + }, + { + method: 'self.set', + params: + { + 'session.json': + { + mode: '{{local.mode}}', + url: '{{input.stdout.match(/(http:\\S+)/gi)[0]}}' + } + } + }, + { + method: 'browser.open', + params: + { + uri: '{{self.session.url}}', + target: '_blank' + } + } + ] + }; + + return config; +}; diff --git a/update.js b/update.js new file mode 100644 index 0000000..a414339 --- /dev/null +++ b/update.js @@ -0,0 +1,27 @@ +module.exports = () => +{ + const config = + { + run: + [ + { + method: 'shell.run', + params: + { + 'message': 'git pull' + } + }, + { + method: 'shell.run', + params: + { + message: 'git pull', + path: 'facefusion' + } + } + ] + }; + + return config; +}; +