AplicaciΓ³n nativa de macOS para descargar videos de YouTube en alta calidad
CaracterΓsticas β’ InstalaciΓ³n β’ Uso β’ Arquitectura
- π¬ Descarga hasta 4K (2160p) - MΓ‘xima calidad disponible con merge automΓ‘tico
- π 100% Portable - Todo incluido: Python, pytubefix y ffmpeg empaquetados
- π¨ Interfaz moderna - DiseΓ±o nativo con Swift/SwiftUI 5.9
- π Progreso en tiempo real - Visualiza el avance byte a byte
- π΅ Audio MP3 - Extrae solo el audio en alta calidad
- πΌοΈ Vista previa - Thumbnail y detalles del video antes de descargar
- π Auto-apertura - Finder se abre automΓ‘ticamente al finalizar
- π§Ή Limpieza automΓ‘tica - Vista se resetea despuΓ©s de cada descarga
- π» Sin emojis en logs - Interfaz profesional y limpia
- Descarga
DownloadTool-Portable-FIXED.zip(60 MB) - Descomprime el archivo
- Arrastra
DownloadTool.appa tu carpeta Aplicaciones - Abre la app (doble click)
Si macOS bloquea la app por Gatekeeper:
xattr -cr /Applications/DownloadTool.appO: Click derecho β Abrir β Abrir
La app es completamente standalone:
- β Python 3.14 incluido (empaquetado con PyInstaller)
- β pytubefix 10.3.6 incluido
- β ffmpeg incluido para merge de video + audio
- β No requiere Homebrew
- β No requiere instalaciΓ³n de Python
- β No requiere pip install
- Pega un link de YouTube en el campo de bΓΊsqueda
- Click en el botΓ³n de bΓΊsqueda π
- VerΓ‘s el thumbnail y detalles del video
- Selecciona la calidad deseada (o solo audio)
- Click en Descargar Ahora
- π Finder se abre automΓ‘ticamente mostrando el archivo descargado
Los videos se guardan en:
~/Downloads/MateoTool/Downloads/
| Calidad | ResoluciΓ³n | Merge AutomΓ‘tico |
|---|---|---|
| 4K | 2160p | β Video + Audio |
| 2K | 1440p | β Video + Audio |
| Full HD | 1080p | β Video + Audio |
| HD | 720p | β‘ Progressive |
| SD | 480p, 360p | β‘ Progressive |
Nota: Las calidades 1080p+ requieren merge de video + audio separados. ffmpeg estΓ‘ incluido en el bundle.
- macOS 13.0+
- Xcode 15.0+
- Homebrew (para ffmpeg)
- Python 3.8+ (para PyInstaller)
git clone https://github.com/Mats2208/DownloadYoutubeTool.git
cd DownloadTool# Instalar ffmpeg (si no lo tienes)
brew install ffmpeg
# Las dylibs de ffmpeg se almacenan fuera del proyecto para evitar link automΓ‘tico
mkdir -p ~/temp_ffmpeg_libs
# Copiar dylibs necesarias
cp /opt/homebrew/Cellar/ffmpeg/*/lib/libav*.dylib ~/temp_ffmpeg_libs/
cp /opt/homebrew/Cellar/ffmpeg/*/lib/libsw*.dylib ~/temp_ffmpeg_libs/
cp /opt/homebrew/opt/libvpx/lib/libvpx.*.dylib ~/temp_ffmpeg_libs/
cp /opt/homebrew/opt/dav1d/lib/libdav1d.*.dylib ~/temp_ffmpeg_libs/
cp /opt/homebrew/opt/lame/lib/libmp3lame.*.dylib ~/temp_ffmpeg_libs/
cp /opt/homebrew/opt/opus/lib/libopus.*.dylib ~/temp_ffmpeg_libs/
cp /opt/homebrew/opt/svt-av1/lib/libSvtAv1Enc.*.dylib ~/temp_ffmpeg_libs/
cp /opt/homebrew/opt/x264/lib/libx264.*.dylib ~/temp_ffmpeg_libs/
cp /opt/homebrew/opt/x265/lib/libx265.*.dylib ~/temp_ffmpeg_libs/
# Copiar ffmpeg binary
cp $(which ffmpeg) DownloadTool/Resources/bin/
chmod +x DownloadTool/Resources/bin/ffmpegSi modificaste download_youtube.py, recompila el ejecutable:
# Crear entorno virtual
python3 -m venv .venv
source .venv/bin/activate
# Instalar dependencias
pip install pytubefix pyinstaller
# Compilar ejecutable
cd DownloadTool
python -m PyInstaller --onefile --name youtube_downloader \
--collect-all pytubefix --clean download_youtube.py
# Copiar al proyecto
cp dist/youtube_downloader Resources/
chmod +x Resources/youtube_downloader
# Limpiar
rm -rf build dist youtube_downloader.spec
cd ..
deactivate# Limpiar builds anteriores
rm -rf build/
# Compilar desde terminal
xcodebuild -project DownloadTool.xcodeproj -configuration Debug build
# O desde Xcode: Product β Build (β+B)DespuΓ©s de compilar, ejecuta el script para copiar y configurar las dylibs:
# Copiar dylibs y reescribir paths con install_name_tool
python3 ffmpeg_bundle.py Debug
# Firmar todo (ad-hoc signature)
for dylib in build/Debug/DownloadTool.app/Contents/Resources/ffmpeg_libs/*.dylib; do
codesign --force --sign - "$dylib"
done
codesign --force --sign - "build/Debug/DownloadTool.app/Contents/Resources/ffmpeg"
codesign --force --sign - "build/Debug/DownloadTool.app/Contents/Resources/youtube_downloader"
codesign --force --sign - "build/Debug/DownloadTool.app"# Crear ZIP sin metadata de macOS
cd build/Debug
ditto -c -k --keepParent --norsrc DownloadTool.app "../../DownloadTool-Portable.zip"
cd ../..
# El ZIP estarΓ‘ en la raΓz del proyecto
ls -lh DownloadTool-Portable.zipDownloadTool/Resources/ffmpeg_libs/ durante la compilaciΓ³n, porque Xcode las enlazarΓa automΓ‘ticamente al binario principal. Por eso se guardan en ~/temp_ffmpeg_libs/ y se copian despuΓ©s del build con ffmpeg_bundle.py.
ffmpeg_bundle.py usa install_name_tool para reescribir todos los load paths de las dylibs de rutas absolutas (/opt/homebrew/...) a rutas relativas (@loader_path/ffmpeg_libs/...), haciendo el app portable.
install_name_tool se invalida la firma del cΓ³digo, por eso hay que re-firmar todo con codesign.
βββββββββββββββββββββββββββββββββββββββ
β SwiftUI Interface β
β (DownloaderView.swift) β
ββββββββββββββββ¬βββββββββββββββββββββββ
β
ββββββββββββββββΌβββββββββββββββββββββββ
β YouTubeManager (Singleton) β
β - Process management β
β - Environment variables (FFMPEG) β
β - JSON communication β
ββββββββββββββββ¬βββββββββββββββββββββββ
β
βββββββ΄ββββββ
β β
ββββββββββΌββββββ ββββΌβββββββββββββββββ
β youtube_ β β Python + Script β
β downloader β β (Fallback Dev) β
β (9.9 MB) β β β
ββββββββββββββββ βββββββββββββββββββββ
β β
βββββββ¬ββββββ
β
ββββββββββββββββΌβββββββββββββββββββββββ
β pytubefix (YouTube API) β
β - Stream resolution detection β
β - Progressive/Adaptive formats β
β - Download with progress β
ββββββββββββββββ¬βββββββββββββββββββββββ
β
ββββββββββββββββΌβββββββββββββββββββββββ
β ffmpeg (Bundle: 432 KB) β
β - Merge video + audio streams β
β - Format: -c:v copy -c:a aac β
βββββββββββββββββββββββββββββββββββββββ
| Componente | DescripciΓ³n | TamaΓ±o |
|---|---|---|
| DownloaderView.swift | UI SwiftUI moderna (650x800px) | - |
| YouTubeManager.swift | Singleton, maneja procesos y estado | - |
| download_youtube.py | Script Python con pytubefix | 10 KB |
| youtube_downloader | Python 3.14 + pytubefix empaquetado | 8.1 MB |
| ffmpeg | Herramienta de merge incluida | 432 KB |
1. Usuario selecciona 1080p
β
2. Manager ejecuta: youtube_downloader download <url> 1080p
β
3. Python (pytubefix) descarga:
- video_12345.mp4 (1080p sin audio)
- audio_12345.m4a (audio high quality)
β
4. Manager pasa FFMPEG_PATH al proceso
β
5. Python ejecuta ffmpeg desde bundle:
ffmpeg -i video.mp4 -i audio.m4a -c:v copy -c:a aac final.mp4
β
6. Archivos temporales eliminados
β
7. β
Video final con audio β Finder auto-abre β Vista se limpia
xattr -cr /Applications/DownloadTool.appSoluciΓ³n: La versiΓ³n v3-FIXED incluye ffmpeg empaquetado. Descarga la ΓΊltima versiΓ³n.
- Verifica que el link sea vΓ‘lido de YouTube
- Comprueba tu conexiΓ³n a internet
- Algunos videos tienen restricciones regionales o de edad
La app muestra logs en la parte inferior. Haz click en "Logs del sistema" para expandir y ver detalles del proceso.
| Componente | VersiΓ³n/Info |
|---|---|
| Plataforma | macOS 13.0+ (Apple Silicon + Intel) |
| Swift | 5.9 |
| SwiftUI | 5.9 |
| Python | 3.14.2 (empaquetado) |
| pytubefix | 10.3.6 |
| ffmpeg | 8.0.1 |
| PyInstaller | 6.18.0 |
| TamaΓ±o Total | 44 MB (comprimido) |
Esta herramienta es solo para uso personal y educativo. El usuario es responsable de:
- Respetar los tΓ©rminos de servicio de YouTube
- Cumplir las leyes de copyright de su regiΓ³n
- Descargar ΓΊnicamente contenido del que tenga derechos
MIT License - Ver LICENSE para mΓ‘s detalles.
Hecho con β€οΈ usando Swift y Python
Si encuentras algΓΊn problema:
- Revisa la secciΓ³n SoluciΓ³n de Problemas
- Verifica los logs del sistema en la app
- Abre un issue con los detalles
Hecho con β€οΈ usando Swift y Python
β Si te gusta este proyecto, dale una estrella en GitHub β