| 119 | |
| 120 | |
| 121 | async def generate(prompt = None, options = None, quiet = False): # pylint: disable=redefined-outer-name |
| 122 | global sd # pylint: disable=global-statement |
| 123 | if options: |
| 124 | sd = Map(options) |
| 125 | if prompt is not None: |
| 126 | sd.generate.prompt = prompt |
| 127 | if not quiet: |
| 128 | log.info({ 'generate': sd.generate }) |
| 129 | if sd.get('options', None) is None: |
| 130 | sd['options'] = await get('/sdapi/v1/options') |
| 131 | names = [] |
| 132 | b64s = [] |
| 133 | images = [] |
| 134 | info = Map({}) |
| 135 | data = await post('/sdapi/v1/txt2img', sd.generate) |
| 136 | if 'error' in data: |
| 137 | log.error({ 'generate': data['error'], 'reason': data['reason'] }) |
| 138 | return Map({}) |
| 139 | info = Map(json.loads(data['info'])) |
| 140 | log.debug({ 'info': info }) |
| 141 | images = data['images'] |
| 142 | short = info.prompt[:min(len(info.prompt), 96)] # limit prompt part of filename to 64 chars |
| 143 | for i in range(len(images)): |
| 144 | b64s.append(images[i]) |
| 145 | images[i] = Image.open(io.BytesIO(base64.b64decode(images[i].split(',',1)[0]))) |
| 146 | name = '{seed:0>9} {short}'.format(short = short, seed = info.all_seeds[i]) # pylint: disable=consider-using-f-string |
| 147 | name = safestring(name) + '.jpg' |
| 148 | f = os.path.join(sd.paths.root, sd.paths.generate, name) |
| 149 | names.append(f) |
| 150 | if not quiet: |
| 151 | log.info({ 'image': { 'name': f, 'size': images[i].size } }) |
| 152 | images[i].save(f, 'JPEG', exif = exif(info, i), optimize = True, quality = 70) |
| 153 | return Map({ 'name': names, 'image': images, 'b64': b64s, 'info': info }) |
| 154 | |
| 155 | |
| 156 | async def upscale(data): |