UNPKG

drive-mediafire-downloader

Version:

Librería para descargar archivos de Google Drive y Mediafire

153 lines (129 loc) 5.59 kB
const { URL } = require('url'); const path = require('path'); const fs = require('fs'); const puppeteer = require('puppeteer'); /** * Descarga un archivo desde Google Drive o Mediafire * @param {string} downloadLink - El enlace de descarga (Google Drive o Mediafire) * @param {string} downloadPath - La ruta donde se guardará el archivo (opcional) * @returns {Promise<object>} - Objeto con información sobre la descarga */ async function downloadFile(downloadLink, downloadPath) { // Validar el enlace if (!downloadLink) { throw new Error('Se requiere un enlace de descarga'); } try { const url = new URL(downloadLink); // Determinar el tipo de enlace if (url.hostname.includes('drive.google.com')) { return await downloadFromGoogleDrive(downloadLink, downloadPath); } else if (url.hostname.includes('mediafire.com')) { return await downloadFromMediafire(downloadLink, downloadPath); } else { throw new Error('El enlace proporcionado no es compatible. Solo se admiten enlaces de Google Drive y Mediafire.'); } } catch (error) { if (error.message.includes('Invalid URL')) { throw new Error('El enlace proporcionado no es válido'); } throw error; } } /** * Descarga un archivo desde Google Drive * @param {string} driveLink - El enlace de Google Drive * @param {string} downloadPath - La ruta donde se guardará el archivo (opcional) * @returns {Promise<object>} - Objeto con información sobre la descarga */ async function downloadFromGoogleDrive(driveLink, downloadPath) { const browser = await puppeteer.launch({ headless: true }); const page = await browser.newPage(); try { // Configurar la carpeta de descarga const downloadFolder = downloadPath || path.join(process.cwd(), 'downloads'); if (!fs.existsSync(downloadFolder)) { fs.mkdirSync(downloadFolder, { recursive: true }); } // Configurar el cliente para manejar descargas await page._client.send('Page.setDownloadBehavior', { behavior: 'allow', downloadPath: downloadFolder }); // Navegar a la página de Google Drive await page.goto(driveLink, { waitUntil: 'networkidle2' }); // Buscar y hacer clic en el botón de descarga const downloadButtonSelector = 'input.jfk-button-action[value="Descargar de todos modos"]'; await page.waitForSelector(downloadButtonSelector, { timeout: 5000 }) .catch(() => { throw new Error('No se encontró el botón de descarga en Google Drive'); }); await page.click(downloadButtonSelector); // Esperar a que se complete la descarga (esto es aproximado) await new Promise(resolve => setTimeout(resolve, 5000)); // Obtener el nombre del archivo descargado (aproximado) const filename = await page.evaluate(() => { const filenameElement = document.querySelector('.uc-name-size a'); return filenameElement ? filenameElement.textContent : 'archivo_descargado'; }); await browser.close(); return { success: true, message: 'Descarga completada', filePath: path.join(downloadFolder, filename), source: 'Google Drive' }; } catch (error) { await browser.close(); throw new Error(`Error al descargar desde Google Drive: ${error.message}`); } } /** * Descarga un archivo desde Mediafire * @param {string} mediafireLink - El enlace de Mediafire * @param {string} downloadPath - La ruta donde se guardará el archivo (opcional) * @returns {Promise<object>} - Objeto con información sobre la descarga */ async function downloadFromMediafire(mediafireLink, downloadPath) { const browser = await puppeteer.launch({ headless: true }); const page = await browser.newPage(); try { // Configurar la carpeta de descarga const downloadFolder = downloadPath || path.join(process.cwd(), 'downloads'); if (!fs.existsSync(downloadFolder)) { fs.mkdirSync(downloadFolder, { recursive: true }); } // Configurar el cliente para manejar descargas await page._client.send('Page.setDownloadBehavior', { behavior: 'allow', downloadPath: downloadFolder }); // Navegar a la página de Mediafire await page.goto(mediafireLink, { waitUntil: 'networkidle2' }); // Buscar y hacer clic en el botón de descarga const downloadButtonSelector = 'a#downloadButton'; await page.waitForSelector(downloadButtonSelector, { timeout: 5000 }) .catch(() => { throw new Error('No se encontró el botón de descarga en Mediafire'); }); // Obtener el nombre del archivo antes de hacer clic const filename = await page.evaluate(() => { const filenameElement = document.querySelector('.filename'); return filenameElement ? filenameElement.textContent : 'archivo_mediafire'; }); await page.click(downloadButtonSelector); // Esperar a que se complete la descarga (esto es aproximado) await new Promise(resolve => setTimeout(resolve, 5000)); await browser.close(); return { success: true, message: 'Descarga completada', filePath: path.join(downloadFolder, filename), source: 'Mediafire' }; } catch (error) { await browser.close(); throw new Error(`Error al descargar desde Mediafire: ${error.message}`); } } module.exports = { downloadFile, downloadFromGoogleDrive, downloadFromMediafire };