{"_id":"@adomay/watermark","_rev":"2-491e6033793e1bd17620c3c5d3a9e724","name":"@adomay/watermark","dist-tags":{"latest":"1.1.1"},"versions":{"1.1.0":{"name":"@adomay/watermark","version":"1.1.0","keywords":["watermark","marca-de-agua","canvas","ffmpeg","video","image"],"author":{"name":"Ado & Maycol"},"license":"MIT","_id":"@adomay/watermark@1.1.0","maintainers":[{"name":"soymaycol","email":"karatekidamericatv@gmail.com"}],"homepage":"https://github.com/thisAdo/watermark#readme","bugs":{"url":"https://github.com/thisAdo/watermark/issues"},"dist":{"shasum":"c2b913e1c03f9772e135f0e3092176e0796046c8","tarball":"https://registry.npmjs.org/@adomay/watermark/-/watermark-1.1.0.tgz","fileCount":9,"integrity":"sha512-569GLi8Cn5hrjri0CFmJqup/73vG/iBSaGO11+8vhr1/zRyvZBfdwWQ//VcjOXzCSPiU5AbRM/gknE0vAsb5Wg==","signatures":[{"sig":"MEUCIHrlZhNPfgiI6KA9nDJs86tnBVaAFkZ5+2IO9wMYjOJDAiEAgHIcc0DoKEBt0TqWuV2Q2OJita+ijDgLbEp8NoNzo/4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":21347},"main":"index.js","type":"module","gitHead":"6cc81464fd551859cb25a867d16c4e9c569758b5","scripts":{"test":"echo \"Error: no test specified\" && exit 1","start":"node index.js"},"_npmUser":{"name":"soymaycol","email":"karatekidamericatv@gmail.com"},"repository":{"url":"git+https://github.com/thisAdo/watermark.git","type":"git"},"_npmVersion":"10.8.2","description":"Un modulo simple en JavaScript puro para agregar marcas de agua a imágenes/videos usando ffmpeg nativo y canvas.","directories":{},"_nodeVersion":"18.20.8","dependencies":{"canvas":"^2.11.2","fluent-ffmpeg":"^2.1.3","@ffmpeg-installer/ffmpeg":"^1.1.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/watermark_1.1.0_1777663192449_0.03705339964920484","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@adomay/watermark","version":"1.1.1","description":"Un modulo simple en JavaScript puro para agregar/quitar marcas de agua a imágenes/videos usando ffmpeg nativo y canvas.","main":"index.js","type":"module","scripts":{"start":"node index.js","test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/thisAdo/watermark.git"},"keywords":["watermark","remove-watermark","marca-de-agua","canvas","ffmpeg","video","image","text-watermark","tile-watermark"],"author":{"name":"Ado & Maycol"},"license":"MIT","bugs":{"url":"https://github.com/thisAdo/watermark/issues"},"homepage":"https://github.com/thisAdo/watermark#readme","dependencies":{"canvas":"^2.11.2","fluent-ffmpeg":"^2.1.3","@ffmpeg-installer/ffmpeg":"^1.1.0"},"_id":"@adomay/watermark@1.1.1","gitHead":"b8d21b6db7345617573cebe7ede5c3f9db7800ba","_nodeVersion":"18.20.8","_npmVersion":"10.8.2","dist":{"integrity":"sha512-apI/EGYFuG8Iy6L6W4JnIY9VEksTwZKIzQSqaIiAi85wtBrZ2cW9xvioUlf1HIuYj+myUfxjvDvNENT4DoqIUQ==","shasum":"f37d4f3c897f0014b5164a96c3f973515460864c","tarball":"https://registry.npmjs.org/@adomay/watermark/-/watermark-1.1.1.tgz","fileCount":10,"unpackedSize":46682,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIAlRDh+2d2CQ4Gu/3bncLeOJ7P7Ma5gcOiCUuI1EGcXkAiEAi5KFlXkNULDnaIM2Z7uSX+k6sVHKO3nID8D+1QBNWKs="}]},"_npmUser":{"name":"soymaycol","email":"karatekidamericatv@gmail.com"},"directories":{},"maintainers":[{"name":"soymaycol","email":"karatekidamericatv@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/watermark_1.1.1_1777773985326_0.754728177487761"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-01T19:19:52.333Z","modified":"2026-05-03T02:06:25.619Z","1.1.0":"2026-05-01T19:19:52.616Z","1.1.1":"2026-05-03T02:06:25.478Z"},"bugs":{"url":"https://github.com/thisAdo/watermark/issues"},"author":{"name":"Ado & Maycol"},"license":"MIT","homepage":"https://github.com/thisAdo/watermark#readme","keywords":["watermark","remove-watermark","marca-de-agua","canvas","ffmpeg","video","image","text-watermark","tile-watermark"],"repository":{"type":"git","url":"git+https://github.com/thisAdo/watermark.git"},"description":"Un modulo simple en JavaScript puro para agregar/quitar marcas de agua a imágenes/videos usando ffmpeg nativo y canvas.","maintainers":[{"name":"soymaycol","email":"karatekidamericatv@gmail.com"}],"readme":"# 🦖 watermark\n\nUn módulo ligero y potente en JavaScript puro para agregar, personalizar y eliminar marcas de agua en imágenes y videos. Construido con `canvas` y `fluent-ffmpeg`, maneja sin problemas archivos locales, buffers y URLs, y sube automáticamente el contenido multimedia procesado a una CDN dual (Adoolab y Soymaycol).\n\n---\n\n> ⭐ **¡Se agradecería muchísimo si le das una estrellita al repo!** Tu apoyo ayuda a que el proyecto siga creciendo. 🦖  \n> ✨ *It would mean a lot if you starred the repo! Your support helps keep the project alive.* 🌾\n\n---\n\n**Autores / Authors:**\n- [@thisAdo](https://github.com/thisAdo)\n- [@SoyMaycol](https://github.com/SoyMaycol)\n\n---\n\n## 🦈 Contenido\n\n- [🇪🇸 Español](#-español)\n- [🇺🇸 English](#-english)\n\n---\n\n<details>\n<summary>🇪🇸 Ver en Español</summary>\n\n## 🌾 Español\n\n### 🍄 Características\n\n- 🦖 **Soporte Multiformato:** Agrega marcas de agua tanto a imágenes como a videos.\n- 🐢 **Marcas de Agua Animadas:** Soporta GIFs y videos cortos (hasta 15 segundos) como marca de agua sobre otros videos.\n- 📝 **Texto como Marca de Agua:** No tienes una imagen? Usa texto puro con fuente, color y borde personalizable.\n- 🧩 **Patrón Repetido (Tile):** Protege tus imágenes con marcas de agua en mosaico diagonales o cuadradas.\n- 🕒 **Timestamp Automático:** Agrega la fecha y hora actual dinámicamente como marca de agua.\n- 📸 **Múltiples Watermarks:** Superpon varias marcas de agua en una sola imagen con posiciones individuales.\n- 🤖 **Eliminador de Watermarks (Imágenes):** Elimina marcas de agua de imágenes automáticamente usando Inteligencia Artificial (no requiere coordenadas).\n- 🩹 **Eliminador de Watermarks (Videos):** Borra marcas de agua de videos difuminando una región específica usando `delogo`.\n- 📍 **Entradas Flexibles:** Acepta rutas de archivos locales, Buffers o URLs directas HTTP/HTTPS.\n- 🌾 **Posicionamiento Personalizado:** Coloca tu marca de agua exactamente donde la necesitas usando coordenadas o posiciones relativas.\n- 🍄 **Opacidad, Escalado y Formatos:** Ajusta transparencia, escala, calidad y formato de salida (PNG, JPG, WEBP, MP4, WEBM).\n- 🚫 **Modo Local (Skip CDN):** Procesa y devuelve solo el Buffer sin subir a ninguna CDN.\n- 🦖 **Auto-CDN Dual:** Sube automáticamente el resultado a dos CDNs al mismo tiempo y devuelve ambos enlaces.\n\n### 📍 Instalación\n\nPara instalar el módulo directamente desde GitHub usando la terminal (CLI), ejecuta:\n\n**Vía GitHub:**\n\n```bash\nnpm install github:thisAdo/watermark\n```\n\n**Vía NPM:**\n\n```bash\nnpm install @adomay/watermark\n```\n\nComo este módulo utiliza la sintaxis moderna de módulos de ECMAScript (`import`/`export`), debes asegurarte de que el proyecto donde lo vayas a usar tenga configurado `\"type\": \"module\"` en su archivo `package.json`.\n\n**Si instalas vía GitHub**, tu `package.json` debería verse así:\n\n```json\n{\n  \"name\": \"mi-proyecto-increible\",\n  \"version\": \"1.0.0\",\n  \"type\": \"module\",\n  \"dependencies\": {\n    \"@adomay/watermark\": \"github:thisAdo/watermark\"\n  }\n}\n```\n\n**Si instalas vía NPM**, tu `package.json` debería verse así:\n\n```json\n{\n  \"name\": \"mi-proyecto-increible\",\n  \"version\": \"1.0.0\",\n  \"type\": \"module\",\n  \"dependencies\": {\n    \"@adomay/watermark\": \"*\"\n  }\n}\n```\n\n### 🌾 Ejemplos de Uso\n\n#### 🍄 1. Marca de agua en una Imagen (Estándar)\n\n```js\nimport { Watermark } from '@adomay/watermark';\n\nconst watermarkService = new Watermark();\n\nconst result = await watermarkService.execute(\n    'https://cdn.adoolab.xyz/dl/8932d34a.jpg',\n    'https://cdn.adoolab.xyz/dl/watermark.png',\n    'image',\n    { x: 'right', y: 'bottom', margin: 20, opacity: 0.8, width: 150 }\n);\n\nconsole.log(result.status ? result.urls : result.msg);\n```\n\n#### 🐢 2. Marca de agua (Imagen) en un Video\n\n```js\nimport { Watermark } from '@adomay/watermark';\n\nconst watermarkService = new Watermark();\n\nconst result = await watermarkService.execute(\n    'https://cdn.adoolab.xyz/dl/db6f3f3b.mp4',\n    'https://cdn.adoolab.xyz/dl/watermark.png',\n    'video',\n    { x: 'left', y: 'top', opacity: 0.9, width: 120 }\n);\n\nconsole.log(result.status ? result.urls : result.msg);\n```\n\n#### 🦖 3. Marca de agua Animada (GIF/Video) en un Video\n\n```js\nimport { Watermark } from '@adomay/watermark';\n\nconst watermarkService = new Watermark();\n\nconst result = await watermarkService.execute(\n    'https://cdn.adoolab.xyz/dl/db6f3f3b.mp4',\n    'https://cdn.adoolab.xyz/dl/e426a597.gif',\n    'video',\n    { x: 'left', y: 'bottom', width: 100 }\n);\n\nconsole.log(result.status ? result.urls : result.msg);\n```\n\n#### 📝 4. Marca de Agua de Texto Puro\n\n```js\nimport { Watermark } from '@adomay/watermark';\n\nconst watermarkService = new Watermark();\n\nconst result = await watermarkService.execute(\n    'https://cdn.adoolab.xyz/dl/8932d34a.jpg',\n    null,\n    'image',\n    {\n        text: '© Mi Empresa 2024',\n        fontSize: 30,\n        fontColor: '#ff0000',\n        strokeColor: '#000000',\n        strokeWidth: 3,\n        x: 'center',\n        y: 'center'\n    }\n);\n\nconsole.log(result.status ? result.urls : result.msg);\n```\n\n#### 🧩 5. Patrón Repetido (Tile / Mosaico)\n\n```js\nimport { Watermark } from '@adomay/watermark';\n\nconst watermarkService = new Watermark();\n\nconst result = await watermarkService.execute(\n    'https://cdn.adoolab.xyz/dl/8932d34a.jpg',\n    'https://cdn.adoolab.xyz/dl/watermark.png',\n    'image',\n    {\n        x: 'tile',\n        y: 'tile',\n        opacity: 0.2,\n        margin: 50,\n        rotation: -30\n    }\n);\n\nconsole.log(result.status ? result.urls : result.msg);\n```\n\n#### 🕒 6. Timestamp Automático\n\n```js\nimport { Watermark } from '@adomay/watermark';\n\nconst watermarkService = new Watermark();\n\nconst result = await watermarkService.execute(\n    'https://cdn.adoolab.xyz/dl/8932d34a.jpg',\n    null,\n    'image',\n    {\n        timestamp: true,\n        timestampFormat: 'YYYY-MM-DD HH:mm:ss',\n        fontSize: 20,\n        x: 'right',\n        y: 'bottom',\n        margin: 10\n    }\n);\n\nconsole.log(result.status ? result.urls : result.msg);\n```\n\n#### 📸 7. Múltiples Watermarks a la vez\n\n```js\nimport { Watermark } from '@adomay/watermark';\n\nconst watermarkService = new Watermark();\n\nconst result = await watermarkService.execute(\n    'https://cdn.adoolab.xyz/dl/8932d34a.jpg',\n    [\n        { source: 'https://cdn.adoolab.xyz/dl/watermark.png', x: 'left', y: 'top', width: 80 },\n        { source: 'https://cdn.adoolab.xyz/dl/watermark2.png', x: 'right', y: 'bottom', width: 100 }\n    ],\n    'image'\n);\n\nconsole.log(result.status ? result.urls : result.msg);\n```\n\n#### 🚫 8. Procesar Localmente (Skip CDN)\n\n```js\nimport { Watermark } from '@adomay/watermark';\nimport fs from 'fs';\n\nconst watermarkService = new Watermark();\n\nconst result = await watermarkService.execute(\n    'https://cdn.adoolab.xyz/dl/8932d34a.jpg',\n    'https://cdn.adoolab.xyz/dl/watermark.png',\n    'image',\n    { skipCDN: true, outputFormat: 'webp', quality: 80 }\n);\n\nif (result.status) {\n    fs.writeFileSync('mi_foto_local.webp', result.data);\n}\n```\n\n#### 🤖 9. Quitar Marca de Agua en Imagen (Automático con IA)\n\n```js\nimport { Watermark } from '@adomay/watermark';\n\nconst watermarkService = new Watermark();\n\n// Para imágenes, solo pasa la URL. El módulo usa IA para detectar y borrar la marca automáticamente.\nconst result = await watermarkService.remove(\n    'https://cdn.adoolab.xyz/dl/8932d34a.jpg',\n    'image'\n);\n\nconsole.log(result.status ? result.urls : result.msg);\n```\n\n#### 🩹 10. Quitar Marca de Agua en Video (Por Región)\n\n```js\nimport { Watermark } from '@adomay/watermark';\n\nconst watermarkService = new Watermark();\n\n// Para videos, debes indicar las coordenadas exactas de la marca de agua a difuminar.\nconst result = await watermarkService.remove(\n    'https://cdn.adoolab.xyz/dl/db6f3f3b.mp4',\n    'video',\n    {\n        x: 'left',\n        y: 'bottom',\n        margin: 20,\n        width: 100,\n        height: 100\n    }\n);\n\nconsole.log(result.status ? result.urls : result.msg);\n```\n\n### 📍 Referencia de la API\n\n#### `execute(source, watermark, type, options)`\n\nInicia el proceso de superposición de la marca de agua y devuelve un objeto que contiene el Buffer resultante y los enlaces de las subidas a las CDN.\n\n**🌾 Parámetros:**\n\n| Parámetro | Tipo | Descripción |\n| --- | --- | --- |\n| `source` | `String | Buffer` | El archivo principal. Puede ser una ruta local, una URL HTTP/HTTPS directa o un Buffer en memoria. |\n| `watermark` | `String | Buffer | Array | Null` | El archivo de marca de agua. Si es `Null`, se usará `options.text`. Si es un `Array`, aplicará múltiples watermarks. |\n| `type` | `String` | El tipo de medio del archivo principal. Debe ser `'image'` o `'video'`. Por defecto: `'image'`. |\n| `options` | `Object` | Objeto opcional de configuración para cambiar la apariencia y posición de la marca de agua. |\n\n**🍄 Objeto `options`:**\n\n| Propiedad | Tipo | Por defecto | Descripción |\n| --- | --- | --- | --- |\n| `x` | `String | Number` | `'right'` | Posición horizontal. Acepta `'left'`, `'center'`, `'right'`, `'tile'`, o un número exacto en píxeles. |\n| `y` | `String | Number` | `'bottom'` | Posición vertical. Acepta `'top'`, `'center'`, `'bottom'`, `'tile'`, o un número exacto en píxeles. |\n| `margin` | `Number` | `20` | Distancia en píxeles hacia los bordes (se aplica cuando usas posiciones relativas o en mosaico). |\n| `width` | `Number` | `null` | Fuerza a la marca de agua a cambiar su tamaño a este ancho específico en píxeles. |\n| `opacity` | `Number` | `1.0` | Nivel de transparencia. Va desde `0.0` (invisible) hasta `1.0` (opaco). |\n| `rotation` | `Number` | `null` | Rota la marca de agua en grados (solo aplicable en modo mosaico `'tile'`). |\n| `text` | `String` | `null` | Texto a renderizar como marca de agua (ignora el parámetro `watermark`). |\n| `fontSize` | `Number` | `24` | Tamaño de la fuente si se usa `text`. |\n| `fontColor` | `String` | `'#ffffff'` | Color del texto (hexadecimal). |\n| `strokeColor` | `String` | `'#000000'` | Color del borde del texto (hexadecimal). |\n| `strokeWidth` | `Number` | `2` | Grosor del borde del texto. |\n| `timestamp` | `Boolean` | `false` | Si es `true`, genera un texto dinámico con la fecha y hora actuales. |\n| `timestampFormat` | `String` | `'DD/MM/YYYY HH:mm:ss'` | Formato de la fecha (variables: YYYY, MM, DD, HH, mm, ss). |\n| `skipCDN` | `Boolean` | `false` | Si es `true`, no sube el archivo a ninguna CDN y devuelve solo el Buffer. |\n| `outputFormat` | `String` | `'png'/'mp4'` | Formato de salida ('png', 'jpg', 'webp' para imágenes; 'mp4', 'webm' para videos). |\n| `quality` | `Number` | `90` | Calidad de compresión para formatos como jpg o webp (0 a 100). |\n\n#### `remove(source, type, region)`\n\nElimina una marca de agua existente. En imágenes utiliza una API de Inteligencia Artificial que detecta y borra la marca automáticamente. En videos difumina una región específica usando el filtro `delogo` de FFmpeg.\n\n**🌾 Parámetros:**\n\n| Parámetro | Tipo | Descripción |\n| --- | --- | --- |\n| `source` | `String` | El archivo principal. Nota: Para imágenes, debe ser obligatoriamente una URL pública accesible por internet (no Buffers ni rutas locales). |\n| `type` | `String` | `'image'` o `'video'`. |\n| `region` | `Object` | Opcional en imágenes (la IA se encarga). Obligatorio en videos: Requiere coordenadas (`x`, `y`, `width`, `height`). Acepta posiciones relativas (`'left'`, `'right'`, `'bottom'`, etc.) junto con `margin`, o números exactos en píxeles. |\n\n**🐢 Valor de Retorno:**\n\nSi el proceso tiene éxito, devuelve un objeto con la siguiente estructura:\n\n```js\n{\n  creator: 'Ado & Maycol',\n  status: true,\n  data: <Buffer>,\n  urls: {\n    ado: 'https://cdn.adoolab.xyz/dl/output.png',\n    maycol: 'https://cdn.soymaycol.icu/files/output.png'\n  },\n  cdnData: { ... }\n}\n```\n\nEn caso de error, devuelve:\n\n```js\n{\n  creator: 'Ado & Maycol',\n  status: false,\n  msg: 'Descripción detallada del error'\n}\n```\n\n</details>\n\n---\n\n<details>\n<summary>🇺🇸 View in English</summary>\n\n## 🌾 English\n\n### 🍄 Features\n\n- 🦖 **Multi-Format Support:** Add watermarks to both images and videos.\n- 🐢 **Animated Watermarks:** Supports GIFs and short videos (up to 15 seconds) as watermarks over other videos.\n- 📝 **Text Watermark:** Don't have an image? Use pure text with custom font, color, and stroke.\n- 🧩 **Tile Pattern:** Protect your images with diagonal or square mosaic watermarks.\n- 🕒 **Automatic Timestamp:** Dynamically add the current date and time as a watermark.\n- 📸 **Multiple Watermarks:** Overlay several watermarks on a single image with individual positions.\n- 🤖 **Watermark Remover (Images):** Removes watermarks from images automatically using Artificial Intelligence (no coordinates required).\n- 🩹 **Watermark Remover (Videos):** Erases watermarks from videos by blurring a specific region using `delogo`.\n- 📍 **Flexible Inputs:** Accepts local file paths, raw Buffers, or direct HTTP/HTTPS URLs.\n- 🌾 **Custom Positioning:** Place your watermark exactly where you need it using coordinates or relative text positions.\n- 🍄 **Opacity, Scaling & Formats:** Adjust transparency, scale, quality, and output format (PNG, JPG, WEBP, MP4, WEBM).\n- 🚫 **Local Mode (Skip CDN):** Process and return only the Buffer without uploading to any CDN.\n- 🦖 **Dual Auto-CDN:** Automatically uploads the resulting output to two external CDNs simultaneously and returns both ready-to-use URLs.\n\n### 📍 Installation\n\nTo install the module directly from GitHub using the CLI, run the following command:\n\n**By GitHub:**\n\n```bash\nnpm install github:thisAdo/watermark\n```\n\n**By NPM:**\n\n```bash\nnpm install @adomay/watermark\n```\n\nSince this module uses modern ECMAScript module syntax (`import`/`export`), you must ensure that the project where you are using it has `\"type\": \"module\"` set in its `package.json`.\n\n**If installing via GitHub**, your `package.json` should look like this:\n\n```json\n{\n  \"name\": \"my-project\",\n  \"version\": \"1.0.0\",\n  \"type\": \"module\",\n  \"dependencies\": {\n    \"@adomay/watermark\": \"github:thisAdo/watermark\"\n  }\n}\n```\n\n**If installing via NPM**, your `package.json` should look like this:\n\n```json\n{\n  \"name\": \"my-project\",\n  \"version\": \"1.0.0\",\n  \"type\": \"module\",\n  \"dependencies\": {\n    \"@adomay/watermark\": \"*\"\n  }\n}\n```\n\n### 🌾 Usage Examples\n\n#### 🍄 1. Watermark on an Image (Standard)\n\n```js\nimport { Watermark } from '@adomay/watermark';\n\nconst watermarkService = new Watermark();\n\nconst result = await watermarkService.execute(\n    'https://cdn.adoolab.xyz/dl/8932d34a.jpg',\n    'https://cdn.adoolab.xyz/dl/watermark.png',\n    'image',\n    { x: 'right', y: 'bottom', margin: 20, opacity: 0.8, width: 150 }\n);\n\nconsole.log(result.status ? result.urls : result.msg);\n```\n\n#### 🐢 2. Static Watermark (Image) on a Video\n\n```js\nimport { Watermark } from '@adomay/watermark';\n\nconst watermarkService = new Watermark();\n\nconst result = await watermarkService.execute(\n    'https://cdn.adoolab.xyz/dl/db6f3f3b.mp4',\n    'https://cdn.adoolab.xyz/dl/watermark.png',\n    'video',\n    { x: 'left', y: 'top', opacity: 0.9, width: 120 }\n);\n\nconsole.log(result.status ? result.urls : result.msg);\n```\n\n#### 🦖 3. Animated Watermark (GIF/Video) on a Video\n\n```js\nimport { Watermark } from '@adomay/watermark';\n\nconst watermarkService = new Watermark();\n\nconst result = await watermarkService.execute(\n    'https://cdn.adoolab.xyz/dl/db6f3f3b.mp4',\n    'https://cdn.adoolab.xyz/dl/e426a597.gif',\n    'video',\n    { x: 'left', y: 'bottom', width: 100 }\n);\n\nconsole.log(result.status ? result.urls : result.msg);\n```\n\n#### 📝 4. Pure Text Watermark\n\n```js\nimport { Watermark } from '@adomay/watermark';\n\nconst watermarkService = new Watermark();\n\nconst result = await watermarkService.execute(\n    'https://cdn.adoolab.xyz/dl/8932d34a.jpg',\n    null,\n    'image',\n    {\n        text: '© My Company 2024',\n        fontSize: 30,\n        fontColor: '#ff0000',\n        strokeColor: '#000000',\n        strokeWidth: 3,\n        x: 'center',\n        y: 'center'\n    }\n);\n\nconsole.log(result.status ? result.urls : result.msg);\n```\n\n#### 🧩 5. Repeated Pattern (Tile / Mosaic)\n\n```js\nimport { Watermark } from '@adomay/watermark';\n\nconst watermarkService = new Watermark();\n\nconst result = await watermarkService.execute(\n    'https://cdn.adoolab.xyz/dl/8932d34a.jpg',\n    'https://cdn.adoolab.xyz/dl/watermark.png',\n    'image',\n    {\n        x: 'tile',\n        y: 'tile',\n        opacity: 0.2,\n        margin: 50,\n        rotation: -30\n    }\n);\n\nconsole.log(result.status ? result.urls : result.msg);\n```\n\n#### 🕒 6. Automatic Timestamp\n\n```js\nimport { Watermark } from '@adomay/watermark';\n\nconst watermarkService = new Watermark();\n\nconst result = await watermarkService.execute(\n    'https://cdn.adoolab.xyz/dl/8932d34a.jpg',\n    null,\n    'image',\n    {\n        timestamp: true,\n        timestampFormat: 'YYYY-MM-DD HH:mm:ss',\n        fontSize: 20,\n        x: 'right',\n        y: 'bottom',\n        margin: 10\n    }\n);\n\nconsole.log(result.status ? result.urls : result.msg);\n```\n\n#### 📸 7. Multiple Watermarks at Once\n\n```js\nimport { Watermark } from '@adomay/watermark';\n\nconst watermarkService = new Watermark();\n\nconst result = await watermarkService.execute(\n    'https://cdn.adoolab.xyz/dl/8932d34a.jpg',\n    [\n        { source: 'https://cdn.adoolab.xyz/dl/watermark.png', x: 'left', y: 'top', width: 80 },\n        { source: 'https://cdn.adoolab.xyz/dl/watermark2.png', x: 'right', y: 'bottom', width: 100 }\n    ],\n    'image'\n);\n\nconsole.log(result.status ? result.urls : result.msg);\n```\n\n#### 🚫 8. Process Locally (Skip CDN)\n\n```js\nimport { Watermark } from '@adomay/watermark';\nimport fs from 'fs';\n\nconst watermarkService = new Watermark();\n\nconst result = await watermarkService.execute(\n    'https://cdn.adoolab.xyz/dl/8932d34a.jpg',\n    'https://cdn.adoolab.xyz/dl/watermark.png',\n    'image',\n    { skipCDN: true, outputFormat: 'webp', quality: 80 }\n);\n\nif (result.status) {\n    fs.writeFileSync('my_local_photo.webp', result.data);\n}\n```\n\n#### 🤖 9. Remove Watermark from Image (Automatic with AI)\n\n```js\nimport { Watermark } from '@adomay/watermark';\n\nconst watermarkService = new Watermark();\n\n// For images, just pass the URL. The module uses AI to detect and erase the watermark automatically.\nconst result = await watermarkService.remove(\n    'https://cdn.adoolab.xyz/dl/8932d34a.jpg',\n    'image'\n);\n\nconsole.log(result.status ? result.urls : result.msg);\n```\n\n#### 🩹 10. Remove Watermark from Video (By Region)\n\n```js\nimport { Watermark } from '@adomay/watermark';\n\nconst watermarkService = new Watermark();\n\n// For videos, you must specify the exact coordinates of the watermark area to blur.\nconst result = await watermarkService.remove(\n    'https://cdn.adoolab.xyz/dl/db6f3f3b.mp4',\n    'video',\n    {\n        x: 'left',\n        y: 'bottom',\n        margin: 20,\n        width: 100,\n        height: 100\n    }\n);\n\nconsole.log(result.status ? result.urls : result.msg);\n```\n\n### 📍 API Reference\n\n#### `execute(source, watermark, type, options)`\n\nExecutes the watermark overlay process and returns an object containing the resulting Buffer and the dual CDN upload data.\n\n**🌾 Parameters:**\n\n| Parameter | Type | Description |\n| --- | --- | --- |\n| `source` | `String | Buffer` | The main media file. Can be a local path, an HTTP/HTTPS URL, or a Buffer. |\n| `watermark` | `String | Buffer | Array | Null` | The watermark file. If Null, uses `options.text`. If an `Array`, applies multiple watermarks sequentially. |\n| `type` | `String` | Specifies the main media type. Must be either `'image'` or `'video'`. Defaults to `'image'`. |\n| `options` | `Object` | Optional configuration object to change the watermark's appearance and position. |\n\n**🍄 Options Object:**\n\n| Property | Type | Default | Description |\n| --- | --- | --- | --- |\n| `x` | `String | Number` | `'right'` | Horizontal position. Accepts `'left'`, `'center'`, `'right'`, `'tile'`, or a specific number in pixels. |\n| `y` | `String | Number` | `'bottom'` | Vertical position. Accepts `'top'`, `'center'`, `'bottom'`, `'tile'`, or a specific number in pixels. |\n| `margin` | `Number` | `20` | Margin in pixels applied when using relative string positions or tile mode. |\n| `width` | `Number` | `null` | Forces the watermark to scale to a specific width in pixels. |\n| `opacity` | `Number` | `1.0` | Transparency level, from `0.0` (invisible) to `1.0` (fully opaque). |\n| `rotation` | `Number` | `null` | Rotates the watermark in degrees (only applicable in `'tile'` mode). |\n| `text` | `String` | `null` | Text to render as a watermark (ignores the `watermark` parameter). |\n| `fontSize` | `Number` | `24` | Font size if using `text`. |\n| `fontColor` | `String` | `'#ffffff'` | Text color (hexadecimal). |\n| `strokeColor` | `String` | `'#000000'` | Text stroke color (hexadecimal). |\n| `strokeWidth` | `Number` | `2` | Text stroke thickness. |\n| `timestamp` | `Boolean` | `false` | If `true`, generates dynamic text with the current date and time. |\n| `timestampFormat` | `String` | `'DD/MM/YYYY HH:mm:ss'` | Date format (variables: YYYY, MM, DD, HH, mm, ss). |\n| `skipCDN` | `Boolean` | `false` | If `true`, skips uploading to CDNs and returns only the Buffer. |\n| `outputFormat` | `String` | `'png'/'mp4'` | Output format ('png', 'jpg', 'webp' for images; 'mp4', 'webm' for videos). |\n| `quality` | `Number` | `90` | Compression quality for formats like jpg or webp (0 to 100). |\n\n#### `remove(source, type, region)`\n\nRemoves an existing watermark. For images, it uses an Artificial Intelligence API that detects and erases the mark automatically. For videos, it blurs a specific region using FFmpeg's `delogo` filter.\n\n**🌾 Parameters:**\n\n| Parameter | Type | Description |\n| --- | --- | --- |\n| `source` | `String` | The main media file. **Note:** For images, it must strictly be a public URL accessible via the internet (no Buffers or local paths). |\n| `type` | `String` | `'image'` or `'video'`. |\n| `region` | `Object` | **Optional for images** (AI handles it). **Mandatory for videos:** Requires coordinates (`x`, `y`, `width`, `height`). Accepts relative positions (`'left'`, `'right'`, `'bottom'`, etc.) along with `margin`, or exact pixel numbers. |\n\n**🐢 Return Value:**\n\nIf successful, returns a Promise that resolves to an object with the following structure:\n\n```js\n{\n  creator: 'Ado & Maycol',\n  status: true,\n  data: <Buffer>,\n  urls: {\n    ado: 'https://cdn.adoolab.xyz/dl/output.png',\n    maycol: 'https://cdn.soymaycol.icu/files/output.png'\n  },\n  cdnData: { ... }\n}\n```\n\nIf an error occurs, it returns:\n\n```js\n{\n  creator: 'Ado & Maycol',\n  status: false,\n  msg: 'Detailed error description'\n}\n```\n\n</details>\n","readmeFilename":"README.md"}