@ai-growth/n8n-nodes-wordpress
Version:
n8n node for WordPress integration with AI GROWTH - SEO WP plugin
107 lines • 4.64 kB
JavaScript
;
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