drive-mediafire-downloader
Version:
Librería para descargar archivos de Google Drive y Mediafire
153 lines (129 loc) • 5.59 kB
JavaScript
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
};