From 0406dc254fd3b62e36362be614d7092ce766d07f Mon Sep 17 00:00:00 2001 From: CyberMask367 Date: Wed, 8 Apr 2026 06:13:58 +0100 Subject: [PATCH 1/3] initial V1.0 push --- README.md | 356 +- Start Server.bat | 4 - config.json | 6 - icon.png | Bin 0 -> 133236 bytes linux/app/json-library-server.js | 464 ++ linux/app/processor.js | 478 ++ linux/json-generator-linux.js | 483 ++ linux/node-menu-linux.js | 529 +++ linux/node-settings-linux.json | 20 + package.json | 15 - server.js | 563 --- windows/cli/app/json-library-server.js | 464 ++ windows/cli/app/processor.js | 478 ++ windows/cli/ext/di.exe | Bin 0 -> 716336 bytes windows/cli/ext/libatrac9.dll | Bin 0 -> 118272 bytes windows/cli/ext/sc.exe | Bin 0 -> 1077296 bytes windows/cli/ext/trp_compare_default.css | 259 ++ windows/cli/node-menu.js | 274 ++ windows/cli/node-settings.json | 20 + windows/cli/orbis-pub-cmd.exe | Bin 0 -> 3274784 bytes windows/cli/orbis-pub-prx.dll | Bin 0 -> 3835424 bytes windows/gui/app/json-library-server.js | 464 ++ windows/gui/app/processor.js | 478 ++ windows/gui/electron/assets/.gitkeep | 1 + windows/gui/electron/assets/icon.ico | Bin 0 -> 45678 bytes windows/gui/electron/main.js | 385 ++ windows/gui/electron/preload.js | 12 + windows/gui/electron/renderer/index.html | 169 + windows/gui/electron/renderer/renderer.js | 194 + windows/gui/electron/renderer/styles.css | 316 ++ windows/gui/electron/scan-worker.js | 13 + windows/gui/ext/di.exe | Bin 0 -> 716336 bytes windows/gui/ext/libatrac9.dll | Bin 0 -> 118272 bytes windows/gui/ext/sc.exe | Bin 0 -> 1077296 bytes windows/gui/ext/trp_compare_default.css | 259 ++ windows/gui/orbis-pub-cmd.exe | Bin 0 -> 3274784 bytes windows/gui/orbis-pub-prx.dll | Bin 0 -> 3835424 bytes windows/gui/package-lock.json | 4895 +++++++++++++++++++++ windows/gui/package.json | 60 + 39 files changed, 11057 insertions(+), 602 deletions(-) delete mode 100644 Start Server.bat delete mode 100644 config.json create mode 100644 icon.png create mode 100644 linux/app/json-library-server.js create mode 100644 linux/app/processor.js create mode 100644 linux/json-generator-linux.js create mode 100644 linux/node-menu-linux.js create mode 100644 linux/node-settings-linux.json delete mode 100644 package.json delete mode 100644 server.js create mode 100644 windows/cli/app/json-library-server.js create mode 100644 windows/cli/app/processor.js create mode 100644 windows/cli/ext/di.exe create mode 100644 windows/cli/ext/libatrac9.dll create mode 100644 windows/cli/ext/sc.exe create mode 100644 windows/cli/ext/trp_compare_default.css create mode 100644 windows/cli/node-menu.js create mode 100644 windows/cli/node-settings.json create mode 100644 windows/cli/orbis-pub-cmd.exe create mode 100644 windows/cli/orbis-pub-prx.dll create mode 100644 windows/gui/app/json-library-server.js create mode 100644 windows/gui/app/processor.js create mode 100644 windows/gui/electron/assets/.gitkeep create mode 100644 windows/gui/electron/assets/icon.ico create mode 100644 windows/gui/electron/main.js create mode 100644 windows/gui/electron/preload.js create mode 100644 windows/gui/electron/renderer/index.html create mode 100644 windows/gui/electron/renderer/renderer.js create mode 100644 windows/gui/electron/renderer/styles.css create mode 100644 windows/gui/electron/scan-worker.js create mode 100644 windows/gui/ext/di.exe create mode 100644 windows/gui/ext/libatrac9.dll create mode 100644 windows/gui/ext/sc.exe create mode 100644 windows/gui/ext/trp_compare_default.css create mode 100644 windows/gui/orbis-pub-cmd.exe create mode 100644 windows/gui/orbis-pub-prx.dll create mode 100644 windows/gui/package-lock.json create mode 100644 windows/gui/package.json diff --git a/README.md b/README.md index d9a4b6e..e23cdf3 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,346 @@ -# FPKGi-node-server -A simple package server to work with the FPKGi PS4 client. This autogenerates the PS4 package meta and serves compatible JSON files dynamically. +# FPKGi Node Server -## How to use? -- Install NodeJS from https://nodejs.org/en/download -- Download the files in this repository to a folder and open command or terminal in the same directory. Run `npm install` to install the NodeJS dependency (express) -- Edit the `config.json` file and add the IP address of your PC/Server this is being ran on. (same network as the PS4) -- Run the `Start Server.bat` or to run from terminal: `node server` in the same directory. -- On first run it will generate the folder structure needed to serve packages. Place your fpkgs in the relevant folders to structure the data. +FPKGi Node Server is a set of tools for generating FPKGi-compatible JSON files, serving PKG and cover files over HTTP, and hosting a separate JSON library web UI. -You should now be able to visit the local webserver it generates, which should give you direct links to the auto-generated JSON files, please see FPKGi instructions on how to add these to your client. A basic preview library is available by clicking the 'eye' icon on the right hand side of the categories. +This repository contains the source code for: -If you need to refresh or rescan the packages (e.g. adding a new package whilst the server is running) you can visit `/refresh` to instruct the server to refresh the packages. +- a Windows GUI app +- a Windows CLI version +- a Linux CLI version -## Notes -- The background feature and cover-images are currently broken, however this seems like a client issue and it is correctly implemented in this server. This should be fixed in the next FPKGi client update. -- I have no experience in handling pkg files, this is a first-attempt at getting metadata extracted in NodeJS. If there is a package that doesn't process I would appreictate a message. -- This is a hobby project, may or may not be worked on in spare time. Updates may be sporadic, to be used for self-hosting package deployment on your local network and not to be used over the internet - there is no security or authentication. It's just a glorified file-server with JSON listings. +## Features + +- scan category folders containing PS4 `.pkg` files +- generate FPKGi JSON files +- serve PKG files and cover images over HTTP +- host a separate JSON library server on its own port +- support a background image for the JSON library +- extract cover icons automatically on Windows with `orbis-pub-cmd.exe` from [PS4 Fake PKG Tools by CyB1K](https://github.com/CyB1K/PS4-Fake-PKG-Tools-3.87) + +## Project Layout + +- [windows/gui](): Electron desktop app for Windows +- [windows/cli](): Node.js terminal version for Windows +- [linux](): Node.js terminal version for Linux + +## Release Downloads + +Check ther [Releases](https://github.com/CyberMask367/FPKGi-node-server/releases) section for files: + +- `fpkgi-node-server-windows-gui_installer.exe` +- `fpkgi-node-server-windows-gui_portable.zip` +- `fpkgi-node-server-windows-cli.zip` +- `fpkgi-node-server-linux.zip` + +## Which Version To Use + +Use the Windows GUI if you want: + +- a desktop app +- settings page +- dashboard +- tray support +- live logs +- buttons for scan and stop scan + +Use the Windows CLI if you want: + +- a simple menu in the terminal +- Windows icon extraction support +- no GUI + +Use the Linux version if you want: + +- terminal-based operation +- JSON generation on Linux +- HTTP and JSON library servers without Windows-only extraction tools + +## Windows GUI Release + +You can use either the installer or the portable version. + +### Windows GUI Installer + +File: + +- `fpkgi-node-server-windows-gui_installer.exe` + +Installation: + +1. Run the installer. +2. Follow the setup wizard. +3. Launch `FPKGi Node Server` from the Start menu or installed folder. + +Notes: + +- Node.js is not required for the packaged GUI release. +- `orbis-pub-cmd.exe`, `orbis-pub-prx.dll`, and `ext` are bundled inside the app resources. + +### Windows GUI Portable + +File: + +- `fpkgi-node-server-windows-gui_portable.zip` + +Installation and usage: + +1. Extract the zip to a folder. +2. Keep all extracted files together. +3. Run `FPKGi Node Server.exe`. + +Important: + +- Do not move only the `.exe` out of the extracted folder. +- The portable build depends on the bundled `resources` folder next to the executable. +- Node.js is not required for the packaged GUI release. + +### First-Time Setup In The GUI + +Open the `Settings` page and set: + +- PKG scan path +- covers path +- JSON output path +- HTTP server enabled or disabled +- HTTP server IP and port +- JSON library server enabled or disabled +- JSON library server IP and port +- optional tray and startup behavior + +Then save the settings. + +### Running A Scan In The GUI + +From the dashboard: + +1. Click `Run Scan`. +2. The app scans PKGs, extracts icons on Windows, and generates JSON files. +3. Use `Stop Scan` if you want to cancel the current scan. + +The dashboard also shows: + +- current job status +- whether the HTTP server is running +- whether the JSON library server is running +- whether the Orbis tool is available +- live logs + +## Windows CLI Release + +File: + +- `fpkgi-node-server-windows-cli.zip` + +What is included: + +- `node-menu.js` +- `node-settings.json` +- `fpkgi-node-server-windows-cli.bat` +- `orbis-pub-cmd.exe` +- `orbis-pub-prx.dll` +- `ext` +- `app` +- empty `pkg`, `covers`, and `json` folders + +Requirements: + +- Windows +- [Node.js](https://nodejs.org/) + +Installation and usage: + +1. Extract the zip to a folder. +2. Make sure Node.js is installed. +3. Run `fpkgi-node-server-windows-cli.bat`, or open a terminal in the extracted folder and run: + +```bash +node node-menu.js +``` + +### Windows CLI Menu + +The menu includes: + +- `1. Run scan` +- `2. Edit settings` +- `3. Start servers` +- `4. Run scan and keep servers running` +- `5. Stop running servers` +- `6. Show current settings` +- `7. Exit` + +Enabled servers start automatically when the script launches, and the currently running servers are shown at the top of the menu. + +### Windows CLI Config + +The Windows CLI uses: + +- `node-settings.json` + +Main settings: + +- `paths.pkgScan` +- `paths.covers` +- `output.path` +- `httpServer.enabled` +- `httpServer.address` +- `httpServer.port` +- `jsonLibraryServer.enabled` +- `jsonLibraryServer.address` +- `jsonLibraryServer.port` +- `serverAddress` + +## Linux Release + +File: + +- `fpkgi-node-server-linux.zip` + +What is included: + +- `node-menu-linux.js` +- `node-settings-linux.json` +- `json-generator-linux.js` +- `app` +- empty `pkg`, `covers`, and `json` folders + +Requirements: + +- Linux +- [Node.js](https://nodejs.org/) + +Installation and usage: + +1. Extract the zip to a folder. +2. Make sure Node.js is installed. +3. Open a terminal in the extracted folder. +4. Run: + +```bash +node node-menu-linux.js +``` + +Note: + +- The archive includes `fpkgi-node-server-linux.sh`, but the safest way to launch the Linux version is running `node node-menu-linux.js` directly. + +### Linux Menu + +The Linux menu includes: + +- `1. Generate JSON` +- `2. Edit settings` +- `3. Start servers` +- `4. Generate JSON and keep servers running` +- `5. Stop running servers` +- `6. Show current settings` +- `7. Exit` + +Enabled servers start automatically when the script launches, and the currently running servers are shown at the top of the menu. + +### Linux Limitation + +The Linux version does not extract icons because `orbis-pub-cmd.exe` is Windows-only. + +You should provide cover images in the covers folder if you want custom artwork in generated output. + +## Covers And Background Image + +Cover images are read from the covers directory you set in the app or CLI config. + +The JSON library server also checks the root of the covers folder for a background image named: + +- `background.png` +- `background.bmp` +- `background.jpg` +- `background.jpeg` + +If one of those exists, it is served automatically through the JSON library server. + +The generated JSON library config uses: + +```json +"background_uri": "http://server-address/background" +``` + +## HTTP Server + +When enabled, the built-in HTTP server serves only: + +- `/pkg/...` +- `/covers/...` + +It does not expose the whole project folder. + +## JSON Library Server + +The JSON library server is separate from the PKG/covers HTTP server and has its own: + +- enable toggle +- IP address +- port + +It uses the JSON output path automatically and can be opened in a browser from the GUI. + +## Source Usage + +If you want to run from source instead of using the releases: + +- run the Electron project from [windows/gui]() +- run the Windows Node CLI from [windows/cli]() +- run the Linux Node tools from [linux]() + +Do not commit `node_modules` or build output to GitHub. + +After cloning the repo, install dependencies locally only where they are needed. + +### Windows GUI From Source + +In [windows/gui](): + +```bash +npm install +npm start +``` + +To build: + +```bash +npm run build +``` + +If you clean the folder later or clone the repo on another machine, run `npm install` again in `windows/gui` to restore `node_modules`. + +The GUI source project expects these files in the same folder: + +- `orbis-pub-cmd.exe` +- `orbis-pub-prx.dll` +- `ext` + +### Windows CLI From Source + +In [windows/cli](): + +```bash +node node-menu.js +``` + +The Windows CLI runs directly with Node.js and does not need the Electron GUI `node_modules` folder. + +### Linux From Source + +In [linux](): + +```bash +node node-menu-linux.js +``` + +The Linux scripts also run directly with Node.js and do not use the Windows GUI dependencies. + +## Safety Note + +This project is designed for local or private network use. + +It should not be exposed directly to the public internet because it does not include authentication or security hardening for public hosting. + +Use at your own risk if hosting publicly. diff --git a/Start Server.bat b/Start Server.bat deleted file mode 100644 index e581e73..0000000 --- a/Start Server.bat +++ /dev/null @@ -1,4 +0,0 @@ -@echo off -echo Package Server -node server.js -pause \ No newline at end of file diff --git a/config.json b/config.json deleted file mode 100644 index 4a0ba1c..0000000 --- a/config.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "server": { - "ip": "0.0.0.0", - "port": 3000 - } -} \ No newline at end of file diff --git a/icon.png b/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..84b37b15c4b79530c499b750494d5fd024c8870d GIT binary patch literal 133236 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