|
|
|
const settings_tab = require('../tab/settings') |
|
const { getPromptShortcut } = require('../html_manip') |
|
const general = require('../general') |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function convertMetadataToJson(metadata_str) { |
|
try { |
|
console.log('metadata_str:', metadata_str) |
|
const last_new_line_index = metadata_str.lastIndexOf('\n') |
|
|
|
const prompt = metadata_str.slice(0, last_new_line_index) |
|
const other_settings = metadata_str.slice(last_new_line_index + 1, -1) |
|
|
|
console.log('prompt:', prompt) |
|
console.log('other_settings:', other_settings) |
|
const sub_settings = other_settings.split(',') |
|
console.log('sub_settings: ', sub_settings) |
|
|
|
const settings_json = {} |
|
settings_json['prompt'] = prompt |
|
|
|
for (const setting of sub_settings) { |
|
let [key, value] = setting.split(':').map((s) => s.trimLeft()) |
|
|
|
|
|
settings_json[key] = value |
|
|
|
|
|
|
|
|
|
} |
|
|
|
return settings_json |
|
} catch (e) { |
|
console.warn(e) |
|
} |
|
} |
|
|
|
async function getAuto1111Metadata(base64_image) { |
|
try { |
|
console.log('getAuto1111Metadata: ') |
|
|
|
const full_url = `${g_sd_url}/sdapi/v1/png-info` |
|
|
|
const payload = { |
|
image: 'data:image/png;base64,' + base64_image, |
|
} |
|
let request = await fetch(full_url, { |
|
method: 'POST', |
|
headers: { |
|
Accept: 'application/json', |
|
'Content-Type': 'application/json', |
|
}, |
|
body: JSON.stringify(payload), |
|
}) |
|
|
|
let json = await request.json() |
|
console.log("json['info']:", json['info']) |
|
|
|
console.log('getAuto1111Metadata json:', json) |
|
|
|
return json['info'] |
|
} catch (e) { |
|
console.warn(e) |
|
} |
|
} |
|
async function convertToStandardResponse(settings, images, uuid) { |
|
try { |
|
|
|
const uniqueDocumentId = uuid |
|
|
|
const image_paths = [] |
|
|
|
const metadata = [] |
|
const images_info = [] |
|
|
|
for (i of images) { |
|
let auto_metadata_json = {} |
|
try { |
|
const auto_metadata_str = await getAuto1111Metadata(i) |
|
auto_metadata_json = convertMetadataToJson(auto_metadata_str) |
|
console.warn( |
|
'auto_metadata_json.Seed:', |
|
auto_metadata_json?.Seed |
|
) |
|
} catch (e) { |
|
console.warn(e) |
|
auto_metadata_json = {} |
|
} |
|
|
|
const image_name = general.newOutputImageName() |
|
const image_path = `${uniqueDocumentId}/${image_name}` |
|
|
|
images_info.push({ |
|
base64: i, |
|
path: image_path, |
|
auto_metadata: auto_metadata_json, |
|
}) |
|
|
|
} |
|
const dir_name = 'temp_dir_name' |
|
return { |
|
payload: settings, |
|
dir_name: dir_name, |
|
images_info: images_info, |
|
metadata: metadata, |
|
} |
|
} catch (e) { |
|
console.warn(e) |
|
} |
|
} |
|
function replacePromptsWithShortcuts( |
|
prompt, |
|
negative_prompt, |
|
prompt_shortcut_dic |
|
) { |
|
|
|
|
|
new_prompt = prompt_shortcut.replaceShortcut(prompt, prompt_shortcut_dic) |
|
|
|
new_negative_prompt = prompt_shortcut.replaceShortcut( |
|
negative_prompt, |
|
prompt_shortcut_dic |
|
) |
|
return [new_prompt, new_negative_prompt] |
|
} |
|
async function txt2ImgRequest(payload) { |
|
console.log('payload:', payload) |
|
|
|
if (payload['use_prompt_shortcut']) { |
|
const [new_prompt, new_negative_prompt] = replacePromptsWithShortcuts( |
|
payload['prompt'], |
|
payload['negative_prompt'], |
|
payload['prompt_shortcut_ui_dict'] |
|
) |
|
payload['prompt'] = new_prompt |
|
payload['negative_prompt'] = new_negative_prompt |
|
} |
|
|
|
const endpoint = 'sdapi/v1/txt2img' |
|
try { |
|
console.log('txt2ImgRequest(): about to send a fetch request') |
|
|
|
const full_url = `${g_sd_url}/${endpoint}` |
|
console.log(full_url) |
|
|
|
let request = await fetch(full_url, { |
|
method: 'POST', |
|
headers: { |
|
Accept: 'application/json', |
|
'Content-Type': 'application/json', |
|
}, |
|
body: JSON.stringify(payload), |
|
|
|
}) |
|
|
|
let r = await request.json() |
|
console.log('txt2ImgRequest json:', r) |
|
|
|
const uniqueDocumentId = payload['uniqueDocumentId'] |
|
|
|
|
|
const image_paths = [] |
|
|
|
const metadata = [] |
|
const images_info = [] |
|
|
|
for (i of r['images']) { |
|
let auto_metadata_json = {} |
|
try { |
|
const auto_metadata_str = await getAuto1111Metadata(i) |
|
auto_metadata_json = convertMetadataToJson(auto_metadata_str) |
|
console.warn( |
|
'auto_metadata_json.Seed:', |
|
auto_metadata_json?.Seed |
|
) |
|
} catch (e) { |
|
console.warn(e) |
|
auto_metadata_json = {} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
const image_name = general.newOutputImageName() |
|
const image_path = `${uniqueDocumentId}/${image_name}` |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
images_info.push({ |
|
base64: i, |
|
path: image_path, |
|
auto_metadata: auto_metadata_json, |
|
}) |
|
|
|
} |
|
const dir_name = 'temp_dir_name' |
|
return { |
|
payload: payload, |
|
dir_name: dir_name, |
|
images_info: images_info, |
|
metadata: metadata, |
|
} |
|
} catch (e) { |
|
console.warn(e) |
|
return {} |
|
} |
|
|
|
|
|
} |
|
function getExtensionUrl() { |
|
const extension_type = settings_tab.getExtensionType() |
|
let extension_url |
|
if (extension_type === 'auto1111_extension') { |
|
extension_url = `${g_sd_url}/sdapi/auto-photoshop-sd` |
|
} else if (extension_type === 'proxy_server') { |
|
extension_url = 'http://127.0.0.1:8000' |
|
} else { |
|
|
|
extension_url = '' |
|
} |
|
return extension_url |
|
} |
|
|
|
async function openUrlRequest(url) { |
|
try { |
|
const payload = { |
|
url: url, |
|
} |
|
|
|
const extension_url = getExtensionUrl() |
|
const full_url = `${extension_url}/open/url/` |
|
let request = await fetch(full_url, { |
|
method: 'POST', |
|
headers: { |
|
Accept: 'application/json', |
|
'Content-Type': 'application/json', |
|
}, |
|
body: JSON.stringify(payload), |
|
|
|
}) |
|
|
|
let r = await request.json() |
|
|
|
console.log('openUrlRequest json:', r) |
|
return r['url'] |
|
} catch (e) { |
|
console.warn(e) |
|
} |
|
} |
|
async function maskExpansionRequest(original_mask, mask_expansion_value) { |
|
|
|
|
|
|
|
try { |
|
const payload = { |
|
mask: original_mask, |
|
mask_expansion: mask_expansion_value, |
|
} |
|
|
|
const extension_url = getExtensionUrl() |
|
const full_url = `${extension_url}/mask/expansion/` |
|
let request = await fetch(full_url, { |
|
method: 'POST', |
|
headers: { |
|
Accept: 'application/json', |
|
'Content-Type': 'application/json', |
|
}, |
|
body: JSON.stringify(payload), |
|
|
|
}) |
|
|
|
let r = await request.json() |
|
|
|
console.log('maskExpansionRequest json:', r) |
|
return r['mask'] |
|
} catch (e) { |
|
console.warn(e) |
|
} |
|
} |
|
async function img2ImgRequest(sd_url, payload) { |
|
console.log('payload:', payload) |
|
|
|
if (payload['use_prompt_shortcut']) { |
|
const [new_prompt, new_negative_prompt] = replacePromptsWithShortcuts( |
|
payload['prompt'], |
|
payload['negative_prompt'], |
|
payload['prompt_shortcut_ui_dict'] |
|
) |
|
payload['prompt'] = new_prompt |
|
payload['negative_prompt'] = new_negative_prompt |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const endpoint = 'sdapi/v1/img2img' |
|
|
|
const full_url = `${sd_url}/${endpoint}` |
|
let request = await fetch(full_url, { |
|
method: 'POST', |
|
headers: { |
|
Accept: 'application/json', |
|
'Content-Type': 'application/json', |
|
}, |
|
body: JSON.stringify(payload), |
|
|
|
}) |
|
|
|
let r = await request.json() |
|
|
|
console.log('img2ImgRequest json:', r) |
|
|
|
const uniqueDocumentId = payload['uniqueDocumentId'] |
|
|
|
|
|
const image_paths = [] |
|
const metadata = [] |
|
const images_info = [] |
|
|
|
for (i of r['images']) { |
|
|
|
let auto_metadata_json = {} |
|
try { |
|
const auto_metadata_str = await getAuto1111Metadata(i) |
|
auto_metadata_json = convertMetadataToJson(auto_metadata_str) |
|
} catch (e) { |
|
console.warn(e) |
|
auto_metadata_json = {} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const image_name = general.newOutputImageName() |
|
const image_path = `${uniqueDocumentId}/${image_name}` |
|
|
|
images_info.push({ |
|
base64: i, |
|
path: image_path, |
|
auto_metadata: auto_metadata_json, |
|
}) |
|
|
|
} |
|
const dir_name = 'temp_dir_name' |
|
|
|
return { |
|
payload: payload, |
|
dir_name: dir_name, |
|
images_info: images_info, |
|
metadata: metadata, |
|
} |
|
} |
|
|
|
async function getOutputImagesEntries(doc_entry) { |
|
let entries = await doc_entry.getEntries() |
|
const output_images_entries = entries.filter( |
|
(e) => e.isFile && e.name.toLowerCase().includes('.png') |
|
) |
|
console.log('output_images_entries: ', output_images_entries) |
|
|
|
return output_images_entries |
|
} |
|
|
|
async function getMetaDataForOutputEntry(doc_entry, output_entry) { |
|
const json_file_name = `${output_entry.name.split('.')[0]}.json` |
|
|
|
try { |
|
const json_entry = await doc_entry.getEntry(json_file_name) |
|
if (json_entry) { |
|
|
|
|
|
const json = JSON.parse( |
|
await json_entry.read({ |
|
format: storage.formats.utf8, |
|
}) |
|
) |
|
return json |
|
} |
|
} catch (e) { |
|
console.warn(e) |
|
} |
|
return {} |
|
} |
|
async function loadHistory(payload) { |
|
|
|
const history = {} |
|
|
|
|
|
|
|
|
|
const uuid = await getUniqueDocumentId() |
|
const doc_entry = await getDocFolder(uuid) |
|
const output_images_entries = await getOutputImagesEntries(doc_entry) |
|
history['image_paths'] = [] |
|
history['metadata_jsons'] = [] |
|
history['base64_images'] = [] |
|
for (const output_entry of output_images_entries) { |
|
history['image_paths'].push(output_entry.name) |
|
const metadata_json = await getMetaDataForOutputEntry( |
|
doc_entry, |
|
output_entry |
|
) |
|
history['metadata_jsons'].push(metadata_json) |
|
|
|
const arrayBuffer = await output_entry.read({ format: formats.binary }) |
|
const base64_image = _arrayBufferToBase64(arrayBuffer) |
|
|
|
|
|
history['base64_images'].push(base64_image) |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return { |
|
image_paths: history['image_paths'], |
|
metadata_jsons: history['metadata_jsons'], |
|
base64_images: history['base64_images'], |
|
} |
|
} |
|
|
|
async function savePromptShortcut(json, file_name) { |
|
console.warn( |
|
"savePromptShortcut() is deprecated, use it's IO class instead " |
|
) |
|
try { |
|
const json_file_name = file_name |
|
|
|
const folder = await storage.localFileSystem.getDataFolder() |
|
|
|
const file = await folder.createFile(json_file_name, { |
|
type: storage.types.file, |
|
overwrite: true, |
|
}) |
|
|
|
const JSONInPrettyFormat = JSON.stringify(json, undefined, 4) |
|
await file.write(JSONInPrettyFormat, { |
|
format: storage.formats.utf8, |
|
append: false, |
|
}) |
|
} catch (e) { |
|
console.warn(e) |
|
} |
|
} |
|
|
|
async function loadPromptShortcut(file_name) { |
|
const json_file_name = file_name |
|
|
|
const folder = await storage.localFileSystem.getDataFolder() |
|
|
|
try { |
|
const json_entry = await folder.getEntry(json_file_name) |
|
if (json_entry) { |
|
|
|
|
|
const json = JSON.parse( |
|
await json_entry.read({ |
|
format: storage.formats.utf8, |
|
}) |
|
) |
|
return json |
|
} |
|
} catch (e) { |
|
console.warn(e) |
|
} |
|
} |
|
|
|
async function extraSingleImageRequest(sd_url, payload) { |
|
console.log('extraSingleImageRequest payload:', payload) |
|
|
|
const endpoint = 'sdapi/v1/extra-single-image' |
|
|
|
const full_url = `${sd_url}/${endpoint}` |
|
let request = await fetch(full_url, { |
|
method: 'POST', |
|
headers: { |
|
Accept: 'application/json', |
|
'Content-Type': 'application/json', |
|
}, |
|
body: JSON.stringify(payload), |
|
|
|
}) |
|
|
|
let r = await request.json() |
|
|
|
const images_info = [] |
|
|
|
const image = r['image'] |
|
|
|
let auto_metadata_json = {} |
|
|
|
const uniqueDocumentId = payload['uniqueDocumentId'] |
|
const image_name = general.newOutputImageName() |
|
const image_path = `${uniqueDocumentId}/${image_name}` |
|
|
|
images_info.push({ |
|
base64: image, |
|
path: image_path, |
|
auto_metadata: auto_metadata_json, |
|
}) |
|
|
|
console.log('extraSingleImageRequest response json:', r) |
|
|
|
const dir_name = 'temp_dir_name' |
|
const metadata = [] |
|
|
|
return { |
|
payload: payload, |
|
dir_name: dir_name, |
|
images_info: images_info, |
|
metadata: metadata, |
|
} |
|
} |
|
|
|
module.exports = { |
|
txt2ImgRequest, |
|
img2ImgRequest, |
|
loadHistory, |
|
maskExpansionRequest, |
|
getExtensionUrl, |
|
savePromptShortcut, |
|
loadPromptShortcut, |
|
|
|
convertMetadataToJson, |
|
openUrlRequest, |
|
replacePromptsWithShortcuts, |
|
extraSingleImageRequest, |
|
convertToStandardResponse, |
|
} |
|
|