UNPKG

akiraa-scrape

Version:

Module & tools for bot whatsApp

181 lines (164 loc) 5.8 kB
const fs = require("fs"); const { tmpdir } = require("os"); const ff = require("fluent-ffmpeg"); const webp = require("node-webpmux"); const path = require("path"); const makeid = (length) => { let result = ""; let characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; let charactersLength = characters.length; for (let i = 0; i < length; i++) { result += characters.charAt(Math.floor(Math.random() * charactersLength)); } return result; }; async function imageToWebp(media) { const tmpFileOut = path.join(tmpdir(), `${makeid(10)}.webp`); const tmpFileIn = path.join(tmpdir(), `${makeid(10)}.jpg`); fs.writeFileSync(tmpFileIn, media); await new Promise((resolve, reject) => { ff(tmpFileIn) .on("error", reject) .on("end", () => resolve(true)) .addOutputOptions([ "-vcodec", "libwebp", "-vf", "scale='min(320,iw)':min'(320,ih)':force_original_aspect_ratio=decrease,fps=15, pad=320:320:-1:-1:color=white@0.0, split [a][b]; [a] palettegen=reserve_transparent=on:transparency_color=ffffff [p]; [b][p] paletteuse", ]) .toFormat("webp") .save(tmpFileOut); }); const buff = fs.readFileSync(tmpFileOut); fs.unlinkSync(tmpFileOut); fs.unlinkSync(tmpFileIn); return buff; } async function videoToWebp(media) { const tmpFileOut = path.join(tmpdir(), `${makeid(10)}.webp`); const tmpFileIn = path.join(tmpdir(), `${makeid(10)}.mp4`); fs.writeFileSync(tmpFileIn, media); await new Promise((resolve, reject) => { ff(tmpFileIn) .on("error", reject) .on("end", () => resolve(true)) .addOutputOptions([ "-vcodec", "libwebp", "-vf", "scale='min(320,iw)':min'(320,ih)':force_original_aspect_ratio=decrease,fps=15, pad=320:320:-1:-1:color=white@0.0, split [a][b]; [a] palettegen=reserve_transparent=on:transparency_color=ffffff [p]; [b][p] paletteuse", "-loop", "0", "-ss", "00:00:00", "-t", "00:00:05", "-preset", "default", "-an", "-vsync", "0", ]) .toFormat("webp") .save(tmpFileOut); }); const buff = fs.readFileSync(tmpFileOut); fs.unlinkSync(tmpFileOut); fs.unlinkSync(tmpFileIn); return buff; } async function writeExifImg(media, metadata) { let wMedia = await imageToWebp(media); const tmpFileIn = path.join(tmpdir(), `${makeid(10)}.webp`); const tmpFileOut = path.join(tmpdir(), `${makeid(10)}.webp`); fs.writeFileSync(tmpFileIn, wMedia); if (metadata.packname || metadata.author) { const img = new webp.Image(); const json = { "sticker-pack-id": `https://github.com/XinnChan`, "sticker-pack-name": metadata.packname, "sticker-pack-publisher": metadata.author, emojis: metadata.categories ? metadata.categories : [""], }; const exifAttr = Buffer.from([ 0x49, 0x49, 0x2a, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x41, 0x57, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, ]); const jsonBuff = Buffer.from(JSON.stringify(json), "utf-8"); const exif = Buffer.concat([exifAttr, jsonBuff]); exif.writeUIntLE(jsonBuff.length, 14, 4); await img.load(tmpFileIn); fs.unlinkSync(tmpFileIn); img.exif = exif; await img.save(tmpFileOut); return tmpFileOut; } } async function writeExifVid(media, metadata) { let wMedia = await videoToWebp(media); const tmpFileIn = path.join(tmpdir(), `${makeid(10)}.webp`); const tmpFileOut = path.join(tmpdir(), `${makeid(10)}.webp`); fs.writeFileSync(tmpFileIn, wMedia); if (metadata.packname || metadata.author) { const img = new webp.Image(); const json = { "sticker-pack-id": `https://github.com/XinnChan`, "sticker-pack-name": metadata.packname, "sticker-pack-publisher": metadata.author, emojis: metadata.categories ? metadata.categories : [""], }; const exifAttr = Buffer.from([ 0x49, 0x49, 0x2a, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x41, 0x57, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, ]); const jsonBuff = Buffer.from(JSON.stringify(json), "utf-8"); const exif = Buffer.concat([exifAttr, jsonBuff]); exif.writeUIntLE(jsonBuff.length, 14, 4); await img.load(tmpFileIn); fs.unlinkSync(tmpFileIn); img.exif = exif; await img.save(tmpFileOut); return tmpFileOut; } } async function writeExif(media, metadata) { let wMedia = /webp/.test(media.mimetype) ? media.data : /image/.test(media.mimetype) ? await imageToWebp(media.data) : /video/.test(media.mimetype) ? await videoToWebp(media.data) : ""; const tmpFileIn = path.join(tmpdir(), `${makeid(10)}.webp`); const tmpFileOut = path.join(tmpdir(), `${makeid(10)}.webp`); fs.writeFileSync(tmpFileIn, wMedia); if (metadata.packname || metadata.author) { const img = new webp.Image(); const json = { "sticker-pack-id": `https://github.com/XinnChan`, "sticker-pack-name": metadata.packname, "sticker-pack-publisher": metadata.author, emojis: metadata.categories ? metadata.categories : [""], }; const exifAttr = Buffer.from([ 0x49, 0x49, 0x2a, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x41, 0x57, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, ]); const jsonBuff = Buffer.from(JSON.stringify(json), "utf-8"); const exif = Buffer.concat([exifAttr, jsonBuff]); exif.writeUIntLE(jsonBuff.length, 14, 4); await img.load(tmpFileIn); fs.unlinkSync(tmpFileIn); img.exif = exif; await img.save(tmpFileOut); return tmpFileOut; } } module.exports = { imageToWebp, videoToWebp, writeExifImg, writeExifVid, writeExif, };