npm package: @soymaycol/maysite
Description: Descarga sitios web completos como archivos ZIP usando wget
Author: SoyMaycol
Latest version: 1.0.0

# @soymaycol/maysite

🌐 Descarga sitios web completos como archivos ZIP usando wget

## 📦 Instalación

```bash
npm install @soymaycol/maysite
```

El paquete intentará instalar `wget` automáticamente durante la instalación si no está disponible en tu sistema.

## 🚀 Uso

### Uso Básico (Promesas)

```javascript
const { downloadWebsiteAsZip } = require('@soymaycol/maysite');

async function descargarSitio() {
  try {
    const zipPath = await downloadWebsiteAsZip({
      url: 'https://example.com',
      outputDir: './descargas',
      filename: 'mi_sitio_web'
    });
    
    console.log('Sitio descargado en:', zipPath);
  } catch (error) {
    console.error('Error:', error.message);
  }
}

descargarSitio();
```

### Con Callbacks de Progreso

```javascript
const { downloadWebsiteAsZip } = require('@soymaycol/maysite');

downloadWebsiteAsZip({
  url: 'https://example.com',
  onProgress: (message) => console.log('📥', message),
  onError: (error) => console.error('❌', error.message),
  onComplete: (zipPath) => console.log('✅ Completado:', zipPath)
});
```

### Con Express.js

```javascript
const express = require('express');
const { downloadWebsiteAsZipExpress } = require('@soymaycol/maysite');

const app = express();

// Para URLs en query parameters: GET /download?url=https://example.com
app.get('/download', downloadWebsiteAsZipExpress);

// Para URLs en el body: POST /download con { "url": "https://example.com" }
app.use(express.json());
app.post('/download', downloadWebsiteAsZipExpress);

// Para URLs como parámetros: GET /download/https://example.com
app.get('/download/:url', downloadWebsiteAsZipExpress);

app.listen(3000, () => {
  console.log('Servidor corriendo en puerto 3000');
});
```

## ⚙️ Opciones

### `downloadWebsiteAsZip(options)`

| Opción | Tipo | Descripción | Por defecto |
|--------|------|-------------|-------------|
| `url` | `string` | URL del sitio web a descargar (requerido) | - |
| `outputDir` | `string` | Directorio donde guardar los archivos | `'./downloads'` |
| `filename` | `string` | Nombre del archivo ZIP (sin extensión) | Basado en la URL |
| `onProgress` | `function` | Callback para mostrar progreso | `null` |
| `onError` | `function` | Callback para manejar errores | `null` |
| `onComplete` | `function` | Callback cuando termine | `null` |

## 🛠️ Requisitos

- **Node.js** >= 14.0.0
- **wget** (se instala automáticamente si no está disponible)

### Instalación manual de wget

Si la instalación automática falla, puedes instalar wget manualmente:

#### macOS
```bash
# Con Homebrew
brew install wget

# Con MacPorts
sudo port install wget
```

#### Linux (Ubuntu/Debian)
```bash
sudo apt-get update
sudo apt-get install wget
```

#### Linux (CentOS/RHEL)
```bash
sudo yum install wget
```

#### Windows
```bash
# Con Chocolatey
choco install wget

# Con winget
winget install GNU.Wget
```

## 🔧 Características

- ✅ Descarga sitios web completos con todos sus recursos
- ✅ Convierte enlaces para navegación offline
- ✅ Comprime automáticamente en formato ZIP
- ✅ Limpieza automática de archivos temporales  
- ✅ Compatible con Express.js
- ✅ Callbacks de progreso y error
- ✅ Instalación automática de dependencias
- ✅ Soporte multiplataforma (Windows, macOS, Linux)

## 📝 Ejemplos Avanzados

### Descarga con configuración personalizada

```javascript
const { downloadWebsiteAsZip } = require('@soymaycol/maysite');

downloadWebsiteAsZip({
  url: 'https://mi-blog.com',
  outputDir: './sitios-descargados',
  filename: 'mi-blog-backup',
  onProgress: (msg) => {
    console.log(`[${new Date().toLocaleTimeString()}] ${msg}`);
  },
  onError: (err) => {
    console.error('💥 Error durante la descarga:', err.message);
    // Aquí puedes enviar el error a un servicio de logging
  },
  onComplete: (zipPath) => {
    console.log(`🎉 ¡Descarga completada!`);
    console.log(`📁 Archivo guardado en: ${zipPath}`);
    
    // Aquí puedes hacer algo con el archivo, como subirlo a la nube
    // uploadToCloud(zipPath);
  }
});
```

### API REST completa

```javascript
const express = require('express');
const { downloadWebsiteAsZip } = require('@soymaycol/maysite');
const app = express();

app.use(express.json());

app.post('/api/download-website', async (req, res) => {
  const { url, filename } = req.body;
  
  if (!url) {
    return res.status(400).json({
      success: false,
      message: 'URL es requerida'
    });
  }

  try {
    const zipPath = await downloadWebsiteAsZip({
      url,
      filename,
      onProgress: (message) => {
        console.log(`[${url}] ${message}`);
      }
    });

    res.json({
      success: true,
      message: 'Sitio web descargado exitosamente',
      zipPath
    });

  } catch (error) {
    res.status(500).json({
      success: false,
      message: error.message
    });
  }
});
```

## 🤝 Contribuir

¿Encontraste un bug o tienes una sugerencia? ¡Las contribuciones son bienvenidas!

## 📄 Licencia

MIT © SoyMaycol

## 🏷️ Etiquetas

`wget` `website` `download` `zip` `scraper` `mirror` `nodejs` `express`