web3-starter-py/small-projects/nft-traits-gen/gen_nfts.py
mvonsteinkirch 183d7d8841 💾
2023-02-07 10:41:38 -08:00

137 lines
3.7 KiB
Python

# -*- coding: utf-8 -*-
#!/usr/bin/env python3
import os
import sys
import random
from pathlib import Path
from dotenv import load_dotenv
from PIL import Image, ImageDraw, ImageFont
def create_dest_dir(final_dir):
"""Crete a destination dir for NFTs"""
try:
os.mkdir("nfts")
except FileExistsError:
return
def get_config(key, env_path=None):
"""Given a key, get the value from the env file.
Arguments:
key (str)
Return:
value(str)
"""
env_path = env_path or Path('.') / '.env'
load_dotenv(dotenv_path=env_path)
value = os.getenv(key)
if not value:
print('📛 Please set {} in .env'.format(key))
sys.exit(0)
return value
def open_trait_file(filename):
"""Open a file with a list of trait strings and return that list.
Arguments:
filename (str) - file to be open
Return:
items(list) - content of the file
"""
items = []
try:
with open(filename, "r") as f:
items = f.readlines()
items = [line.rstrip('\n') for line in items]
except IOError:
print("Could not open {}".format(filename))
sys.exit(1)
return items
def save_image(nft_num, this_nft):
"""Save the the list of strings in a NFT into an image.
Arguments:
nft_num(str) - this NFT id
this_nft(str) - the content of this nft
"""
img = Image.new('RGB', (600, 600), color=(255, 255, 255))
d = ImageDraw.Draw(img)
fnt = ImageFont.truetype("Roboto-Medium.ttf", 30)
d.text((20, 150), this_nft, font=fnt, fill=(0, 0, 0))
d.text((550, 30), "#{}".format(str(nft_num)), font=fnt, fill=(0, 0, 0))
try:
nft_name = "nft_{}.png".format(str(nft_num))
img.save(nft_name)
except:
print("Could not save {0} with {1}".format(nft_num, this_nft))
def get_traits_list(num_trait_lines):
"""Return a multi-dimensional array with every trait list.
Arguments:
num_trait_lines(str) - the number of trait lines in one nft
Returns:
the final string for NFT
"""
trait_file_str = get_config("TRAIT_FILE_STR")
traits_list = []
for n in range(int(num_trait_lines)):
trait_file = trait_file_str.format(n)
traits_list.append(open_trait_file(trait_file))
return traits_list
def get_this_nft(num_trait_lines, traits_list):
""" Get the random content of one NFT.
Arguments:
num_trait_lines (str) - the number of trait lines in one nft
traits_list (list) - multi-dimensional list with all traits
Return:
this_nft (list) - what composes the current NFT
"""
this_nft = []
for n in range(int(num_trait_lines)):
this_trait_list = traits_list[n]
random_trait_n = random.randint(0, len(this_trait_list)-1)
random_trait_str = this_trait_list[random_trait_n]
this_nft.append(random_trait_str)
return "\n".join(this_nft)
def generate_nfts(num_edition, num_trait_lines, traits_list):
"""Create and save NFT images
Arguments:
num_edition(str) - num of NFTs to be generated
num_trait_lines (str) - the number of trait lines in one nft
traits_list (list) - multi-dimensional list with all traits
"""
for n in range(1, int(num_edition) + 1):
this_nft = get_this_nft(num_trait_lines, traits_list)
save_image(n, this_nft)
def main():
num_trait_lines = get_config("NUM_TRAIT_LINES")
final_dir = get_config("FINAL_DIR")
num_edition = get_config("NUM_EDITION")
create_dest_dir(final_dir)
traits_list = get_traits_list(num_trait_lines)
generate_nfts(num_edition, num_trait_lines, traits_list)
if __name__ == "__main__":
main()