Adiciona ferramenta VideoMind para transcrição e análise de vídeos com resumo customizado
This commit is contained in:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user