UNPKG

@ai-growth/n8n-nodes-wordpress

Version:

n8n node for WordPress integration with AI GROWTH - SEO WP plugin

107 lines 4.64 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.ImageDownloadService = void 0; const axios_1 = __importDefault(require("axios")); const ErrorUtils_1 = require("../utils/ErrorUtils"); const ImageUrlService_1 = require("./ImageUrlService"); /** * Serviço para download de imagens de URLs externas */ class ImageDownloadService { /** * Construtor do serviço */ constructor() { this.urlService = new ImageUrlService_1.ImageUrlService(); } /** * Realiza o download de uma imagem a partir de uma URL * @param url URL da imagem * @param options Opções de download * @returns Resultado do download */ async downloadImage(url, options = {}) { try { // Validar URL de imagem (a menos que skipValidation seja verdadeiro) if (!options.skipValidation) { url = this.urlService.validateImageUrl(url); } // Configurar opções da requisição const requestOptions = { responseType: 'arraybuffer', timeout: options.timeout || 30000, maxContentLength: options.maxSize || 10485760, // 10MB por padrão headers: { ...options.headers, 'Accept': 'image/*' } }; // Realizar o download const response = await axios_1.default.get(url, requestOptions); // Verificar se a resposta contém dados if (!response.data) { throw new ErrorUtils_1.WordPressError('Download da imagem falhou: Resposta vazia', ErrorUtils_1.WordPressErrorType.VALIDATION_FAILED); } // Determinar o tipo MIME a partir do cabeçalho Content-Type ou URL const contentType = response.headers['content-type']; const mimeTypeFromHeader = contentType && contentType.startsWith('image/') ? contentType : undefined; const mimeType = mimeTypeFromHeader || this.urlService.getMimeTypeFromUrl(url) || 'application/octet-stream'; // Extrair nome do arquivo da URL const filename = this.urlService.getFilenameFromUrl(url) || `image-${Date.now()}.${this.getExtensionFromMimeType(mimeType)}`; // Criar Buffer a partir dos dados recebidos const buffer = Buffer.from(response.data); return { data: buffer, mimeType, filename, size: buffer.length }; } catch (error) { if (error instanceof ErrorUtils_1.WordPressError) { throw error; } if (axios_1.default.isAxiosError(error)) { if (error.code === 'ECONNABORTED') { throw new ErrorUtils_1.WordPressError(`Tempo limite excedido ao baixar imagem de: ${url}`, ErrorUtils_1.WordPressErrorType.TIMEOUT); } if (error.response) { const status = error.response.status; if (status === 404) { throw new ErrorUtils_1.WordPressError(`Imagem não encontrada: ${url}`, ErrorUtils_1.WordPressErrorType.NOT_FOUND); } throw new ErrorUtils_1.WordPressError(`Erro ao baixar imagem (${status}): ${url}`, ErrorUtils_1.WordPressErrorType.NETWORK); } throw new ErrorUtils_1.WordPressError(`Erro de rede ao baixar imagem: ${url}`, ErrorUtils_1.WordPressErrorType.NETWORK); } throw new ErrorUtils_1.WordPressError(`Erro ao baixar imagem: ${url} - ${error instanceof Error ? error.message : 'Erro desconhecido'}`, ErrorUtils_1.WordPressErrorType.UNKNOWN); } } /** * Obtém a extensão de arquivo a partir do tipo MIME * @param mimeType Tipo MIME * @returns Extensão do arquivo sem o ponto */ getExtensionFromMimeType(mimeType) { const mimeToExt = { 'image/jpeg': 'jpg', 'image/png': 'png', 'image/gif': 'gif', 'image/webp': 'webp', 'image/svg+xml': 'svg', 'image/bmp': 'bmp', 'image/tiff': 'tiff' }; return mimeToExt[mimeType] || 'jpg'; } } exports.ImageDownloadService = ImageDownloadService; //# sourceMappingURL=ImageDownloadService.js.map