dream-api
Version:
API wrapper for Wombo Dream
212 lines (192 loc) • 6.99 kB
JavaScript
const axios = require('axios').default;
const { printTable } = require('console-table-printer');
const API_URL = "https://api.luan.tools/api/tasks/"
const STYLE_URL = "https://api.luan.tools/api/styles/"
function defineHeaders(token, type = "text/plain;charset=UTF-8") {
return {
'Origin': 'https://dream.ai',
'Referer': 'https://dream.ai/',
'Authorization': 'bearer ' + token,
'Content-Type': type,
'service': 'Dream'
};
}
const getStyles = () => {
return new Promise(function(resolve, reject) {
axios.get(STYLE_URL)
.then(function(response) {
resolve(response.data);
})
.catch(function(error) {
reject(error);
});
});
}
const printStyles = async() => {
let styles = await getStyles();
styles.forEach(style => {
delete style.is_visible;
delete style.created_at;
delete style.updated_at;
delete style.deleted_at;
});
styles.sort((a, b) => (a.id > b.id) ? 1 : -1)
printTable(styles);
}
// Create a new task ID and get upload URL if specified
const createTaskID = (token, image = false) => {
image = image ? true : false;
var jsonData = {
"use_target_image": image
};
return new Promise(function(resolve, reject) {
axios.post(API_URL, jsonData, {
headers: defineHeaders(token, "application/json")
})
.then(function(response) {
resolve(response.data);
})
.catch(function(error) {
reject(error.response.data);
});
});
}
// Upload photo to upload URL
const uploadPhoto = async(imagePath, targetImageURL) => {
let FormData = require('form-data');
let fs = require('fs');
var form_data = new FormData();
return new Promise(function(resolve, reject) {
Object.entries(targetImageURL.fields).forEach(([field, value]) => {
form_data.append(field, value);
});
form_data.append("file", fs.createReadStream(imagePath));
form_data.submit(targetImageURL.url, (err, res) => {
if (err) reject(err)
else resolve(res.statusCode)
});
});
}
// Using the new task ID, supply a prompt and start the image generation process.
const createTask = (token, taskID, prompt, style_id, weight = "MEDIUM", width = 950, height = 1560) => {
switch (typeof weight) {
case 'string':
if (weight == "LOW") {
weight = 0.1;
} else if (weight == "HIGH") {
weight = 1.0;
} else {
weight = 0.5;
}
break;
case 'number':
if (weight < 0 || weight > 1) {
weight = 0.5;
}
break;
default:
weight = 0.5;
break;
}
var jsonData = {
'input_spec': {
'style': style_id,
'prompt': prompt,
'target_image_weight': weight,
'width': width,
'height': height
}
};
return new Promise(function(resolve, reject) {
axios.put(API_URL + taskID, jsonData, {
headers: defineHeaders(token, "application/json")
})
.then(function(response) {
resolve(response.data);
})
.catch(function(error) {
reject(error.response.data);
});
});
}
// Check the status of the task. This function returns all data including progress photos and result.
const checkStatus = async(token, taskID, interval = null, callback = null) => {
return new Promise(async function(resolve, reject) {
if (interval == null) {
axios.get(API_URL + taskID, {
headers: defineHeaders(token, "application/json")
})
.then(function(response) {
if (callback && typeof callback === 'function') {
callback(response.data);
}
resolve(response.data);
})
.catch(function(error) {
reject(error);
});
} else {
if (typeof interval !== 'number') {
interval = 1000;
}
axios.get(API_URL + taskID, {
headers: defineHeaders(token, "application/json")
})
.then(async function(response) {
var result = response.data;
if (callback && typeof callback === 'function') {
callback(result);
}
while (result.state != "completed" && result.state != "failed") { // While the task is still generating
try {
result = (await axios.get(API_URL + taskID, { headers: defineHeaders(token, "application/json") })).data;
} catch (error) {
reject(error);
}
if (result.state != "completed" && result.state != "failed") {
if (callback && typeof callback === 'function') {
callback(result);
}
}
await new Promise(resolve => setTimeout(resolve, interval));
}
resolve(result);
})
.catch(function(error) {
reject(error);
});
}
});
}
const generateImage = async(style, promptValue, token, image = null, weight = "MEDIUM", width = 950, height = 1560, callback = null, interval = 1000) => {
try {
let task = await createTaskID(token, image ? true : false); // Create the task
let taskID = task.id;
if (image != null && task.target_image_url) {
let imageResult = await uploadPhoto(image, task.target_image_url);
}
let result = await createTask(token, taskID, promptValue, style, weight, width, height)
if (callback && typeof callback === 'function') {
callback(result);
} else {
console.log("creating task...");
}
result = await checkStatus(token, taskID, interval, (result) => {
if (callback && typeof callback === 'function') {
callback(result);
} else {
console.log("generating...");
}
});
return result
} catch (error) {
console.error(error);
}
}
exports.getStyles = getStyles;
exports.printStyles = printStyles;
exports.uploadPhoto = uploadPhoto;
exports.createTaskID = createTaskID;
exports.createTask = createTask;
exports.checkStatus = checkStatus;
exports.generateImage = generateImage;