✨ Features: - App iOS completa para leer manga sin publicidad - Scraper con WKWebView para manhwaweb.com - Sistema de descargas offline - Lector con zoom y navegación - Favoritos y progreso de lectura - Compatible con iOS 15+ y Sideloadly/3uTools 📦 Contenido: - Backend Node.js con Puppeteer (opcional) - App iOS con SwiftUI - Scraper de capítulos e imágenes - Sistema de almacenamiento local - Testing completo - Documentación exhaustiva 🧪 Prueba: Capítulo 789 de One Piece descargado exitosamente - 21 páginas descargadas - 4.68 MB total - URLs verificadas y funcionales 🎉 Generated with Claude Code (https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
7.0 KiB
7.0 KiB
Quick Start - Sistema de Descarga
Integración Rápida (5 minutos)
Paso 1: Verificar Archivos
Los siguientes archivos ya están creados en tu proyecto:
ios-app/Sources/
├── Services/
│ ├── DownloadManager.swift ✅ 13KB
│ └── DOWNLOAD_SYSTEM_README.md ✅ Documentación completa
├── Views/
│ ├── DownloadsView.swift ✅ 13KB
│ └── MangaDetailView.swift ✅ Actualizado
├── Extensions/
│ └── DownloadExtensions.swift ✅ 4.7KB
├── Examples/
│ └── IntegrationExample.swift ✅ Ejemplos de integración
└── Tests/
└── DownloadManagerTests.swift ✅ Tests unitarios
Paso 2: Agregar DownloadsView a Tu App
Si tienes un TabView, simplemente agrega:
// En tu ContentView o App principal
TabView {
ContentView() // Tu vista actual
.tabItem {
Label("Biblioteca", systemImage: "books.vertical")
}
DownloadsView() // ✅ NUEVA VISTA
.tabItem {
Label("Descargas", systemImage: "arrow.down.circle")
}
.badge(downloadManager.activeDownloads.count) // Opcional: badge
SettingsView()
.tabItem {
Label("Ajustes", systemImage: "gear")
}
}
Paso 3: Probar la Descarga
- Abre
MangaDetailView(ya está actualizado) - Toca el botón de descarga (icono de flecha hacia abajo) en la toolbar
- Selecciona "Descargar últimos 10" o "Descargar todos"
- Observa el progreso en cada fila de capítulo
- Ve a la tab "Descargas" para ver el progreso detallado
¡Eso es todo! El sistema está completamente integrado.
Características Incluidas
✅ Ya Funciona
- Descarga de capítulos individuales
- Descarga masiva (todos o últimos N)
- Progreso en tiempo real
- Cancelación de descargas
- Historial de descargas
- Notificaciones de estado
- Gestión de almacenamiento
- Manejo de errores
📱 UI Components
DownloadsView- Vista completa con tabsActiveDownloadCard- Card con progresoCompletedDownloadCard- Card de completadosFailedDownloadCard- Card con reintentar- Toast notifications
- Progress bars
🔧 Services
DownloadManager- Singleton gerente de descargasDownloadTask- Modelo de tarea individualDownloadState- Estados de descargaDownloadError- Tipos de error
Uso Básico
Desde MangaDetailView
// Ya está implementado en MangaDetailView
// El usuario solo necesita tocar el botón de descarga
Programáticamente
let downloadManager = DownloadManager.shared
// Descargar un capítulo
try await downloadManager.downloadChapter(
mangaSlug: manga.slug,
mangaTitle: manga.title,
chapter: chapter
)
// Descargar múltiples
await downloadManager.downloadChapters(
mangaSlug: manga.slug,
mangaTitle: manga.title,
chapters: chapters
)
// Cancelar descarga
downloadManager.cancelDownload(taskId: taskId)
// Cancelar todas
downloadManager.cancelAllDownloads()
Verificar Descargas
let storage = StorageService.shared
// ¿Está descargado?
if storage.isChapterDownloaded(
mangaSlug: manga.slug,
chapterNumber: 1
) {
// Usar imagen local
let imageURL = storage.getImageURL(
mangaSlug: manga.slug,
chapterNumber: 1,
pageIndex: 0
)
}
Personalización Opcional
Ajustar Concurrencia
En DownloadManager.swift:
private let maxConcurrentDownloads = 3 // Capítulos simultáneos
private let maxConcurrentImagesPerChapter = 5 // Imágenes simultáneas
Ajustar Calidad de Imagen
En StorageService.swift:
image.jpegData(compressionQuality: 0.8) // 80% de calidad
En DownloadExtensions.swift:
let maxDimension: CGFloat = 2048 // Redimensionar si es mayor
return resized.compressedData(quality: 0.75) // 75% de calidad
Solución de Problemas
Las descargas no inician
- Verificar conexión a internet
- Verificar que ManhwaWebScraper funciona
- Verificar logs en consola
El progreso no se actualiza
- Asegurar que estás en @MainActor
- Verificar que las propiedades son @Published
- Verificar que observas DownloadManager
Error "Already downloaded"
- Es normal - el capítulo ya existe
- Usa
storage.deleteDownloadedChapter()para eliminar - O permite sobrescribir
Las imágenes no se guardan
- Verificar permisos de la app
- Verificar espacio disponible
- Verificar que directorios existen
Próximos Pasos
Opcional: Badge en TabView
struct MainTabView: View {
@StateObject private var downloadManager = DownloadManager.shared
var body: some View {
TabView {
// ...
DownloadsView()
.tabItem {
Label("Descargas", systemImage: "arrow.down.circle")
}
.badge(downloadManager.activeDownloads.count) // ✅ Badge
}
}
}
Opcional: Widget en Home
struct ContentView: View {
@ObservedObject var downloadManager = DownloadManager.shared
var body: some View {
ScrollView {
// Tu contenido actual
if downloadManager.hasActiveDownloads {
ActiveDownloadsWidget()
}
}
}
}
Opcional: Banner de Descargas
struct ContentView: View {
var body: some View {
MangaDetailView(manga: manga)
.activeDownloadsBanner() // ✅ Modificador personalizado
}
}
Testing
Manual
- Descargar un capítulo
- Cancelar una descarga
- Descargar múltiples capítulos
- Probar sin internet
- Limpiar almacenamiento
Automatizado
Los tests están en /Sources/Tests/DownloadManagerTests.swift
Para ejecutar en Xcode:
- Cmd + U
- O Product → Test
Archivos de Referencia
Documentación
DOWNLOAD_SYSTEM_README.md- Guía completa (400 líneas)IMPLEMENTATION_SUMMARY.md- Resumen ejecutivoDIAGRAMS.md- Diagramas de flujoCHECKLIST.md- Checklist de implementación
Código
DownloadManager.swift- Core del sistemaDownloadsView.swift- Vista principalDownloadExtensions.swift- Extensiones útilesIntegrationExample.swift- Ejemplos de integración
Soporte
Problemas Comunes
"No se compila"
- Asegúrate de tener iOS 15+
- Verificar que todos los archivos están en el target
- Limpiar carpeta de builds (Cmd + Shift + K)
"Las descargas fallan"
- Verificar que ManhwaWebScraper funciona correctamente
- Probar con diferentes capítulos
- Verificar logs en consola
"No se guardan las imágenes"
- Verificar permisos en Info.plist
- Probar en dispositivo real (no simulador)
- Verificar espacio disponible
Contacto
Para más ayuda, consulta:
DOWNLOAD_SYSTEM_README.md- Documentación completaDIAGRAMS.md- Diagramas de flujoIntegrationExample.swift- Ejemplos de código
Tiempo de integración: 5 minutos Dificultad: Fácil Estado: ✅ COMPLETO
¡Happy coding! 🚀