const pendingSessions = new Map()
if (pendingSessions.has(from) && pendingSessions.get(from).action === 'hdvideo_split') {
const session = pendingSessions.get(from)
const resposta = body.trim().toLowerCase()
if (!['sim', 'não', 'nao', 's', 'n'].includes(resposta)) return
pendingSessions.delete(from)
const wantSplit = ['sim', 's'].includes(resposta)
const { videoLink, videoName, duracaoFormatada, total_partes, parts, statusKey } = session
try {
if (wantSplit) {
await zerotwo.sendMessage(from, { text: `🛠️ *Processando em HD...*\n\n📄 *Nome:* ${videoName}\n⏱️ *Duração:* ${duracaoFormatada}\n\n_Enviando ${total_partes} partes..._`, edit: statusKey })
for (let i = 0; i < parts.length; i++) {
await zerotwo.sendMessage(from, { text: `🛠️ *Processando HD...*\n\n📄 *Nome:* ${videoName}\n⏱️ *Duração total:* ${duracaoFormatada}\n\n_Enviando parte ${i + 1}/${total_partes}..._`, edit: statusKey })
const partRes = await axios({ url: parts[i], method: 'GET', responseType: 'arraybuffer', timeout: 120000 })
await zerotwo.sendMessage(from, { video: Buffer.from(partRes.data), caption: `✅ *Parte ${i + 1}/${total_partes}*\n\n📄 *Nome:* ${videoName}\n⏱️ *Duração total:* ${duracaoFormatada}\n\n_Qualidade HD preservada (Corte de 1:30)._`, mimetype: 'video/mp4' }, { quoted: { key: session.infoKey, message: session.infoMessage } })
console.log(chalk.cyan('[hdvideo]') + chalk.blue(` parte ${i + 1}/${total_partes} enviada`))
}
await zerotwo.sendMessage(from, { text: `✨ *Concluído!*\n\n📄 *Nome:* ${videoName}\n📦 *${total_partes} partes enviadas.*`, edit: statusKey })
} else {
await zerotwo.sendMessage(from, { text: `🛠️ *Processando em HD...*\n\n📄 *Nome:* ${videoName}\n⏱️ *Duração:* ${duracaoFormatada}\n\n_Enviando como arquivo único..._`, edit: statusKey })
const hdUrl = `${zerosite}/api/ia/tohdvideo?url=${encodeURIComponent(videoLink)}&apikey=${API_KEY_ZEROTWO}&split=false`
const hdResponse = await axios({ url: hdUrl, method: 'GET', responseType: 'arraybuffer', timeout: 300000 })
const hdBuffer = Buffer.from(hdResponse.data)
console.log(chalk.cyan('[hdvideo]') + chalk.green(` HD recebido: ${(hdBuffer.length / 1024 / 1024).toFixed(2)} MB`))
await zerotwo.sendMessage(from, { video: hdBuffer, caption: `✅ *Vídeo em HD*\n\n📄 *Nome:* ${videoName}\n⏱️ *Duração:* ${duracaoFormatada}\n\n_Qualidade aprimorada com sucesso!_`, mimetype: 'video/mp4' }, { quoted: { key: session.infoKey, message: session.infoMessage } })
await zerotwo.sendMessage(from, { text: `✨ *Concluído!*\n\n📄 *Nome:* ${videoName}\n⏱️ *Duração:* ${duracaoFormatada}`, edit: statusKey })
}
await zerotwo.sendMessage(from, { delete: statusKey })
console.log(chalk.cyan('[hdvideo]') + chalk.green(` sessão concluída para ${from} ✅`))
} catch (e) {
console.log(chalk.cyan('[hdvideo]') + chalk.red(` erro pós-sessão: ${e.message}`))
reply('❌ Erro no processamento: ' + e.message)
}
return
}
// INICIO DE COMANDO DE PREFIXO
switch (command) {
case 'hdvideo':
reagir(from, "✨")
try {//By: 𖧄 𝐋𝐔𝐂𝐀𝐒 𝐌𝐎𝐃 𝐃𝐎𝐌𝐈𝐍𝐀 𖧄
//Canal: https://whatsapp.com/channel/0029Vb69bDnAe5VmzSMwBH11
const isVideo = info.message.videoMessage || (info.message.documentMessage && info.message.documentMessage.mimetype?.includes('video'))
const isQuotedVideoDoc = isQuotedDocument && info.message.extendedTextMessage?.contextInfo?.quotedMessage?.documentMessage?.mimetype?.includes('video')
if (!(isVideo || isQuotedVideo || isQuotedVideoDoc)) return reply('Marque um vídeo ou um documento de vídeo para otimizar.')
let post
if (isQuotedVideo) {
post = info.message.extendedTextMessage?.contextInfo?.quotedMessage?.videoMessage
} else if (isQuotedVideoDoc) {
post = info.message.extendedTextMessage?.contextInfo?.quotedMessage?.documentMessage
} else {
post = info.message.videoMessage || info.message.documentMessage
}
if (!post || !post.mediaKey) return reply('❌ Não foi possível acessar a mídia. A mensagem pode ser muito antiga ou inválida.')
if (typeof post.mediaKey === 'string') {
post = { ...post, mediaKey: Buffer.from(post.mediaKey, 'base64') }
} else if (post.mediaKey && !Buffer.isBuffer(post.mediaKey)) {
post = { ...post, mediaKey: Buffer.from(post.mediaKey.data || Object.values(post.mediaKey)) }
}
const rawName = post.fileName || post.title || 'Video_sem_nome'
const videoName = rawName.replace(/\.[^/.]+$/, '').trim()
const mediaType = post.mimetype?.startsWith('video/') ? 'video' : 'document'
const msgKey = info.key?.id || 'sem-id'
const statusMsg = await zerotwo.sendMessage(from, { text: `🛠️ *Preparando vídeo...*\n\n📄 *Nome:* ${videoName}\n\n_Baixando mídia..._` }, { quoted: info })
const statusKey = statusMsg.key
let videoBuffer
try {
const videoStream = await downloadContentFromMessage(post, mediaType)
videoBuffer = Buffer.concat(await toArray(videoStream))
} catch {
videoBuffer = await downloadMediaMessage({
key: info.key,
message: isQuotedVideo ? { videoMessage: post } : { documentMessage: post }
}, 'buffer', {})
}
console.log(chalk.cyan('[hdvideo]') + chalk.green(` key=${msgKey} | buffer baixado: ${(videoBuffer.length / 1024 / 1024).toFixed(2)} MB`))
await zerotwo.sendMessage(from, { text: `🛠️ *Preparando vídeo...*\n\n📄 *Nome:* ${videoName}\n\n_Enviando para o servidor..._`, edit: statusKey })
const videoLink = await uploadapi(videoBuffer)
console.log(chalk.cyan('[hdvideo]') + chalk.blue(` key=${msgKey} | upload ok: ${videoLink}`))
await zerotwo.sendMessage(from, { text: `🛠️ *Preparando vídeo...*\n\n📄 *Nome:* ${videoName}\n\n_Criando job de processamento HD..._`, edit: statusKey })
const startRes = await axios({ url: `${zerosite}/api/ia/tohdvideo/start?url=${encodeURIComponent(videoLink)}&apikey=${API_KEY_ZEROTWO}&split=true`, method: 'GET', timeout: 180000 })
const { jobId } = startRes.data
if (!jobId) throw new Error('API não retornou jobId: ' + JSON.stringify(startRes.data))
console.log(chalk.cyan('[hdvideo]') + chalk.yellow(` key=${msgKey} | jobId: ${jobId}`))
const statusUrl = `${zerosite}/api/ia/tohdvideo/status?jobId=${jobId}&apikey=${API_KEY_ZEROTWO}`
const pollInterval = 8000
const pollTimeout = 15 * 60 * 1000
const pollStart = Date.now()
let jobDone = false
let jobResult = null
while (!jobDone) {
if (Date.now() - pollStart > pollTimeout) throw new Error('Timeout aguardando processamento do job.')
await new Promise(r => setTimeout(r, pollInterval))
const pollRes = await axios({ url: statusUrl, method: 'GET', timeout: 15000 })
const job = pollRes.data?.job
if (!job) throw new Error('Resposta inválida do status: ' + JSON.stringify(pollRes.data))
console.log(chalk.cyan('[hdvideo]') + chalk.gray(` key=${msgKey} | jobId=${jobId} | status=${job.status} | ${job.progress}%`))
if (job.status === 'error') throw new Error('Erro no processamento: ' + job.error)
if (job.status === 'done') { jobDone = true; jobResult = job.result; break }
await zerotwo.sendMessage(from, { text: `⚙️ *Processando em HD...*\n\n📄 *Nome:* ${videoName}\n\n_Progresso: ${job.progress}%_\n${'▓'.repeat(Math.floor(job.progress / 10))}${'░'.repeat(10 - Math.floor(job.progress / 10))} ${job.progress}%`, edit: statusKey })
}
const { duracao, duracaoFormatada, split: didSplit, total_partes, parts } = jobResult
console.log(chalk.cyan('[hdvideo]') + chalk.green(` key=${msgKey} | job done | duração: ${duracaoFormatada} | split: ${didSplit}`))
if (didSplit && duracao > 90) {
pendingSessions.set(from, {
action: 'hdvideo_split',
jobId,
videoLink,
videoName,
duracaoFormatada,
total_partes,
parts,
statusKey,
infoKey: info.key,
infoMessage: info.message
})
await zerotwo.sendMessage(from, { text: `⏱️ *Vídeo com ${duracaoFormatada} detectado!*\n\nDeseja dividir em *${total_partes} partes de 1:30* (ideal para Status do WhatsApp)?\n\nResponda *sim* ou *não*`, edit: statusKey })
console.log(chalk.cyan('[hdvideo]') + chalk.yellow(` key=${msgKey} | sessão pendente criada para ${from}`))
} else {
await zerotwo.sendMessage(from, { text: `🛠️ *Processando em HD...*\n\n📄 *Nome:* ${videoName}\n⏱️ *Duração:* ${duracaoFormatada}\n\n_Enviando..._`, edit: statusKey })
const dlUrl = `${zerosite}/api/ia/tohdvideo/download?jobId=${jobId}&apikey=${API_KEY_ZEROTWO}`
const hdResponse = await axios({ url: dlUrl, method: 'GET', responseType: 'arraybuffer', timeout: 300000 })
const hdBuffer = Buffer.from(hdResponse.data)
console.log(chalk.cyan('[hdvideo]') + chalk.green(` key=${msgKey} | HD recebido: ${(hdBuffer.length / 1024 / 1024).toFixed(2)} MB`))
await zerotwo.sendMessage(from, { video: hdBuffer, caption: `✅ *Vídeo em HD*\n\n📄 *Nome:* ${videoName}\n⏱️ *Duração:* ${duracaoFormatada}\n\n_Qualidade aprimorada com sucesso!_`, mimetype: 'video/mp4' }, { quoted: info })
await zerotwo.sendMessage(from, { text: `✨ *Concluído!*\n\n📄 *Nome:* ${videoName}\n⏱️ *Duração:* ${duracaoFormatada}`, edit: statusKey })
await zerotwo.sendMessage(from, { delete: statusKey })
console.log(chalk.cyan('[hdvideo]') + chalk.green(` key=${msgKey} | vídeo único enviado ✅`))
}
} catch (error) {
console.log(chalk.cyan('[hdvideo]') + chalk.red(` erro geral: ${error.message}`))
reply('❌ Erro no processamento: ' + error.message)
}
break