Interfaz gráfica nativa (Cocoa / AppKit) para GNU wget en macOS.
CocoaWget actúa como un gestor de descargas que envuelve el binario wget de línea de
comandos: añade una cola de descargas, edición visual de las opciones de wget, descarga
recursiva de sitios, reanudación de transferencias, soporte de proxy y más, sin necesidad de
abrir el Terminal.
Estado del proyecto: código histórico (≈2008) escrito en Objective‑C con Manual Reference Counting. Compila contra el SDK de macOS con objetivo de despliegue 10.13, pero el binario
wgetincluido es de arquitecturas i386 + PowerPC y no se ejecuta en macOS moderno (macOS 10.15+ eliminó el soporte de 32 bits). Consulta el plan de modernización en ROADMAP.md.
- Cola de descargas con tabla de elementos, estado, porcentaje y velocidad en tiempo real.
- Reordenación por arrastrar y soltar dentro de la cola; también se pueden soltar URLs desde el navegador o desde texto.
- Añadir varias URLs a la vez (una por línea).
- Expansión de URLs secuenciales:
http://host/img[000-999].jpggenera automáticamente las 999 URLs correspondientes (expandSequencialURL:en CWArrayController.m). - Reanudar descargas interrumpidas (
wget -c). - Comprobación de marca de tiempo (
wget -N) para descargar solo si el archivo remoto es más reciente. - Descarga recursiva de sitios (
wget -r) con control de:- nivel de profundidad (
-l), - ámbito: no subir de directorio (
--no-parent), mismo host o abarcar hosts (--span-hosts), - filtros de extensión permitida/denegada (
-A/-R), - filtros de dominio permitido/denegado (
-D/--exclude-domains), - filtros de directorio permitido/denegado (
--include-directories/--exclude-directories).
- nivel de profundidad (
- Autenticación HTTP (usuario y contraseña) y cabecera Referer personalizada.
- Captura automática del Referer desde Safari mediante AppleScript (GetURLFromSafari.scpt).
- Soporte de proxy (HTTP/FTP, con usuario y contraseña) escrito en
~/.wgetrc, con copia de seguridad y restauración del.wgetrcdel usuario. - Opciones globales: número de reintentos (
-t), timeout (-T), tamaño máximo de descarga (-Q), User-Agent personalizado, FTP pasivo (--passive-ftp), conversión de enlaces a rutas relativas (-k) y un campo libre para pasar opciones arbitrarias de wget. - Descarga automática mediante un temporizador que va lanzando elementos en espera respetando un máximo de conexiones simultáneas (global y por dominio).
- Acciones al finalizar: abrir el archivo descargado, guardar la URL de origen como comentario Finder del archivo (vía AppleScript) y eliminar de la lista los elementos completados.
- Cajón de registro (log) que muestra la salida en vivo de wget para el elemento seleccionado.
- Localización en inglés, alemán, japonés y español.
CocoaWget es una aplicación AppKit basada en Cocoa Bindings y NSUserDefaultsController. No
contiene código de red propio: delega toda la transferencia en el ejecutable wget incluido en el
bundle, lanzado como subproceso (NSTask), y analiza su salida estándar/estándar de error línea
a línea para actualizar la interfaz.
| Componente | Archivo | Responsabilidad |
|---|---|---|
main |
main.m | Punto de entrada (NSApplicationMain). |
MainController |
MainController.h · MainController.m | Ciclo de vida de la app, selección de carpeta de descargas, diálogos de cierre, apertura de ayuda. |
CWArrayController |
CWArrayController.h · CWArrayController.m | Subclase de NSArrayController; gestiona la cola, el parsing de URLs, arrastrar y soltar, el temporizador de auto‑descarga, la persistencia de la lista y el cajón de log. |
DownloadItem |
DownloadItem.h · DownloadItem.m | Modelo de cada descarga; construye los argumentos de wget, lanza/detiene el NSTask, analiza el progreso y gestiona el ~/.wgetrc. |
| Interfaz | *.lproj/MainMenu.xib |
Ventana principal, panel de preferencias y menús (Interface Builder). |
| AppleScript | GetURLFromSafari.scpt | Obtiene la URL de la pestaña activa de Safari para usarla como Referer. |
| Binario | wget |
Ejecutable de GNU wget empaquetado en Contents/Resources. |
- El usuario añade una o varias URLs;
CWArrayControllerlas normaliza, expande secuencias y crea unDownloadItempor cada una. - Al iniciar (manual o por el temporizador),
DownloadItemconstruye la lista de argumentos (getArgument) a partir de las preferencias del usuario y de las opciones del propio elemento. - Hace copia de seguridad del
~/.wgetrc, escribe uno temporal con la configuración de proxy y lanzawgetconNSTask, redirigiendostdout/stderra unNSPipe. - La salida se lee en segundo plano;
parseDownloadingProgress:extrae porcentaje y velocidad, yparseLog:detecta errores y la ruta final del archivo. - Al terminar el proceso se restaura el
~/.wgetrc, se marca el estado (Finished/Error) y se ejecutan las acciones de fin de descarga.
La cola y la configuración se guardan en los user defaults de la aplicación
(NSUserDefaultsController). La lista se serializa como un array de diccionarios bajo la clave
list (ver saveList / loadList).
- macOS con Xcode (Command Line Tools incluidas).
- El proyecto se abre con Xcode (
CocoaWget.xcodeproj). Es un formato de proyecto antiguo (objectVersion = 45); Xcode ofrecerá actualizar la configuración recomendada.
# Compilar desde la línea de comandos
xcodebuild -project CocoaWget.xcodeproj -configuration Release
# O abrir en Xcode y pulsar ⌘R
open CocoaWget.xcodeproj
⚠️ Importante: el ejecutablewgetversionado en el repositorio es una Mach‑O universal binary de arquitecturasi386yppc_7400, incompatible con macOS actual. Antes de poder ejecutar la app necesitas reconstruirwgetparaarm64+x86_64con buildwget.sh. Consulta el ROADMAP.md para los detalles de la modernización.
El script buildwget.sh descarga, compila e instala un wget moderno, universal (arm64 + x86_64) y autónomo (con OpenSSL enlazado estáticamente, sin dependencias de Homebrew), apto para empaquetar y notarizar. Solo necesita las Command Line Tools de Xcode (clang, make, curl, lipo) y conexión a internet.
./buildwget.sh # universal arm64 + x86_64 (por defecto)
ARCHS="arm64" ./buildwget.sh # solo la arquitectura del host (build local más rápido)
WGET_VERSION=1.25.0 OPENSSL_VERSION=3.4.1 ./buildwget.shVerificación de las fuentes. Antes de compilar, el script valida la integridad de los tarballs
descargados: usa el .sha256 publicado por OpenSSL y la firma GPG de wget (contra el llavero
oficial de GNU, si hay gpg/gpgv instalado). Para una compilación reproducible y segura, fija
los hashes esperados; con STRICT_VERIFY=1 el script aborta si no puede verificar una fuente:
WGET_SHA256=<hash> OPENSSL_SHA256=<hash> STRICT_VERIFY=1 ./buildwget.shInstalación en el bundle (opcional). Pásale un .app ya compilado y copiará el binario a
Contents/Resources/wget, re‑firmándolo ad-hoc:
./buildwget.sh /ruta/a/CocoaWget.app
# o: APP_BUNDLE=/ruta/a/CocoaWget.app ./buildwget.shSi no usas esa opción, el binario se deja en la raíz del proyecto y debe copiarse a los Resources del bundle (lo hace la fase de recursos del proyecto Xcode). El script firma el binario de forma ad-hoc para poder ejecutarlo localmente; para distribuir, se vuelve a firmar con el certificado Developer ID al notarizar la app.
- Abre CocoaWget.
- Escribe o pega una URL (
http://,https://,ftp://) en el campo superior y pulsa Add / Intro. También puedes arrastrar enlaces a la ventana. - Ajusta las opciones por elemento (reanudar, recursivo, autenticación…) o las globales en el panel de Preferencias (carpeta de descargas, proxy, reintentos, User‑Agent, etc.).
- Pulsa Start para iniciar la descarga (o activa la descarga automática).
- Abre el cajón de log para ver la salida de wget en tiempo real.
cocoawget/
├── main.m Punto de entrada de la app
├── MainController.{h,m} Controlador de aplicación / ventana
├── CWArrayController.{h,m} Cola de descargas (NSArrayController)
├── DownloadItem.{h,m} Modelo de descarga + ejecución de wget
├── CocoaWget_Prefix.pch Cabecera precompilada
├── Info.plist Metadatos del bundle (v2.7.0, min 10.13)
├── CocoaWget.icns Icono de la app
├── GetURLFromSafari.scpt AppleScript para obtener el Referer de Safari
├── buildwget.sh Script para compilar el binario wget
├── wget Binario de wget empaquetado (¡obsoleto: i386/ppc!)
├── English.lproj/ Localización inglesa (xib + strings) — región de desarrollo
├── German.lproj/ Localización alemana
├── Japanese.lproj/ Localización japonesa
├── Spanish.lproj/ Localización española (xib + strings)
├── scripts/ Utilidades (p. ej. create-github-issues.sh)
└── CocoaWget.xcodeproj/ Proyecto de Xcode
CocoaWget está localizado en inglés, alemán, japonés y español. Cada idioma vive en una carpeta
<Idioma>.lproj/ (se usan los nombres heredados de macOS — English, German, Japanese,
Spanish — en vez de los códigos ISO en/de/ja/es, por coherencia con el proyecto original).
El inglés es la región de desarrollo (CFBundleDevelopmentRegion) y actúa como respaldo.
Cada *.lproj/ contiene dos piezas:
| Archivo | Qué contiene | Cómo se usa |
|---|---|---|
Localizable.strings |
Cadenas en tiempo de ejecución (estados de descarga, alertas, botones). | Resueltas en el código con NSLocalizedString(...) (ver DownloadItem.h y CWArrayController.m). |
MainMenu.xib |
La interfaz (ventana principal, preferencias y menús). | Cargada por AppKit según el idioma del sistema. |
- Cadenas (
Localizable.strings) — es la parte que el código consume. Las claves deben ser idénticas en todos los idiomas; solo cambia el valor de la derecha. Si añades unNSLocalizedString(@"NuevaClave", @"")en el código, añade"NuevaClave"="…";a las cuatro localizaciones (English, German, Japanese, Spanish). Guarda en UTF‑8. - Interfaz (
MainMenu.xib) — elSpanish.lproj/MainMenu.xibactual es una copia del de inglés: la app ya carga la localización española, pero los rótulos de menús y ventanas siguen en inglés hasta traducirlos en Xcode / Interface Builder. Traducir el XIB es una tarea aparte (ver ROADMAP.md → Fase 3). - Registro en el proyecto — un idioma nuevo debe añadirse a los
PBXVariantGroupdeMainMenu.xibyLocalizable.stringsen project.pbxproj (o, más cómodo, desde Xcode: Project ▸ Info ▸ Localizations ▸ +).
Comprobación rápida de paridad de claves entre dos idiomas:
diff <(grep -oE '^"[^"]+"' English.lproj/Localizable.strings | sort) \ <(grep -oE '^"[^"]+"' Spanish.lproj/Localizable.strings | sort)
- El binario
wgetincluido no funciona en macOS moderno (arquitecturas de 32 bits / PowerPC). - Código en Objective‑C con conteo manual de referencias (MRC), no ARC.
- Uso de APIs obsoletas o eliminadas (
NSDrawer,NSStringPboardType,setKeys:triggerChangeNotificationsForDependentKey:,NSWorkspace iconForFileType:/openFile:,NSTask -launch, etc.). - No está firmado ni notarizado; Gatekeeper lo bloqueará en una distribución normal.
- Modifica el
~/.wgetrcglobal del usuario (incompatible con el App Sandbox). - Depende de AppleScript para controlar Safari y Finder, lo que requiere permisos de Automatización (TCC) en macOS actual.
El plan para resolver todo esto está en ROADMAP.md.
El código de la aplicación CocoaWget se distribuye bajo la licencia MIT (ver LICENSE). El binario de GNU wget que se empaqueta es un programa independiente bajo la GNU GPL v3; sus términos no se ven afectados por la licencia MIT del proyecto.
- Aplicación original CocoaWget por hirama (2008).
- GNU wget — Free Software Foundation.