Jon-Becker / nft-generator-py

This tool allows users to generate sets of unique images and metadata using weighted layer collections.
MIT License
301 stars 127 forks source link
blockchain ethereum generative-art metaverse nft python

nft-generator-py

preview

Unit Tests (on PR)

nft-generator-py is a simple script which programatically generates images using weighted layer files.

Getting Started

Clone the repository and install the requirements.

git clone https://github.com/Jon-Becker/nft-generator-py
cd nft-generator-py
python3 -m pip install -r requirements.txt

Create a configuration file, or use the build_configuration command to create a configuration file from a directory of traits. For more information on configuration files, see Configuration.

CLI Options

The following commands are available: Command Usage Description
generate python3 main.py generate --config <config> [options] Generates a set of images using the provided configuration file.
build_config python3 main.py build_config --trait-dir <trait_dir> [options] Builds a configuration file from a directory of traits.
validate python3 main.py validate --config <config> [options] Validates a configuration file.
update_metadata python3 main.py update_metadata --image-path <config> [options] Updates the metadata files for all generated images at the provided --output path.

Optional Arguments

Argument Description
-o <output>, --output <output> The path to the directory where the generated images will be saved.
-c <config>, --config <config> The path to the configuration file.
--trait-dir <trait_dir> The path to the directory containing the trait images.
-n <amount>, --amount <amount> The number of images to generate.
-v, --verbose Enables verbose logging.
--start-at <start_at> The number to start counting from when generating images.
--allow-duplicates Allows duplicate images to be generated.
--no-pad Disables zero-padding of tokenIds.
-s <seed>, --seed <seed> The seed to use when generating images. Allows for reproducible results.

Configuration

{
  "layers": [
    {
      "name": "Background",
      "values": ["Blue", "Orange", "Purple", "Red", "Yellow"],
      "trait_path": "./trait-layers/backgrounds",
      "filename": ["blue", "orange", "purple", "red", "yellow"],
      "weights": [30, 45, 15, 5, 10]
    },
    ...
  ],
  "incompatibilities": [
    {
      "layer": "Background",
      "value": "Blue",
      "incompatible_with": ["Python Logo 2"],
      "default": {
        "value": "Default Incompatibility",
        "filename": "./trait-layers/foreground/logo"
      }
    }
  ],
  "baseURI": ".",
  "name": "NFT #",
  "description": "This is a description for this NFT series."
}

The config object is a dict that contains configuration instructions that can be changed to produce different outputs when running the program. Within metadata files, tokens are named using the configuration's name parameter, and described using the description parameter.

The layers list contains layer objects that define the layers for the program to use when generating unique tokens. Each layer has a name, which will be displayed as an attribute, values, trait_path, filename, and weights.

The incompatibilities list contains an object that tells the program what layers are incompatible with what. In the above configuration, A Blue Background layer will never be generated with Python Logo 2.

Troubleshooting

Contributing

Before contributing, make a new branch with the following format:

user/{username}/{description}

Your names should be descriptive of the changes you are making. For example, if you are adding a new command, your branch name might be user/jon-becker/some-new-command.

Your code will be reviewed and require at least one approval before being merged into the main branch.

Please follow this guide when writing commit messages. Messages should be descriptive and clean.