Adiciona ferramenta VideoMind para transcrição e análise de vídeos com resumo customizado

This commit is contained in:
2026-06-04 23:37:53 +00:00
parent a53496cd3f
commit 6866d565ec
16 changed files with 1183 additions and 2 deletions
+98
View File
@@ -4,6 +4,7 @@ const cookieParser = require('cookie-parser');
const path = require('path');
const multer = require('multer');
const { MsEdgeTTS, OUTPUT_FORMAT } = require('msedge-tts');
const { YoutubeTranscript } = require('youtube-transcript');
const app = express();
const PORT = process.env.PORT || 3000;
@@ -691,6 +692,103 @@ app.delete('/api/comics/projects/:id', requireAuth, async (req, res) => {
}
});
// ============================================================
// ROTAS DO VIDEOMIND (TRANSCRIÇÃO E ANÁLISE DE VÍDEO)
// ============================================================
function getYouTubeId(url) {
const regExp = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/;
const match = url.match(regExp);
return (match && match[2].length === 11) ? match[2] : null;
}
app.post('/api/videomind/analyze', requireAuth, async (req, res) => {
const { url, lines } = req.body;
if (!url) {
return res.status(400).json({ error: 'A URL do vídeo é obrigatória.' });
}
const videoId = getYouTubeId(url);
if (!videoId) {
return res.status(400).json({ error: 'A URL inserida não é uma URL válida do YouTube.' });
}
const numLines = parseInt(lines) || 20;
let transcriptText = '';
let metadata = {
title: 'Vídeo do YouTube',
author: 'Desconhecido',
thumbnail: `https://img.youtube.com/vi/${videoId}/hqdefault.jpg`
};
try {
// Tenta obter metadados via oEmbed oficial do YouTube
const oEmbedUrl = `https://www.youtube.com/oembed?url=https://www.youtube.com/watch?v=${videoId}&format=json`;
const oEmbedResp = await fetch(oEmbedUrl);
if (oEmbedResp.ok) {
const oEmbedData = await oEmbedResp.json();
metadata.title = oEmbedData.title || metadata.title;
metadata.author = oEmbedData.author_name || metadata.author;
metadata.thumbnail = oEmbedData.thumbnail_url || metadata.thumbnail;
}
} catch (metaErr) {
console.error('Erro ao buscar metadados do oEmbed:', metaErr);
}
try {
// Tenta obter legenda
const transcriptObj = await YoutubeTranscript.fetchTranscript(videoId);
transcriptText = transcriptObj.map(t => t.text).join(' ');
} catch (transcErr) {
console.error('Erro ao obter transcrição:', transcErr);
}
if (!transcriptText) {
return res.status(400).json({
error: 'Não foi possível extrair as legendas/transcrição automática deste vídeo. Certifique-se de que o vídeo possui legendas ou transcrição automática disponíveis no YouTube e tente novamente.'
});
}
try {
const prompt = `Analise a transcrição deste vídeo intitulado "${metadata.title}" (Canal: ${metadata.author}):
Transcrição do vídeo:
"""
${transcriptText}
"""
Instruções para o conteúdo de saída:
1. Escreva um RESUMO detalhado do vídeo. Esse resumo precisa ter EXATAMENTE ou APROXIMADAMENTE ${numLines} linhas de texto. Seja extremamente fiel aos fatos relatados.
2. Faça uma ANÁLISE PEDAGÓGICA COMPLEMENTAR detalhando:
- Relevância do conteúdo para fins educacionais.
- Indicação de faixa etária/segmento dos alunos recomendado.
- Conexão direta com a BNCC (mencione os códigos de competências, habilidades ou campos de experiência correspondentes).
- Sugestões práticas de aplicação em sala de aula (atividades pedagógicas, dinâmicas de grupo ou perguntas para debate com os alunos).
Retorne a resposta estruturada estritamente em Markdown. Separe as seções usando títulos claros:
# Resumo Pedagógico (${numLines} Linhas)
[Insira o resumo aqui, ocupando aproximadamente ${numLines} linhas de texto]
# Análise Pedagógica e Sugestões Práticas
[Insira a análise pedagógica, os pontos da BNCC e as sugestões de atividades práticas aqui]`;
const aiResponse = await callMinimax({
system: "Você é um pedagogo experiente e especialista em planejamento de aulas no Brasil, alinhado à Base Nacional Comum Curricular (BNCC).",
messages: [{ role: 'user', content: prompt }],
temperature: 0.5,
max_tokens: 3000
});
res.json({
success: true,
metadata,
report: aiResponse.text || ''
});
} catch (err) {
console.error('Erro ao processar análise do VideoMind:', err);
res.status(500).json({ error: 'Erro ao gerar análise com a IA: ' + err.message });
}
});
// Rota GET para obter configurações do agente
app.get('/api/agent-config', requireAuth, (req, res) => {
const config = readAgentConfig();