@boruto_vk7/stickengine 0.0.6 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +18 -12
- package/README.md +162 -83
- package/dist/cjs/StickEngine.js +616 -0
- package/dist/cjs/StickEngine.js.map +1 -0
- package/dist/cjs/emror.jpg +0 -0
- package/dist/cjs/index.js +9 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/package.json +3 -0
- package/dist/esm/StickEngine.js +576 -0
- package/dist/esm/StickEngine.js.map +1 -0
- package/dist/esm/emror.jpg +0 -0
- package/dist/esm/index.js +3 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/types/StickEngine.d.ts +137 -0
- package/dist/types/StickEngine.d.ts.map +1 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.d.ts.map +1 -0
- package/package.json +55 -32
- package/assets/preview_animated.png +0 -0
- package/assets/preview_sepia.png +0 -0
- package/dist/StickEngine.d.ts +0 -72
- package/dist/StickEngine.js +0 -369
|
@@ -0,0 +1,616 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.StickEngine = void 0;
|
|
40
|
+
exports.getBuffer = getBuffer;
|
|
41
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
42
|
+
const promises_1 = __importDefault(require("node:fs/promises"));
|
|
43
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
44
|
+
const node_child_process_1 = require("node:child_process");
|
|
45
|
+
const node_events_1 = require("node:events");
|
|
46
|
+
const axios_1 = __importDefault(require("axios"));
|
|
47
|
+
const fluent_ffmpeg_1 = __importDefault(require("fluent-ffmpeg"));
|
|
48
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
49
|
+
// @ts-ignore
|
|
50
|
+
const node_webpmux_1 = __importDefault(require("node-webpmux"));
|
|
51
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
52
|
+
// @ts-ignore
|
|
53
|
+
const jimp_1 = __importDefault(require("jimp"));
|
|
54
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
55
|
+
// @ts-ignore
|
|
56
|
+
const remove_bg_1 = require("remove.bg");
|
|
57
|
+
const moduleDir = typeof __dirname !== 'undefined' ? __dirname : process.cwd();
|
|
58
|
+
// ── Helpers ────────────────────────────────────────────────────────────────
|
|
59
|
+
async function getBuffer(url, options = {}) {
|
|
60
|
+
try {
|
|
61
|
+
const { data } = await (0, axios_1.default)({
|
|
62
|
+
method: 'get',
|
|
63
|
+
url,
|
|
64
|
+
headers: {
|
|
65
|
+
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
|
|
66
|
+
DNT: '1',
|
|
67
|
+
},
|
|
68
|
+
...options,
|
|
69
|
+
responseType: 'arraybuffer',
|
|
70
|
+
timeout: 45000,
|
|
71
|
+
});
|
|
72
|
+
return Buffer.from(data);
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
const fallback = node_path_1.default.join(moduleDir, 'emror.jpg');
|
|
76
|
+
if (node_fs_1.default.existsSync(fallback))
|
|
77
|
+
return node_fs_1.default.readFileSync(fallback);
|
|
78
|
+
throw new Error(`Failed to download: ${err instanceof Error ? err.message : String(err)}`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
function resolveWebpImage() {
|
|
82
|
+
const Image = node_webpmux_1.default.Image || node_webpmux_1.default.default?.Image;
|
|
83
|
+
if (!Image)
|
|
84
|
+
throw new Error('node-webpmux Image class not found');
|
|
85
|
+
return Image;
|
|
86
|
+
}
|
|
87
|
+
async function fileTypeFromBuf(buf) {
|
|
88
|
+
const ft = await Promise.resolve().then(() => __importStar(require('file-type')));
|
|
89
|
+
const mod = ft;
|
|
90
|
+
const fn = mod.fileTypeFromBuffer ||
|
|
91
|
+
mod.fromBuffer ||
|
|
92
|
+
mod.default?.fileTypeFromBuffer ||
|
|
93
|
+
mod.default?.fromBuffer;
|
|
94
|
+
if (!fn)
|
|
95
|
+
return undefined;
|
|
96
|
+
return fn(buf);
|
|
97
|
+
}
|
|
98
|
+
function isHttp(s) {
|
|
99
|
+
return /^https?:\/\//i.test(s);
|
|
100
|
+
}
|
|
101
|
+
// ── Engine ─────────────────────────────────────────────────────────────────
|
|
102
|
+
/**
|
|
103
|
+
* WhatsApp sticker engine (static + animated WebP + EXIF pack metadata).
|
|
104
|
+
*
|
|
105
|
+
* @example
|
|
106
|
+
* ```ts
|
|
107
|
+
* import StickEngine from '@boruto_vk7/stickengine';
|
|
108
|
+
*
|
|
109
|
+
* const sticker = await StickEngine.create('./cat.gif', {
|
|
110
|
+
* metadata: { pack: 'My Pack', author: 'Me' },
|
|
111
|
+
* });
|
|
112
|
+
* // sticker.buffer → send to WhatsApp
|
|
113
|
+
* // sticker.path → temp file path
|
|
114
|
+
* ```
|
|
115
|
+
*/
|
|
116
|
+
class StickEngine extends node_events_1.EventEmitter {
|
|
117
|
+
constructor(options = {}) {
|
|
118
|
+
super();
|
|
119
|
+
this.queue = [];
|
|
120
|
+
this.createdFiles = [];
|
|
121
|
+
this.options = {
|
|
122
|
+
webp: true,
|
|
123
|
+
edit: false,
|
|
124
|
+
transparent: false,
|
|
125
|
+
autoClean: false,
|
|
126
|
+
fps: 15,
|
|
127
|
+
quality: 75,
|
|
128
|
+
maxDuration: 6,
|
|
129
|
+
metadata: {
|
|
130
|
+
pack: 'StickEngine',
|
|
131
|
+
author: 'Borutovk7',
|
|
132
|
+
emojis: ['✨'],
|
|
133
|
+
},
|
|
134
|
+
...options,
|
|
135
|
+
};
|
|
136
|
+
this.tempDir = node_path_1.default.resolve(options.tempDir || node_path_1.default.join(process.cwd(), 'tmp_stickengine'));
|
|
137
|
+
node_fs_1.default.mkdirSync(this.tempDir, { recursive: true });
|
|
138
|
+
}
|
|
139
|
+
// ── One-shot API (simplest) ──────────────────────────────────────────────
|
|
140
|
+
/**
|
|
141
|
+
* Create a sticker in one call. Returns path + buffer + base64.
|
|
142
|
+
*/
|
|
143
|
+
static async create(input, options = {}) {
|
|
144
|
+
const engine = new StickEngine({ ...options, autoClean: false });
|
|
145
|
+
try {
|
|
146
|
+
return await engine.build(input);
|
|
147
|
+
}
|
|
148
|
+
finally {
|
|
149
|
+
// keep result file; drop other temps if any
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Create sticker and return only the Buffer (handy for bots).
|
|
154
|
+
*/
|
|
155
|
+
static async toBuffer(input, options = {}) {
|
|
156
|
+
const r = await StickEngine.create(input, options);
|
|
157
|
+
return r.buffer;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Create sticker and return base64 string.
|
|
161
|
+
*/
|
|
162
|
+
static async toBase64String(input, options = {}) {
|
|
163
|
+
const r = await StickEngine.create(input, options);
|
|
164
|
+
return r.base64;
|
|
165
|
+
}
|
|
166
|
+
/** Instance one-shot (uses constructor options). */
|
|
167
|
+
async build(input) {
|
|
168
|
+
const filePath = await this.processFile(input, 0);
|
|
169
|
+
const buffer = await promises_1.default.readFile(filePath);
|
|
170
|
+
const info = await this.getMediaInfo(filePath);
|
|
171
|
+
const animated = await this.detectAnimatedWebp(filePath);
|
|
172
|
+
const result = {
|
|
173
|
+
path: filePath,
|
|
174
|
+
buffer,
|
|
175
|
+
base64: buffer.toString('base64'),
|
|
176
|
+
animated,
|
|
177
|
+
width: info.width || 512,
|
|
178
|
+
height: info.height || 512,
|
|
179
|
+
size: buffer.length,
|
|
180
|
+
};
|
|
181
|
+
this.emit('st.done', result);
|
|
182
|
+
return result;
|
|
183
|
+
}
|
|
184
|
+
// ── Queue API (batch) ────────────────────────────────────────────────────
|
|
185
|
+
addFile(file) {
|
|
186
|
+
this.queue.push(file);
|
|
187
|
+
return this;
|
|
188
|
+
}
|
|
189
|
+
add(...files) {
|
|
190
|
+
this.queue.push(...files);
|
|
191
|
+
return this;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Process the queue. Returns settled results with `value` = absolute path.
|
|
195
|
+
* Prefer `build()` / `StickEngine.create()` for a simpler API.
|
|
196
|
+
*/
|
|
197
|
+
async start() {
|
|
198
|
+
if (!this.queue.length)
|
|
199
|
+
throw new Error('Queue is empty. Use addFile() or StickEngine.create().');
|
|
200
|
+
const jobs = this.queue.map((file, i) => this.processFile(file, i));
|
|
201
|
+
this.queue = [];
|
|
202
|
+
return Promise.allSettled(jobs);
|
|
203
|
+
}
|
|
204
|
+
/** Delete tracked temp files. */
|
|
205
|
+
clean() {
|
|
206
|
+
for (const file of this.createdFiles) {
|
|
207
|
+
try {
|
|
208
|
+
if (node_fs_1.default.existsSync(file))
|
|
209
|
+
node_fs_1.default.unlinkSync(file);
|
|
210
|
+
}
|
|
211
|
+
catch {
|
|
212
|
+
/* ignore */
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
this.createdFiles = [];
|
|
216
|
+
}
|
|
217
|
+
// ── Core pipeline ────────────────────────────────────────────────────────
|
|
218
|
+
track(file) {
|
|
219
|
+
this.createdFiles.push(file);
|
|
220
|
+
return file;
|
|
221
|
+
}
|
|
222
|
+
async processFile(input, index) {
|
|
223
|
+
const ts = `${Date.now()}_${index}_${Math.random().toString(36).slice(2, 7)}`;
|
|
224
|
+
const local = [];
|
|
225
|
+
try {
|
|
226
|
+
this.emit('st.start', { index, input: typeof input === 'string' ? input : '<buffer>' });
|
|
227
|
+
const { filePath, extension } = await this.materializeInput(input, ts);
|
|
228
|
+
local.push(filePath);
|
|
229
|
+
const mediaInfo = await this.getMediaInfo(filePath);
|
|
230
|
+
this.emit('st.info', { index, ...mediaInfo, extension });
|
|
231
|
+
let current = filePath;
|
|
232
|
+
let animated = mediaInfo.duration > 0.05 ||
|
|
233
|
+
['gif', 'mp4', 'webm', 'mov', 'mkv', 'avi'].includes(extension) ||
|
|
234
|
+
(extension === 'webp' && (await this.detectAnimatedWebp(filePath)));
|
|
235
|
+
// Static edits only
|
|
236
|
+
if (this.options.edit && !animated) {
|
|
237
|
+
const edited = node_path_1.default.join(this.tempDir, `edited_${ts}.png`);
|
|
238
|
+
await this.applyJimpEdits(current, edited, this.options.edit);
|
|
239
|
+
local.push(edited);
|
|
240
|
+
current = edited;
|
|
241
|
+
}
|
|
242
|
+
// remove.bg static only
|
|
243
|
+
if (this.options.transparent && !animated) {
|
|
244
|
+
const key = Array.isArray(this.options.transparent)
|
|
245
|
+
? this.options.transparent[Math.floor(Math.random() * this.options.transparent.length)]
|
|
246
|
+
: this.options.transparent;
|
|
247
|
+
if (typeof key === 'string' && key.length > 5) {
|
|
248
|
+
const out = node_path_1.default.join(this.tempDir, `nobg_${ts}.png`);
|
|
249
|
+
const result = await (0, remove_bg_1.removeBackgroundFromImageFile)({
|
|
250
|
+
path: current,
|
|
251
|
+
apiKey: key,
|
|
252
|
+
size: 'auto',
|
|
253
|
+
type: 'auto',
|
|
254
|
+
});
|
|
255
|
+
node_fs_1.default.writeFileSync(out, Buffer.from(result.base64img, 'base64'));
|
|
256
|
+
local.push(out);
|
|
257
|
+
current = out;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
const webpPath = node_path_1.default.join(this.tempDir, `sticker_${ts}.webp`);
|
|
261
|
+
await this.convertToWebp(current, webpPath, animated);
|
|
262
|
+
local.push(webpPath);
|
|
263
|
+
current = webpPath;
|
|
264
|
+
// Re-check after ffmpeg (source of truth)
|
|
265
|
+
animated = await this.detectAnimatedWebp(current);
|
|
266
|
+
if (this.options.metadata !== undefined && this.options.metadata !== null) {
|
|
267
|
+
await this.addExif(current, this.options.metadata || {});
|
|
268
|
+
}
|
|
269
|
+
for (const f of local)
|
|
270
|
+
this.track(f);
|
|
271
|
+
this.emit('st.data', { index, file: current, animated });
|
|
272
|
+
return current;
|
|
273
|
+
}
|
|
274
|
+
catch (error) {
|
|
275
|
+
this.emit('st.error', { index, error: error?.message || String(error) });
|
|
276
|
+
for (const f of local) {
|
|
277
|
+
try {
|
|
278
|
+
if (node_fs_1.default.existsSync(f))
|
|
279
|
+
node_fs_1.default.unlinkSync(f);
|
|
280
|
+
}
|
|
281
|
+
catch {
|
|
282
|
+
/* ignore */
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
throw error;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
async materializeInput(input, ts) {
|
|
289
|
+
if (Buffer.isBuffer(input)) {
|
|
290
|
+
const type = await fileTypeFromBuf(input);
|
|
291
|
+
const extension = type?.ext || 'bin';
|
|
292
|
+
const filePath = node_path_1.default.join(this.tempDir, `input_${ts}.${extension}`);
|
|
293
|
+
node_fs_1.default.writeFileSync(filePath, input);
|
|
294
|
+
return { filePath, extension };
|
|
295
|
+
}
|
|
296
|
+
if (typeof input === 'string' && isHttp(input)) {
|
|
297
|
+
const buffer = await getBuffer(input);
|
|
298
|
+
const type = await fileTypeFromBuf(buffer);
|
|
299
|
+
const extension = type?.ext || 'bin';
|
|
300
|
+
const filePath = node_path_1.default.join(this.tempDir, `input_${ts}.${extension}`);
|
|
301
|
+
node_fs_1.default.writeFileSync(filePath, buffer);
|
|
302
|
+
return { filePath, extension };
|
|
303
|
+
}
|
|
304
|
+
if (typeof input === 'string' && node_fs_1.default.existsSync(input)) {
|
|
305
|
+
const filePath = node_path_1.default.resolve(input);
|
|
306
|
+
const extension = node_path_1.default.extname(filePath).replace('.', '').toLowerCase() || 'bin';
|
|
307
|
+
return { filePath, extension };
|
|
308
|
+
}
|
|
309
|
+
throw new Error('Invalid input. Pass a file path, http(s) URL, or Buffer.');
|
|
310
|
+
}
|
|
311
|
+
// ── EXIF (fixes animated save error) ─────────────────────────────────────
|
|
312
|
+
/**
|
|
313
|
+
* Write WhatsApp sticker pack EXIF.
|
|
314
|
+
* Animated WebP MUST use muxAnim — save() throws on animations.
|
|
315
|
+
*/
|
|
316
|
+
async addExif(webpPath, metadata) {
|
|
317
|
+
const Image = resolveWebpImage();
|
|
318
|
+
const img = new Image();
|
|
319
|
+
const json = {
|
|
320
|
+
'sticker-pack-id': metadata.id || `stickengine-${Date.now()}`,
|
|
321
|
+
'sticker-pack-name': metadata.pack || 'StickEngine',
|
|
322
|
+
'sticker-pack-publisher': metadata.author || 'Borutovk7',
|
|
323
|
+
emojis: metadata.emojis?.length ? metadata.emojis : ['✨'],
|
|
324
|
+
};
|
|
325
|
+
const exifAttr = Buffer.from([
|
|
326
|
+
0x49, 0x49, 0x2a, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x41, 0x57, 0x07, 0x00, 0x00, 0x00,
|
|
327
|
+
0x00, 0x00, 0x16, 0x00, 0x00, 0x00,
|
|
328
|
+
]);
|
|
329
|
+
const jsonBuff = Buffer.from(JSON.stringify(json), 'utf-8');
|
|
330
|
+
const exif = Buffer.concat([exifAttr, jsonBuff]);
|
|
331
|
+
exif.writeUIntLE(jsonBuff.length, 14, 4);
|
|
332
|
+
await img.load(webpPath);
|
|
333
|
+
img.exif = exif;
|
|
334
|
+
const frameCount = typeof img.frameCount === 'number'
|
|
335
|
+
? img.frameCount
|
|
336
|
+
: Array.isArray(img.frames)
|
|
337
|
+
? img.frames.length
|
|
338
|
+
: 0;
|
|
339
|
+
const animated = !!img.hasAnim || frameCount > 1;
|
|
340
|
+
/**
|
|
341
|
+
* node-webpmux compatibility layer
|
|
342
|
+
*
|
|
343
|
+
* v3.x (current):
|
|
344
|
+
* await img.save(path) // works for static AND animated (passes frames)
|
|
345
|
+
*
|
|
346
|
+
* v1.x / early forks:
|
|
347
|
+
* static → img.save(path)
|
|
348
|
+
* anim → img.muxAnim({ path, exif: true }) OR Image.muxAnim({ frames, exif, path })
|
|
349
|
+
* calling save() on anim throws:
|
|
350
|
+
* "Using `save` for animations is not currently supported. Use `muxAnim` instead"
|
|
351
|
+
*/
|
|
352
|
+
const saveV3 = async () => {
|
|
353
|
+
// v3 instance save supports both; pass exif explicitly when supported
|
|
354
|
+
return img.save(webpPath, {
|
|
355
|
+
exif: true,
|
|
356
|
+
frames: animated ? img.frames : undefined,
|
|
357
|
+
width: img.width,
|
|
358
|
+
height: img.height,
|
|
359
|
+
loops: img.anim?.loops ?? img.anim?.loopCount ?? 0,
|
|
360
|
+
bgColor: img.anim?.bgColor ?? img.anim?.backgroundColor ?? [0, 0, 0, 0],
|
|
361
|
+
});
|
|
362
|
+
};
|
|
363
|
+
const saveLegacyMuxAnim = async () => {
|
|
364
|
+
const opts = {
|
|
365
|
+
path: webpPath,
|
|
366
|
+
frames: img.frames || [],
|
|
367
|
+
width: img.width || 512,
|
|
368
|
+
height: img.height || 512,
|
|
369
|
+
loops: img.anim?.loopCount ?? img.anim?.loops ?? 0,
|
|
370
|
+
bgColor: img.anim?.backgroundColor ?? img.anim?.bgColor ?? [0, 0, 0, 0],
|
|
371
|
+
exif,
|
|
372
|
+
};
|
|
373
|
+
if (typeof img.muxAnim === 'function') {
|
|
374
|
+
return img.muxAnim({
|
|
375
|
+
path: webpPath,
|
|
376
|
+
exif: true,
|
|
377
|
+
width: opts.width,
|
|
378
|
+
height: opts.height,
|
|
379
|
+
loops: opts.loops,
|
|
380
|
+
bgColor: opts.bgColor,
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
if (typeof Image.muxAnim === 'function') {
|
|
384
|
+
return Image.muxAnim(opts);
|
|
385
|
+
}
|
|
386
|
+
// absolute last resort: try plain save (v3)
|
|
387
|
+
return img.save(webpPath);
|
|
388
|
+
};
|
|
389
|
+
try {
|
|
390
|
+
if (typeof img.save === 'function') {
|
|
391
|
+
try {
|
|
392
|
+
await saveV3();
|
|
393
|
+
}
|
|
394
|
+
catch (err) {
|
|
395
|
+
const msg = String(err?.message || err);
|
|
396
|
+
if (/muxAnim|animations is not currently supported|Using `save`/i.test(msg)) {
|
|
397
|
+
await saveLegacyMuxAnim();
|
|
398
|
+
}
|
|
399
|
+
else if (animated) {
|
|
400
|
+
// some builds want save without second arg
|
|
401
|
+
try {
|
|
402
|
+
await img.save(webpPath);
|
|
403
|
+
}
|
|
404
|
+
catch (err2) {
|
|
405
|
+
const m2 = String(err2?.message || err2);
|
|
406
|
+
if (/muxAnim|animations is not currently supported|Using `save`/i.test(m2)) {
|
|
407
|
+
await saveLegacyMuxAnim();
|
|
408
|
+
}
|
|
409
|
+
else {
|
|
410
|
+
throw err2;
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
else {
|
|
415
|
+
throw err;
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
else if (typeof Image.save === 'function') {
|
|
420
|
+
// very old static save(path, image)
|
|
421
|
+
await Image.save(webpPath, img);
|
|
422
|
+
}
|
|
423
|
+
else {
|
|
424
|
+
await saveLegacyMuxAnim();
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
catch (err) {
|
|
428
|
+
const msg = String(err?.message || err);
|
|
429
|
+
if (/muxAnim|animations is not currently supported|Using `save`/i.test(msg)) {
|
|
430
|
+
await saveLegacyMuxAnim();
|
|
431
|
+
return;
|
|
432
|
+
}
|
|
433
|
+
throw err;
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
async detectAnimatedWebp(filePath) {
|
|
437
|
+
try {
|
|
438
|
+
if (!filePath.toLowerCase().endsWith('.webp') && !node_fs_1.default.existsSync(filePath))
|
|
439
|
+
return false;
|
|
440
|
+
const Image = resolveWebpImage();
|
|
441
|
+
const img = new Image();
|
|
442
|
+
await img.load(filePath);
|
|
443
|
+
return (!!img.hasAnim ||
|
|
444
|
+
(typeof img.frameCount === 'number' && img.frameCount > 1) ||
|
|
445
|
+
(Array.isArray(img.frames) && img.frames.length > 1));
|
|
446
|
+
}
|
|
447
|
+
catch {
|
|
448
|
+
return false;
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
// ── FFmpeg / Jimp ────────────────────────────────────────────────────────
|
|
452
|
+
async convertToWebp(input, output, isAnimated) {
|
|
453
|
+
const run = (quality, fps) => new Promise((resolve, reject) => {
|
|
454
|
+
const ff = (0, fluent_ffmpeg_1.default)(input).on('error', reject).on('end', () => resolve());
|
|
455
|
+
// Transparent pad for stickers looks better than white
|
|
456
|
+
const vf = isAnimated
|
|
457
|
+
? `scale=512:512:force_original_aspect_ratio=decrease,fps=${fps},pad=512:512:(ow-iw)/2:(oh-ih)/2:color=0x00000000,setsar=1,format=rgba`
|
|
458
|
+
: `scale=512:512:force_original_aspect_ratio=decrease,pad=512:512:(ow-iw)/2:(oh-ih)/2:color=0x00000000,setsar=1,format=rgba`;
|
|
459
|
+
const opts = [
|
|
460
|
+
'-vcodec',
|
|
461
|
+
'libwebp',
|
|
462
|
+
'-vf',
|
|
463
|
+
vf,
|
|
464
|
+
'-lossless',
|
|
465
|
+
isAnimated ? '0' : '1',
|
|
466
|
+
'-compression_level',
|
|
467
|
+
'6',
|
|
468
|
+
'-q:v',
|
|
469
|
+
String(Math.max(1, Math.min(100, quality))),
|
|
470
|
+
'-loop',
|
|
471
|
+
'0',
|
|
472
|
+
'-preset',
|
|
473
|
+
'default',
|
|
474
|
+
'-an',
|
|
475
|
+
'-vsync',
|
|
476
|
+
'0',
|
|
477
|
+
];
|
|
478
|
+
if (isAnimated) {
|
|
479
|
+
opts.push('-t', String(this.options.maxDuration || 6));
|
|
480
|
+
}
|
|
481
|
+
ff.addOutputOptions(opts).toFormat('webp').save(output);
|
|
482
|
+
});
|
|
483
|
+
let quality = this.options.quality ?? 75;
|
|
484
|
+
let fps = this.options.fps ?? 15;
|
|
485
|
+
await run(quality, fps);
|
|
486
|
+
// WhatsApp animated stickers should stay under ~1MB
|
|
487
|
+
if (isAnimated && node_fs_1.default.existsSync(output)) {
|
|
488
|
+
let attempts = 0;
|
|
489
|
+
while (node_fs_1.default.statSync(output).size > 1000000 && attempts < 4) {
|
|
490
|
+
quality = Math.max(20, quality - 15);
|
|
491
|
+
fps = Math.max(8, fps - 2);
|
|
492
|
+
await run(quality, fps);
|
|
493
|
+
attempts++;
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
if (!node_fs_1.default.existsSync(output) || node_fs_1.default.statSync(output).size < 20) {
|
|
497
|
+
throw new Error('FFmpeg failed to produce a valid WebP sticker.');
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
async applyJimpEdits(input, output, options) {
|
|
501
|
+
const image = await jimp_1.default.read(input);
|
|
502
|
+
if (options.greyscale)
|
|
503
|
+
image.greyscale();
|
|
504
|
+
if (options.invert)
|
|
505
|
+
image.invert();
|
|
506
|
+
if (options.sepia)
|
|
507
|
+
image.sepia();
|
|
508
|
+
if (options.blur)
|
|
509
|
+
image.blur(options.blur);
|
|
510
|
+
if (typeof options.brightness === 'number')
|
|
511
|
+
image.brightness(options.brightness);
|
|
512
|
+
if (typeof options.contrast === 'number')
|
|
513
|
+
image.contrast(options.contrast);
|
|
514
|
+
if (options.circle)
|
|
515
|
+
image.circle();
|
|
516
|
+
if (options.resize)
|
|
517
|
+
image.resize(options.resize.width, options.resize.height);
|
|
518
|
+
if (options.text?.content) {
|
|
519
|
+
const fontPath = options.text.color === 'BLACK' ? jimp_1.default.FONT_SANS_32_BLACK : jimp_1.default.FONT_SANS_32_WHITE;
|
|
520
|
+
const font = await jimp_1.default.loadFont(fontPath);
|
|
521
|
+
const printOptions = {
|
|
522
|
+
text: options.text.content,
|
|
523
|
+
alignmentX: options.text.alignmentX || jimp_1.default.HORIZONTAL_ALIGN_CENTER,
|
|
524
|
+
alignmentY: options.text.alignmentY || jimp_1.default.VERTICAL_ALIGN_BOTTOM,
|
|
525
|
+
};
|
|
526
|
+
if (options.text.stroke) {
|
|
527
|
+
const strokeFont = await jimp_1.default.loadFont(options.text.color === 'BLACK' ? jimp_1.default.FONT_SANS_32_WHITE : jimp_1.default.FONT_SANS_32_BLACK);
|
|
528
|
+
for (let x = -2; x <= 2; x++) {
|
|
529
|
+
for (let y = -2; y <= 2; y++) {
|
|
530
|
+
if (x !== 0 || y !== 0) {
|
|
531
|
+
image.print(strokeFont, x, y, printOptions, image.bitmap.width, image.bitmap.height);
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
image.print(font, 0, 0, printOptions, image.bitmap.width, image.bitmap.height);
|
|
537
|
+
}
|
|
538
|
+
await image.writeAsync(output);
|
|
539
|
+
}
|
|
540
|
+
getMediaInfo(file) {
|
|
541
|
+
return new Promise((resolve) => {
|
|
542
|
+
const args = [
|
|
543
|
+
'-v',
|
|
544
|
+
'error',
|
|
545
|
+
'-select_streams',
|
|
546
|
+
'v:0',
|
|
547
|
+
'-show_entries',
|
|
548
|
+
'stream=width,height,duration',
|
|
549
|
+
'-of',
|
|
550
|
+
'csv=p=0:s=x',
|
|
551
|
+
file,
|
|
552
|
+
];
|
|
553
|
+
(0, node_child_process_1.execFile)('ffprobe', args, { timeout: 20000 }, (err, stdout) => {
|
|
554
|
+
if (err)
|
|
555
|
+
return resolve({ width: 0, height: 0, duration: 0 });
|
|
556
|
+
const parts = String(stdout).trim().split('x');
|
|
557
|
+
resolve({
|
|
558
|
+
width: parseInt(parts[0], 10) || 0,
|
|
559
|
+
height: parseInt(parts[1], 10) || 0,
|
|
560
|
+
duration: parseFloat(parts[2]) || 0,
|
|
561
|
+
});
|
|
562
|
+
});
|
|
563
|
+
});
|
|
564
|
+
}
|
|
565
|
+
// ── Extras ───────────────────────────────────────────────────────────────
|
|
566
|
+
static fileToBase64(filePath) {
|
|
567
|
+
return node_fs_1.default.readFileSync(filePath).toString('base64');
|
|
568
|
+
}
|
|
569
|
+
/** 96×96 tray icon WebP for sticker packs. */
|
|
570
|
+
async createTrayIcon(input) {
|
|
571
|
+
const ts = Date.now();
|
|
572
|
+
const pngPath = node_path_1.default.join(this.tempDir, `tray_${ts}.png`);
|
|
573
|
+
const webpPath = node_path_1.default.join(this.tempDir, `tray_${ts}.webp`);
|
|
574
|
+
let buffer;
|
|
575
|
+
if (Buffer.isBuffer(input))
|
|
576
|
+
buffer = input;
|
|
577
|
+
else if (typeof input === 'string' && isHttp(input))
|
|
578
|
+
buffer = await getBuffer(input);
|
|
579
|
+
else if (typeof input === 'string' && node_fs_1.default.existsSync(input))
|
|
580
|
+
buffer = node_fs_1.default.readFileSync(input);
|
|
581
|
+
else
|
|
582
|
+
throw new Error('Invalid tray icon input.');
|
|
583
|
+
const image = await jimp_1.default.read(buffer);
|
|
584
|
+
await image.cover(96, 96).writeAsync(pngPath);
|
|
585
|
+
await new Promise((resolve, reject) => {
|
|
586
|
+
(0, fluent_ffmpeg_1.default)(pngPath)
|
|
587
|
+
.on('error', reject)
|
|
588
|
+
.on('end', () => resolve())
|
|
589
|
+
.addOutputOptions(['-vcodec', 'libwebp', '-lossless', '1', '-q:v', '80'])
|
|
590
|
+
.toFormat('webp')
|
|
591
|
+
.save(webpPath);
|
|
592
|
+
});
|
|
593
|
+
this.track(pngPath);
|
|
594
|
+
this.track(webpPath);
|
|
595
|
+
return webpPath;
|
|
596
|
+
}
|
|
597
|
+
/** Text-only sticker (transparent 512×512). */
|
|
598
|
+
async createTextSticker(text, options = {}) {
|
|
599
|
+
const ts = Date.now();
|
|
600
|
+
const pngPath = node_path_1.default.join(this.tempDir, `text_${ts}.png`);
|
|
601
|
+
const image = new jimp_1.default(512, 512, options.background ?? 0x00000000);
|
|
602
|
+
const fontPath = options.color === 'BLACK' ? jimp_1.default.FONT_SANS_64_BLACK : jimp_1.default.FONT_SANS_64_WHITE;
|
|
603
|
+
const font = await jimp_1.default.loadFont(fontPath);
|
|
604
|
+
image.print(font, 0, 0, {
|
|
605
|
+
text,
|
|
606
|
+
alignmentX: jimp_1.default.HORIZONTAL_ALIGN_CENTER,
|
|
607
|
+
alignmentY: jimp_1.default.VERTICAL_ALIGN_MIDDLE,
|
|
608
|
+
}, 512, 512);
|
|
609
|
+
await image.writeAsync(pngPath);
|
|
610
|
+
this.track(pngPath);
|
|
611
|
+
return this.build(pngPath);
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
exports.StickEngine = StickEngine;
|
|
615
|
+
exports.default = StickEngine;
|
|
616
|
+
//# sourceMappingURL=StickEngine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StickEngine.js","sourceRoot":"","sources":["../../src/StickEngine.ts"],"names":[],"mappings":"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"}
|
|
Binary file
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = exports.getBuffer = exports.StickEngine = void 0;
|
|
4
|
+
var StickEngine_js_1 = require("./StickEngine.js");
|
|
5
|
+
Object.defineProperty(exports, "StickEngine", { enumerable: true, get: function () { return StickEngine_js_1.StickEngine; } });
|
|
6
|
+
Object.defineProperty(exports, "getBuffer", { enumerable: true, get: function () { return StickEngine_js_1.getBuffer; } });
|
|
7
|
+
var StickEngine_js_2 = require("./StickEngine.js");
|
|
8
|
+
Object.defineProperty(exports, "default", { enumerable: true, get: function () { return StickEngine_js_2.StickEngine; } });
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,mDAS0B;AARxB,6GAAA,WAAW,OAAA;AACX,2GAAA,SAAS,OAAA;AASX,mDAA0D;AAAjD,yGAAA,WAAW,OAAW"}
|