Advertisement
jalarab

tIW3SjcGi.js

Nov 14th, 2024
44
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. const path = require('path');
  2. const fs = require('fs');
  3. const axios = require('axios');
  4. const { exec } = require('child_process');
  5.  
  6. // Definiciones del plugin
  7. const details = () => ({
  8.     id: 'tIW3SjcGi',
  9.     Stage: 'Post-processing',
  10.     Name: 'Subtitle Language Check and Translation',
  11.     Type: 'Video',
  12.     Operation: 'Subtitle',
  13.     Description: 'Verifies if subtitles in Spanish are available. If not, extracts and translates to Spanish using OpenAI API.',
  14.     Version: '1.0',
  15.     Tags: 'subtitles, translation, OpenAI, Spanish',
  16.     Inputs: [] // No configurable inputs as functionality is fixed
  17. });
  18.  
  19. // Función para extraer subtítulos incrustados del video usando FFmpeg
  20. const extractSubtitlesFromVideo = (videoFile) => {
  21.     return new Promise((resolve, reject) => {
  22.         const tempSrtFile = path.join(path.dirname(videoFile), 'extracted_subtitles.srt');
  23.         // Comando FFmpeg para extraer subtítulos incrustados
  24.         exec(`ffmpeg -i "${videoFile}" -map 0:s:0 "${tempSrtFile}"`, (error, stdout, stderr) => {
  25.             if (error) {
  26.                 reject(`Error al extraer los subtítulos: ${stderr}`);
  27.             } else {
  28.                 resolve(tempSrtFile);
  29.             }
  30.         });
  31.     });
  32. };
  33.  
  34. // Función para traducir los subtítulos usando la API de OpenAI
  35. const translateSubtitle = async (text) => {
  36.     const apiKey = process.env.OPENAI_API_KEY; // Leer API key desde variable de entorno
  37.     const model = "gpt-4"; // Cambiar modelo si es necesario
  38.     const prompt = `Translate the following subtitle text to Spanish:\n\n${text}`;
  39.  
  40.     try {
  41.         const response = await axios.post(
  42.             'https://api.openai.com/v1/chat/completions/',
  43.             {
  44.                 model,
  45.                 messages: [{ role: 'user', content: prompt }],
  46.                 max_tokens: 2000,
  47.             },
  48.             {
  49.                 headers: {
  50.                     'Authorization': `Bearer ${apiKey}`,
  51.                     'Content-Type': 'application/json',
  52.                 },
  53.             }
  54.         );
  55.         return response.data.choices[0].message.content.trim();
  56.     } catch (error) {
  57.         console.error('Error en la solicitud a la API de OpenAI:', error.response ? error.response.data : error.message);
  58.         throw new Error('Error en la traducción del subtítulo');
  59.     }
  60. };
  61.  
  62. // Plugin principal adaptado para el nuevo formato
  63. const plugin = async (file, librarySettings, inputs, otherArguments) => {
  64.     try {
  65.         const videoFile = file; // Obtener el archivo de video directamente desde el parámetro
  66.         const videoDir = path.dirname(videoFile); // Obtener el directorio del video
  67.         const baseName = path.basename(videoFile, path.extname(videoFile));
  68.  
  69.         // Verificar si ya existe un archivo de subtítulos en español (externo)
  70.         const existingSubtitlesEs = fs.existsSync(path.join(videoDir, `${baseName}.es.srt`)) || fs.existsSync(path.join(videoDir, `${baseName}.spa.srt`));
  71.  
  72.         // Si ya existen subtítulos en español, no hacer nada
  73.         if (existingSubtitlesEs) {
  74.             return { status: 'success', message: 'Subtítulos en español ya existentes, no se realizó ninguna acción.' };
  75.         }
  76.  
  77.         // Verificar si existen subtítulos externos
  78.         const subtitleFilePath = path.join(videoDir, `${baseName}.en.srt`);
  79.         let subtitles = null;
  80.  
  81.         if (fs.existsSync(subtitleFilePath)) {
  82.             // Si existen subtítulos externos en inglés, los leemos
  83.             subtitles = fs.readFileSync(subtitleFilePath, 'utf-8');
  84.         } else {
  85.             // Si no existen subtítulos externos, extraemos subtítulos embebidos
  86.             subtitles = await extractSubtitlesFromVideo(videoFile);
  87.         }
  88.  
  89.         // Traducir los subtítulos
  90.         const translatedSubtitles = await translateSubtitle(subtitles);
  91.  
  92.         // Guardar los subtítulos traducidos en un archivo
  93.         const translatedSubtitlePath = path.join(videoDir, `${baseName}.es.srt`);
  94.         fs.writeFileSync(translatedSubtitlePath, translatedSubtitles);
  95.  
  96.         // Eliminar archivo de subtítulos extraídos si es embebido
  97.         if (!fs.existsSync(subtitleFilePath)) {
  98.             fs.unlinkSync(subtitles);
  99.         }
  100.  
  101.         return { status: 'success', translatedSubtitles: translatedSubtitlePath };
  102.     } catch (error) {
  103.         return { status: 'error', error: error.message };
  104.     }
  105. };
  106.  
  107. module.exports = {
  108.     details,
  109.     plugin
  110. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement