DashX-API / plugins /img2pixel.js
HerzaJ's picture
Create img2pixel.js
39e65f6 verified
const axios = require('axios');
const fs = require('fs');
const os = require('os');
const path = require('path');
async function img2pixel(imgUrl) {
let tempFilePath = null;
try {
const response = await axios.get(imgUrl, {
responseType: 'arraybuffer',
timeout: 30000
});
const imageBuffer = Buffer.from(response.data);
const tempFileName = `img2pixel_${Date.now()}_${Math.random().toString(36).substring(7)}.jpg`;
tempFilePath = path.join(os.tmpdir(), tempFileName);
fs.writeFileSync(tempFilePath, imageBuffer);
const filename = imgUrl.split('/').pop().split('?')[0] || tempFileName;
const contentType = 'image/jpeg';
const presignedResponse = await axios.post(
'https://pixelartgenerator.app/api/upload/presigned-url',
{
filename: filename,
contentType: contentType,
type: 'pixel-art-source'
},
{
headers: {
'Content-Type': 'application/json'
}
}
);
const { uploadUrl, key, publicUrl } = presignedResponse.data.data;
await axios.put(uploadUrl, imageBuffer, {
headers: {
'Content-Type': contentType
}
});
if (tempFilePath && fs.existsSync(tempFilePath)) {
fs.unlinkSync(tempFilePath);
tempFilePath = null;
}
const generateResponse = await axios.post(
'https://pixelartgenerator.app/api/pixel/generate',
{
size: '1:1',
type: 'image',
imageKey: key,
prompt: ''
},
{
headers: {
'Content-Type': 'application/json'
}
}
);
const { taskId } = generateResponse.data.data;
let attempts = 0;
const maxAttempts = 60;
while (attempts < maxAttempts) {
const statusResponse = await axios.get(
`https://pixelartgenerator.app/api/pixel/status?taskId=${taskId}`
);
const { status, progress, images, error } = statusResponse.data.data;
if (status === 'SUCCESS' && images.length > 0) {
return images[0];
}
if (error) {
throw new Error(`Generation failed: ${error}`);
}
attempts++;
await new Promise(resolve => setTimeout(resolve, 3000));
}
throw new Error('Timeout: Generation took too long');
} catch (error) {
if (tempFilePath && fs.existsSync(tempFilePath)) {
try {
fs.unlinkSync(tempFilePath);
} catch (cleanupError) {
console.error('Failed to cleanup temp file:', cleanupError);
}
}
throw new Error(`img2pixel error: ${error.message}`);
}
}
const handler = async (req, res) => {
try {
const { img, key } = req.query;
if (!img) {
return res.status(400).json({
author: "Herza",
success: false,
error: 'Missing required parameter: img (image URL)'
});
}
if (!key) {
return res.status(400).json({
author: "Herza",
success: false,
error: 'Missing required parameter: key'
});
}
try {
new URL(img);
} catch (e) {
return res.status(400).json({
author: "Herza",
success: false,
error: 'Invalid image URL format'
});
}
const result = await img2pixel(img);
res.json({
author: "Herza",
success: true,
data: {
result: result
}
});
} catch (error) {
res.status(500).json({
author: "Herza",
success: false,
error: error.message
});
}
};
module.exports = {
name: 'Image to Pixel Art',
description: 'Convert image to pixel art style',
type: 'GET',
routes: ['api/AI/img2pixel'],
tags: ['ai', 'image', 'pixel-art'],
main: ['AI'],
parameters: ['img', 'key'],
enabled: true,
handler
};