vellzyy / Fork of image to prompt plugin type esm
mengubah gambar ke prompt base : nanobana pro
9 views
mengubah gambar ke prompt base : nanobana pro
/*
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✦ *Nama Plugin:* ImgToPrompt
✦ *Tipe:* Plugin Esm
✦ *Author:* BINTANG (scraper), Akaheb (plugin)
✦ *Fungsi:* Generate AI prompt dari gambar
✦ *Cara:* Kirim/reply gambar + .imgtoprompt
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
*/
const BASE_URL = 'https://aiconvert.online/api'
const USER_AGENT = 'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Mobile Safari/537.36'
const tunggu = (ms) => new Promise(r => setTimeout(r, ms))
const kirimGambar = async (base64, mimeType) => {
const res = await fetch(`${BASE_URL}/submit-prompt-job`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'User-Agent': USER_AGENT,
'Referer': 'https://aiconvert.online/prompt-generator'
},
body: JSON.stringify({
imageData: base64,
mimeType,
language: 'en',
promptType: 'nano-banana-pro'
})
})
return res.json()
}
const cekStatus = async (taskId) => {
const res = await fetch(`${BASE_URL}/check-status-kv?taskId=${taskId}`, {
headers: {
'User-Agent': USER_AGENT,
'Referer': 'https://aiconvert.online/prompt-generator'
}
})
return res.json()
}
let handler = async (m, { conn, usedPrefix, command }) => {
const q = m.quoted ? m.quoted : m
const mime = (q.msg || q).mimetype || ''
if (!mime.includes('image')) {
return m.reply(`*🖼️ CARA PAKAI IMGTOPROMPT*
Kirim gambar dengan caption:
*${usedPrefix + command}*
Atau reply gambar dengan:
*${usedPrefix + command}*
Bot akan generate AI prompt dari gambar tersebut menggunakan Nano Banana Pro.`)
}
await m.react('⏳')
await m.reply('🔍 *Menganalisis gambar...*')
try {
// Download gambar
let imgBuffer
try {
imgBuffer = await q.download()
} catch {
try { imgBuffer = await q.msg?.download?.() } catch {}
}
if (!imgBuffer || !imgBuffer.length) throw new Error('Gagal mengunduh gambar')
// Deteksi mime type dari buffer magic bytes
let mimeType = 'image/jpeg'
if (imgBuffer[0] === 0x89 && imgBuffer[1] === 0x50) mimeType = 'image/png'
else if (imgBuffer[0] === 0x47 && imgBuffer[1] === 0x49) mimeType = 'image/gif'
else if (imgBuffer[0] === 0x52 && imgBuffer[1] === 0x49) mimeType = 'image/webp'
const base64 = imgBuffer.toString('base64')
// Submit gambar
const submit = await kirimGambar(base64, mimeType)
if (!submit?.taskId) {
throw new Error(submit?.message || 'Gagal submit gambar ke server')
}
const taskId = submit.taskId
await m.reply(`📤 *Gambar diterima!*\nNano Banana Pro sedang memproses...\n🆔 Task: \`${taskId}\``)
// Polling status max 35x dengan jeda 2 detik
let prompt = null
for (let i = 0; i < 35; i++) {
await tunggu(2000)
const status = await cekStatus(taskId).catch(() => null)
if (!status) continue
if (status.status === 'SUCCESS' && status.result?.generatedPrompt) {
prompt = status.result.generatedPrompt
break
}
if (status.status === 'FAILED') {
throw new Error(status.message || 'Server gagal memproses gambar')
}
// PENDING / PROCESSING → lanjut polling
}
if (!prompt) throw new Error('Waktu habis, prompt tidak kunjung selesai. Coba lagi.')
await m.react('✅')
await conn.sendMessage(m.chat, {
text: `✨ *ImgToPrompt Result*\n\n📝 *Generated Prompt:*\n\`\`\`\n${prompt}\n\`\`\`\n\n_Powered by Nano Banana Pro_`
}, { quoted: m })
} catch (err) {
await m.react('❌')
await m.reply(`❌ *Gagal generate prompt:*\n${err.message}`)
}
}
handler.help = ['imgtoprompt']
handler.tags = ['tools']
handler.command = /^(imgtoprompt|img2prompt|imageprompt|i2p)$/i
handler.premium = false
handler.register = true
handler.limit = true
export default handler