diff --git a/content.js b/content.js index 4cf6f84..f17c987 100644 --- a/content.js +++ b/content.js @@ -311,45 +311,68 @@ const parser = new DOMParser(); const doc = parser.parseFromString(html, 'text/html'); - // Detectar páginas - Múltiples patrones + // Detectar páginas - Patrón ESPECÍFICO para galerías let actualTotalPages = 1; console.log('🔍 Iniciando detección de páginas para:', manga.title); - const pageInfo = doc.querySelector('.gpc, .gt, #gdn + span'); + // Buscar en TODOS los divs para encontrar el conteo de páginas + let foundPageCount = false; + const allDivs = doc.querySelectorAll('div'); + console.log(`🔍 Buscando en ${allDivs.length} divs...`); - if (pageInfo) { - const pageText = pageInfo.textContent.trim(); - console.log('🔍 Page info encontrado:', pageText); - - // Patrón 1: "Showing 1 - 20 of 220 images" - let pageMatch = pageText.match(/Showing\s+1\s*-\s*\d+\s+of\s+(\d+)\s+images/i); + for (let div of allDivs) { + const text = div.textContent.trim(); + // Patrón específico: número seguido de "pages" o "page" + const pageMatch = text.match(/^(\d+)\s+pages?$/i); if (pageMatch) { - const totalImages = parseInt(pageMatch[1]); - actualTotalPages = Math.ceil(totalImages / 20); - console.log(`✓ Patrón "Showing": ${totalImages} imágenes = ${actualTotalPages} páginas`); - } else { - // Patrón 2: "5 pages" o "X pages" - pageMatch = pageText.match(/(\d+)\s+pages?/i); - if (pageMatch) { - actualTotalPages = parseInt(pageMatch[1]); - console.log(`✓ Patrón "pages": ${actualTotalPages} páginas`); + const pageCount = parseInt(pageMatch[1]); + // Validar que sea un número razonable (1-100 páginas) + if (pageCount > 0 && pageCount <= 100) { + actualTotalPages = pageCount; + foundPageCount = true; + console.log(`✓ Patrón específico "X pages": ${actualTotalPages} páginas (div: ${div.className})`); + break; } } } - // Fallback: Buscar en todo el documento - if (actualTotalPages === 1) { - const allText = doc.body.textContent; - const pageMatch = allText.match(/(\d+)\s+pages?/i); - if (pageMatch) { - actualTotalPages = parseInt(pageMatch[1]); - console.log(`✓ Fallback: Encontradas ${actualTotalPages} páginas en el documento`); - } else { - console.log('⚠️ No se detectaron múltiples páginas, asumiendo 1 página'); + // Si no se encontró, usar patrones alternativos + if (!foundPageCount) { + console.log('⚠️ No se encontró patrón específico, buscando alternativas...'); + + const pageInfo = doc.querySelector('.gpc, .gt, #gdn + span'); + if (pageInfo) { + const pageText = pageInfo.textContent.trim(); + console.log('🔍 Page info encontrado:', pageText); + + // Patrón 1: "Showing 1 - 20 of 220 images" + let pageMatch = pageText.match(/Showing\s+1\s*-\s*\d+\s+of\s+(\d+)\s+images/i); + if (pageMatch) { + const totalImages = parseInt(pageMatch[1]); + actualTotalPages = Math.ceil(totalImages / 20); + console.log(`✓ Patrón "Showing": ${totalImages} imágenes = ${actualTotalPages} páginas`); + foundPageCount = true; + } } } - console.log(`📄 Total páginas a procesar: ${actualTotalPages}`); + // FALLBACK: Solo si no se encontró nada específico + if (!foundPageCount) { + console.log('⚠️ Usando fallback (puede ser impreciso)'); + const allText = doc.body.textContent; + // Buscar "Length: X pages" o similar + const lengthMatch = allText.match(/Length[:\s]+(\d+)\s*pages?/i); + if (lengthMatch) { + actualTotalPages = parseInt(lengthMatch[1]); + console.log(`✓ Fallback "Length": ${actualTotalPages} páginas`); + } else { + // Si no hay información, asumir 1 página + console.log('⚠️ No se pudo detectar página count, asumiendo 1 página'); + actualTotalPages = 1; + } + } + + console.log(`📄 Total páginas final a procesar: ${actualTotalPages}`); // Procesar todas las páginas for (let page = 1; page <= actualTotalPages; page++) { @@ -624,34 +647,47 @@ console.log(`✅ Proceeding with download of ${selectedObjects.length} manga...`); // Descargar cada manga + console.log(`🔄 Starting download loop for ${selectedObjects.length} manga...`); for (let i = 0; i < selectedObjects.length; i++) { const manga = selectedObjects[i]; const title = manga.title ? manga.title.substring(0, 50) : 'Manga sin título'; + console.log(`\n--- 📦 MANGA ${i + 1}/${selectedObjects.length}: ${title} ---`); + updateProgress(i, selectedObjects.length, title, `Descargando manga ${i + 1} de ${selectedObjects.length}...`); try { // Obtener URLs de imágenes + console.log(`🔍 Getting image URLs for manga ID: ${manga.id}`); const imageUrls = await getImageUrlsForManga(manga); console.log(`✅ ${manga.title}: ${imageUrls.length} imágenes encontradas`); // Enviar al background para descarga + console.log(`📨 Sending to background script...`); const response = await chrome.runtime.sendMessage({ action: 'downloadManga', metadata: manga, imageUrls: imageUrls }); - if (!response.success) { - console.error(`❌ Error descargando ${manga.title}:`, response.error); + console.log(`📨 Background response:`, response); + + if (!response || !response.success) { + console.error(`❌ Error descargando ${manga.title}:`, response ? response.error : 'No response'); } else { - console.log(`✅ Descargado: ${manga.title}`); + console.log(`✅ Descargado exitosamente: ${manga.title}`); } } catch (error) { - console.error(`❌ Error en manga ${manga.title}:`, error.message); + console.error(`❌❌❌ EXCEPTION in manga ${manga.title}:`, error); + console.error(`Stack trace:`, error.stack); + // Continue with next manga even if this one fails } + + console.log(`--- ✅ Finished manga ${i + 1} ---\n`); } + console.log('🔄 Download loop completed!'); + updateProgress(selectedObjects.length, selectedObjects.length, '¡Completado!', 'Descarga finalizada'); setTimeout(() => { hideProgress();