Skip to content

Add a manifest generator - #60

Open
XK9274 wants to merge 3 commits into
mainfrom
add-release-manifest
Open

Add a manifest generator#60
XK9274 wants to merge 3 commits into
mainfrom
add-release-manifest

Conversation

@XK9274

@XK9274 XK9274 commented Aug 24, 2026

Copy link
Copy Markdown
Member

Add support for a manifest generator that runs as part of a release. Creates a json manifest that can be picked up via: "https://github.com/OnionUI/Ports-Collection/releases/latest/download/ports-manifest.json"

For each port, the manifest includes:

  • Identity — id, display name, category (engine if it requires user-supplied files, otherwise complete)
  • Archive — filename, direct download URL, size in bytes, SHA-256 checksum
  • Icons — path and raw-content URL for each Imgs/*.png
  • Shortcuts — one entry per .port/.notfound launcher: menu category, launcher type (RetroArch core, standalone, Python, etc.), parsed configuration fields (game name, executable, data file, arguments, etc.), and captured environment variables
  • Required files — path and full text of any _required_files.txt (lists external assets the user must supply)
  • Runtime libraries — relative paths of bundled lib/ files
  • Documentation — license/credits/authors/copyright files found in the port
  • Manuals — any files under Manuals/
  • Source stats — file count and total size of the port's source tree

Top-level manifest also carries schema version, generation timestamp, repository, source commit, and the release's own tag/version/archive metadata (aggregate .7z, URL, size, checksum).

@XK9274

XK9274 commented Aug 25, 2026

Copy link
Copy Markdown
Member Author

Here's an example output.

This is for later date the road if we ever need to pull from this repo on device.

{
  "schema_version": 1,
  "ports": [
    {
      "id": "DOOM I - Ultimate (1993-95) (PrBoom)",
      "name": "DOOM I - Ultimate (1993-95) (PrBoom)",
      "category": "engine",
      "requires_user_files": true,
      "archive": {
        "filename": "DOOM I - Ultimate (1993-95) (PrBoom).7z",
        "url": "https://github.com/OnionUI/Ports-Collection/releases/download/v1.1.0/DOOM.I.-.Ultimate.1993-95.PrBoom.7z",
        "size_bytes": 2094573,
        "sha256": "6751d72a4251f41dbc9d5c1cfa9c1db6bbfd00365cba6ac59c89b0fa7931ad50"
      },
      "icons": [
        {
          "path": "DOOM I - Ultimate (1993-95) (PrBoom)/Roms/PORTS/Imgs/1 DOOM I - Ultimate (1993-95).png",
          "url": "https://github.com/OnionUI/Ports-Collection/raw/v1.1.0/DOOM%20I%20-%20Ultimate%20%281993-95%29%20%28PrBoom%29/Roms/PORTS/Imgs/1%20DOOM%20I%20-%20Ultimate%20%281993-95%29.png"
        }
      ],
      "shortcuts": [
        {
          "path": "Roms/PORTS/Shortcuts/FPS - Doom Collection (PrBoom)/1 DOOM I - Ultimate (1993-95).notfound",
          "menu_category": "FPS - Doom Collection (PrBoom)",
          "launcher_type": "retroarch",
          "configuration": {
            "GameName": "DOOM Ultimate (PrBoom)",
            "Core": "prboom",
            "RomDir": "Doom (PrBoom)/doom",
            "RomFile": "doomu.wad",
            "Arguments": "",
            "KillAudioserver": "0",
            "PerformanceMode": "0"
          },
          "environment": {}
        }
      ],
      "required_files": [
        {
          "path": "Roms/PORTS/Games/Doom (PrBoom)/_required_files.txt",
          "lines": [
            "Directory tree for \"Doom (PrBoom)\"",
            "|",
            "|   _required_files.txt",
            "|   ",
            "+---doom",
            "|       doomu.wad",
            "|       FFdoom2.wad",
            "|       Ldsprts.wad",
            "|       SIGIL_v1_21.wad",
            "|       ",
            "+---doom2",
            "|       blood.wad",
            "|       counterstrike.wad",
            "|       doom2.wad",
            "|       FISTFUL.WAD",
            "|       goldeneye.wad",
            "|       Hld2.wad",
            "|       MASTERLEVELS.WAD",
            "|       NERVE.WAD",
            "|       stardoom.wad",
            "|       ulsimpdm.wad",
            "|       ",
            "+---plutonia",
            "|       PLUTONIA.WAD",
            "|       ",
            "\\---tnt",
            "        TNT.WAD",
            "        "
          ]
        }
      ],
      "runtime_libraries": [],
      "documentation": [],
      "manuals": [],
      "source": {
        "file_count": 6,
        "size_bytes": 2455134
      }
    },
    {
      "id": "C-Dogs",
      "name": "C-Dogs",
      "category": "complete",
      "requires_user_files": false,
      "archive": {
        "filename": "C-Dogs.7z",
        "url": "https://github.com/OnionUI/Ports-Collection/releases/download/v1.1.0/C-Dogs.7z",
        "size_bytes": 16995491,
        "sha256": "54f785e1c2960ba675c042611684f3035df1a5b664841a5279d9fff49d93a58e"
      },
      "icons": [
        {
          "path": "C-Dogs/Roms/PORTS/Imgs/C-Dogs.png",
          "url": "https://github.com/OnionUI/Ports-Collection/raw/v1.1.0/C-Dogs/Roms/PORTS/Imgs/C-Dogs.png"
        }
      ],
      "shortcuts": [
        {
          "path": "Roms/PORTS/Shortcuts/Action/C-Dogs.notfound",
          "menu_category": "Action",
          "launcher_type": "standalone",
          "configuration": {
            "GameName": "C-Dogs (Port)",
            "GameDir": "C-Dogs",
            "GameExecutable": "cdogs-sdl",
            "GameDataFile": "",
            "Arguments": "",
            "KillAudioserver": "0",
            "PerformanceMode": "1"
          },
          "environment": {
            "ParasytePath": "/mnt/SDCARD/.tmp_update/lib/parasyte",
            "LD_LIBRARY_PATH": "$ParasytePath:$LD_LIBRARY_PATH"
          }
        }
      ],
      "required_files": [],
      "runtime_libraries": [],
      "documentation": [
        "Roms/PORTS/Games/C-Dogs/doc/AUTHORS",
        "Roms/PORTS/Games/C-Dogs/doc/COPYING.BSD",
        "Roms/PORTS/Games/C-Dogs/doc/COPYING.GPL",
        "Roms/PORTS/Games/C-Dogs/doc/CREDITS",
        "Roms/PORTS/Games/C-Dogs/dogfights/dwango5_map01.cdogscpn/licenses.txt",
        "Roms/PORTS/Games/C-Dogs/dogfights/map07.cdogscpn/licenses.txt",
        "Roms/PORTS/Games/C-Dogs/graphics/LICENSE.md",
        "Roms/PORTS/Games/C-Dogs/missions/sauer2/LICENSE.txt",
        "Roms/PORTS/Games/C-Dogs/sounds/footsteps/license.txt"
      ],
      "manuals": [
        "C-Dogs.pdf"
      ],
      "source": {
        "file_count": 1234,
        "size_bytes": 22259275
      }
    },
    {
      "id": "Vvvvvv",
      "name": "Vvvvvv",
      "category": "engine",
      "requires_user_files": true,
      "archive": {
        "filename": "Vvvvvv.7z",
        "url": "https://github.com/OnionUI/Ports-Collection/releases/download/v1.1.0/Vvvvvv.7z",
        "size_bytes": 909675,
        "sha256": "8572a4f352eec22ab05914d515bb038fa6de041f12537198bf1215699b55230f"
      },
      "icons": [
        {
          "path": "Vvvvvv/Roms/PORTS/Imgs/Vvvvvv.png",
          "url": "https://github.com/OnionUI/Ports-Collection/raw/v1.1.0/Vvvvvv/Roms/PORTS/Imgs/Vvvvvv.png"
        }
      ],
      "shortcuts": [
        {
          "path": "Roms/PORTS/Shortcuts/Platform/Vvvvvv.notfound",
          "menu_category": "Platform",
          "launcher_type": "standalone",
          "configuration": {
            "GameName": "Vvvvvv (Port)",
            "GameDir": "Vvvvvv",
            "GameExecutable": "vvv_sdl12",
            "GameDataFile": "",
            "Arguments": "",
            "KillAudioserver": "0",
            "PerformanceMode": "0"
          },
          "environment": {}
        }
      ],
      "required_files": [
        {
          "path": "Roms/PORTS/Games/Vvvvvv/_required_files.txt",
          "lines": [
            "/mnt/SDCARD/Roms/PORTS/VVVVV/Games #",
            ".",
            "`-- Vvvvvv",
            "    |-- .vvvvvv",
            "    |   |-- levels",
            "    |   |   `-- .gitkeep",
            "    |   `-- saves",
            "    |       `-- unlock.vvv",
            "    |-- PLACE\\ data.zip\\ HERE.txt",
            "    |-- data.zip << - Provide this file",
            "    |-- libSDL-1.2.so.0",
            "    `-- vvv_sdl12"
          ]
        }
      ],
      "runtime_libraries": [],
      "documentation": [],
      "manuals": [],
      "source": {
        "file_count": 9,
        "size_bytes": 4660538
      }
    },
    {
      "id": "2048",
      "name": "2048",
      "category": "complete",
      "requires_user_files": false,
      "archive": {
        "filename": "2048.7z",
        "url": "https://github.com/OnionUI/Ports-Collection/releases/download/v1.1.0/2048.7z",
        "size_bytes": 215187,
        "sha256": "f59a4f44de4511b4ee47be9e7ad812941aa7d5220949029c6829d0f34b012f81"
      },
      "icons": [
        {
          "path": "2048/Roms/PORTS/Imgs/2048.png",
          "url": "https://github.com/OnionUI/Ports-Collection/raw/v1.1.0/2048/Roms/PORTS/Imgs/2048.png"
        }
      ],
      "shortcuts": [
        {
          "path": "Roms/PORTS/Shortcuts/Puzzle games/2048.notfound",
          "menu_category": "Puzzle games",
          "launcher_type": "retroarch",
          "configuration": {
            "GameName": "2048 (Port)",
            "Core": "2048",
            "RomDir": "",
            "RomFile": "",
            "Arguments": "",
            "KillAudioserver": "0",
            "PerformanceMode": "0"
          },
          "environment": {}
        }
      ],
      "required_files": [],
      "runtime_libraries": [],
      "documentation": [],
      "manuals": [
        "2048.pdf"
      ],
      "source": {
        "file_count": 3,
        "size_bytes": 226915
      }
    },
    {
      "id": "Bfruit (PyGame)",
      "name": "Bfruit (PyGame)",
      "category": "complete",
      "requires_user_files": false,
      "archive": {
        "filename": "Bfruit (PyGame).7z",
        "url": "https://github.com/OnionUI/Ports-Collection/releases/download/v1.1.0/Bfruit.PyGame.7z",
        "size_bytes": 3224541,
        "sha256": "42ef8e06b88854b1c987656288e89c59ba2cc0485f6e8b6bc4af321c285702bf"
      },
      "icons": [
        {
          "path": "Bfruit (PyGame)/Roms/PORTS/Imgs/Bfruit (PyGame).png",
          "url": "https://github.com/OnionUI/Ports-Collection/raw/v1.1.0/Bfruit%20%28PyGame%29/Roms/PORTS/Imgs/Bfruit%20%28PyGame%29.png"
        }
      ],
      "shortcuts": [
        {
          "path": "Roms/PORTS/Shortcuts/Action/Bfruit (PyGame).notfound",
          "menu_category": "Action",
          "launcher_type": "python2",
          "configuration": {
            "GameName": "Bfruit (Port - PyGame)",
            "GameDir": "Bfruit (PyGame)",
            "GameExecutable": "bfruit.py",
            "GameDataFile": "",
            "Arguments": "",
            "KillAudioserver": "1",
            "PerformanceMode": "0"
          },
          "environment": {}
        }
      ],
      "required_files": [],
      "runtime_libraries": [],
      "documentation": [],
      "manuals": [
        "Bfruit (PyGame).pdf"
      ],
      "source": {
        "file_count": 34,
        "size_bytes": 6851495
      }
    }
  ]
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant