diff --git a/simple-crawler/smart-cloner.js b/simple-crawler/smart-cloner.js index 2501c89..816fc08 100644 --- a/simple-crawler/smart-cloner.js +++ b/simple-crawler/smart-cloner.js @@ -333,7 +333,10 @@ self.addEventListener('fetch', (event) => { `; fs.writeFileSync(path.join(siteDir, 'mock-sw.js'), swCode); - return { success: true, path: siteDir, pagesCloned: pageCount }; + var countFiles = function(dir) { var ts=0,fc=0; (function rec(d){if(!fs.existsSync(d))return;fs.readdirSync(d).forEach(function(i){var p=path.join(d,i),s=fs.statSync(p);if(s.isDirectory()&&i.indexOf("cloned-sites")==-1&&i.indexOf(".versions")==-1)rec(p);else if(!s.isDirectory()){ts+=s.size;fc++;}});})(dir);return{fileCount:fc,totalSize:ts};}; + const stats = countFiles(siteDir); + + return { success: true, path: siteDir, pagesCloned: pageCount, files: stats.fileCount, size: stats.totalSize }; } catch (e) { console.error('❌ Erro Deep Clone:', e); return { success: false, error: e.message }; diff --git a/simple-crawler/wget-cloner.js b/simple-crawler/wget-cloner.js index 804bbde..e5953b2 100644 --- a/simple-crawler/wget-cloner.js +++ b/simple-crawler/wget-cloner.js @@ -112,6 +112,8 @@ class WgetCloner { '--convert-links', // Converter links para locais '--restrict-file-names=windows', // Nomes compatíveis com Windows '--domains=' + urlObj.hostname, // Apenas este domínio + '--span-hosts', // Permitir redirecionamentos entre subdomínios/CDN + '--user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36"', '--no-parent', // Não subir diretórios '--no-check-certificate', // Ignorar SSL '-e', 'robots=off', // Ignorar robots.txt @@ -161,6 +163,15 @@ class WgetCloner { console.log(`${'='.repeat(60)}`); console.log(`📁 Localização: ${siteDir}`); + const { execSync } = require('child_process'); + // Mover arquivos do subdiretório do domínio para a raiz do siteDir + try { + const domainDir = path.join(siteDir, urlObj.hostname); + if (fs.existsSync(domainDir)) { + execSync(`cp -r "${domainDir}"/* "${siteDir}"/ 2>/dev/null && rm -rf "${domainDir}"`); + } + } catch (e) {} + // Baixar imagens faltantes manualmente console.log(`\n🔍 Verificando imagens faltantes...`); this.downloadMissingImages(siteDir, url).then(() => { @@ -203,6 +214,8 @@ class WgetCloner { directory: siteDir, method: 'wget', exitCode: code, + files: stats.fileCount, + size: stats.totalSize, cloneInfo: info }); } else { diff --git a/web-interface/public/app-new.js b/web-interface/public/app-new.js index 44ea404..b6fe0c5 100644 --- a/web-interface/public/app-new.js +++ b/web-interface/public/app-new.js @@ -329,9 +329,8 @@ async function startCloning(url, options) { progressMessage.textContent = '✅ Clonagem concluída com sucesso!'; // Update stats - // Update stats - const files = data.data.resources || data.data.files || 0; - const size = data.data.size || 0; // Smart clone might not return size yet + const files = data.data?.files || data.data?.cloneInfo?.fileCount || data.data?.resources || data.files || 0; + const size = data.data?.size || data.data?.cloneInfo?.totalSize || data.size || 0; filesDownloaded.textContent = files; sizeDownloaded.textContent = formatBytes(size);