436 lines
15 KiB
TypeScript
436 lines
15 KiB
TypeScript
// Metro module 4770 (f4771).
|
|
import Logger from "../../modules/debug/Logger";
|
|
import { DiscordImageFactory } from "../../modules/media/web/utils/DiscordImageFactory";
|
|
import MurmurHashV3 from "../../_bundle/MurmurHashV3";
|
|
function $mk114622($env) {
|
|
return (a0) => {
|
|
$env[1].toBlob(a0, "image/webp", 1);
|
|
};
|
|
}
|
|
function $mk114623($env) {
|
|
return (c31360_0, c31360_1) => {
|
|
const r1 = $env;
|
|
r1[8].onload = () => c31360_0();
|
|
r1[8].onerror = () => c31360_1(new Error("failed to load image"));
|
|
r1[8].src = r1[9];
|
|
};
|
|
}
|
|
function $mk114625($env) {
|
|
return function performWebPConversion() {
|
|
return $env[9].apply(this, arguments);
|
|
};
|
|
}
|
|
let hashImageData, c2920_4, c2920_5;
|
|
let env2920 = {};
|
|
export async function _shouldConvertToWebP(c25294_0) {
|
|
let r79, r96, r97, r98, ALREADY_WEBP, ANIMATED_IMAGE, CONVERSION_FAILED, CORRUPTED_FILE, HAS_TRANSPARENCY, ICC_DETECTION_FAILED, ICC_NON_SRGB_PROFILE, PNG8_FORMAT, UNSUPPORTED_FORMAT;
|
|
let c25294_1, c25294_2, c25294_3;
|
|
let c25294_4 = 0;
|
|
const r21 = env2920;
|
|
L34: {
|
|
L32: {
|
|
L31: {
|
|
L30: {
|
|
L29: {
|
|
L28: {
|
|
try {
|
|
let env29438;
|
|
c25294_2 = r21;
|
|
const r48 = env29438 = {};
|
|
c25294_1 = r48;
|
|
env29438[0] = c25294_0;
|
|
env29438[1] = void 0;
|
|
env29438[2] = void 0;
|
|
if (c25294_0.type === "image/webp") {
|
|
c2920_4.verbose("[WebP] File already WebP format");
|
|
ALREADY_WEBP = c2920_5.ALREADY_WEBP;
|
|
break L34;
|
|
}
|
|
if (["image/png"].includes(c25294_0.type)) {
|
|
c25294_4 = 1;
|
|
if (typeof c25294_0.arrayBuffer === "function") {
|
|
r79 = await c25294_0.arrayBuffer();
|
|
r96 = "[webp] png uses actual transparency - skipping conversion";
|
|
r97 = "[webp] png is animated (apng) - skipping conversion";
|
|
r98 = "[webp] png is PNG8 format (indexed color) - skipping conversion";
|
|
} else {
|
|
r79 = await new Promise((c31358_0, c31358_1) => {
|
|
const fileReader = new FileReader();
|
|
let c31358_2 = fileReader;
|
|
fileReader.onload = () => c31358_0(c31358_2.result);
|
|
fileReader.onerror = () => c31358_1(new Error("Failed to read file as ArrayBuffer"));
|
|
fileReader.readAsArrayBuffer(env29438[0]);
|
|
});
|
|
r96 = "[webp] png uses actual transparency - skipping conversion";
|
|
r97 = "[webp] png is animated (apng) - skipping conversion";
|
|
r98 = "[webp] png is PNG8 format (indexed color) - skipping conversion";
|
|
}
|
|
env29438[1] = r79;
|
|
c25294_4 = 2;
|
|
const r113 = DiscordImageFactory.create(env29438[1]);
|
|
env29438[2] = r113;
|
|
if (r113 == null) {
|
|
throw new Error("DiscordImage.create returned null");
|
|
}
|
|
if (env29438[2].hasTransparency()) {
|
|
c2920_4.verbose(r96);
|
|
HAS_TRANSPARENCY = c2920_5.HAS_TRANSPARENCY;
|
|
c25294_4 = 0;
|
|
break L32;
|
|
}
|
|
if (env29438[2].isAnimated()) {
|
|
c2920_4.verbose(r97);
|
|
ANIMATED_IMAGE = c2920_5.ANIMATED_IMAGE;
|
|
c25294_4 = 0;
|
|
break L31;
|
|
}
|
|
if (env29438[2].isPng8()) {
|
|
c2920_4.verbose(r98);
|
|
PNG8_FORMAT = c2920_5.PNG8_FORMAT;
|
|
c25294_4 = 0;
|
|
break L30;
|
|
}
|
|
c25294_4 = 3;
|
|
if (await env29438[2].hasSrgbIccProfile()) {
|
|
c25294_4 = 0;
|
|
break L29;
|
|
}
|
|
ICC_NON_SRGB_PROFILE = c2920_5.ICC_NON_SRGB_PROFILE;
|
|
c25294_4 = 0;
|
|
break L28;
|
|
}
|
|
c2920_4.verbose(`[WebP] Unsupported format: ${c25294_0.type}`);
|
|
UNSUPPORTED_FORMAT = c2920_5.UNSUPPORTED_FORMAT;
|
|
} catch ($e) {
|
|
const r46 = $e;
|
|
let r8 = r46;
|
|
c25294_3 = r46;
|
|
let r47 = c25294_4;
|
|
if (r47 !== 0) {
|
|
while (true) {
|
|
if (r47 === 1) {
|
|
try {
|
|
const r251 = c25294_3;
|
|
c25294_4 = 0;
|
|
env29438[3] = r251;
|
|
c2920_4.warn("[WebP] Failed to read file data:", env29438[3]);
|
|
CONVERSION_FAILED = c2920_5.CONVERSION_FAILED;
|
|
} catch (r248) {
|
|
r8 = r248;
|
|
c25294_3 = r248;
|
|
r47 = c25294_4;
|
|
if (r47 === 0) {
|
|
break;
|
|
}
|
|
continue;
|
|
}
|
|
return CONVERSION_FAILED;
|
|
}
|
|
if (r47 === 2) {
|
|
try {
|
|
const r237 = c25294_3;
|
|
c25294_4 = 0;
|
|
env29438[4] = r237;
|
|
c2920_4.warn("[WebP] PNG analysis failed:", env29438[4]);
|
|
CORRUPTED_FILE = c2920_5.CORRUPTED_FILE;
|
|
} catch (r234) {
|
|
r8 = r234;
|
|
c25294_3 = r234;
|
|
r47 = c25294_4;
|
|
if (r47 === 0) {
|
|
break;
|
|
}
|
|
continue;
|
|
}
|
|
return CORRUPTED_FILE;
|
|
}
|
|
try {
|
|
const r223 = c25294_3;
|
|
c25294_4 = 0;
|
|
env29438[5] = r223;
|
|
c2920_4.warn("[WebP] ICC profile detection failed:", env29438[5]);
|
|
ICC_DETECTION_FAILED = c2920_5.ICC_DETECTION_FAILED;
|
|
} catch (r220) {
|
|
r8 = r220;
|
|
c25294_3 = r220;
|
|
r47 = c25294_4;
|
|
if (r47 === 0) {
|
|
break;
|
|
}
|
|
continue;
|
|
}
|
|
return ICC_DETECTION_FAILED;
|
|
}
|
|
}
|
|
throw r8;
|
|
}
|
|
return UNSUPPORTED_FORMAT;
|
|
}
|
|
return ICC_NON_SRGB_PROFILE;
|
|
}
|
|
return null;
|
|
}
|
|
return PNG8_FORMAT;
|
|
}
|
|
return ANIMATED_IMAGE;
|
|
}
|
|
return HAS_TRANSPARENCY;
|
|
}
|
|
return ALREADY_WEBP;
|
|
}
|
|
hashImageData = function hashImageData(a0) {
|
|
return MurmurHashV3(new Uint8Array(a0.data.buffer)).toString(16);
|
|
};
|
|
env2920[9] = function _performWebPConversion() {
|
|
const r8 = async (c25295_0) => {
|
|
let r397;
|
|
let c25295_1, c25295_2, c25295_3;
|
|
let c25295_4 = 0;
|
|
const r26 = env2920;
|
|
try {
|
|
let env29439;
|
|
c25295_2 = r26;
|
|
const r78 = env29439 = {};
|
|
c25295_1 = r78;
|
|
env29439[0] = c25295_0;
|
|
env29439[1] = void 0;
|
|
env29439[2] = void 0;
|
|
env29439[3] = void 0;
|
|
env29439[4] = void 0;
|
|
env29439[5] = void 0;
|
|
env29439[6] = void 0;
|
|
env29439[7] = void 0;
|
|
env29439[8] = void 0;
|
|
env29439[9] = void 0;
|
|
env29439[10] = void 0;
|
|
env29439[11] = void 0;
|
|
env29439[12] = void 0;
|
|
env29439[13] = void 0;
|
|
env29439[14] = void 0;
|
|
const element = document.createElement("canvas");
|
|
env29439[1] = element;
|
|
const context = element.getContext("2d");
|
|
env29439[2] = context;
|
|
if (context == null) {
|
|
throw new Error("could not get canvas context");
|
|
}
|
|
env29439[3] = new Image();
|
|
env29439[4] = URL.createObjectURL(c25295_0);
|
|
c25295_4 = 1;
|
|
await new Promise((c31359_0, c31359_1) => {
|
|
const r6 = env29439[3];
|
|
r6.onload = () => c31359_0();
|
|
r6.onerror = () => c31359_1(new Error("failed to load image"));
|
|
r6.src = env29439[4];
|
|
});
|
|
env29439[1].width = env29439[3].width;
|
|
env29439[1].height = env29439[3].height;
|
|
env29439[2].drawImage(env29439[3], 0, 0);
|
|
c25295_4 = 0;
|
|
URL.revokeObjectURL(env29439[4]);
|
|
env29439[5] = await new Promise($mk114622(c25295_1));
|
|
if (env29439[5] == null) {
|
|
throw new Error("failed to convert to webp");
|
|
}
|
|
env29439[6] = performance.now();
|
|
env29439[7] = await env29439[2].getImageData(0, 0, env29439[1].width, env29439[1].height);
|
|
env29439[2].clearRect(0, 0, env29439[1].width, env29439[1].height);
|
|
env29439[8] = new Image();
|
|
env29439[9] = URL.createObjectURL(env29439[5]);
|
|
const r263 = c25295_1;
|
|
c25295_4 = 2;
|
|
await new Promise($mk114623(r263));
|
|
env29439[2].drawImage(env29439[8], 0, 0);
|
|
c25295_4 = 0;
|
|
URL.revokeObjectURL(env29439[9]);
|
|
env29439[10] = await env29439[2].getImageData(0, 0, env29439[1].width, env29439[1].height);
|
|
env29439[11] = hashImageData(env29439[7]);
|
|
env29439[12] = hashImageData(env29439[10]);
|
|
env29439[13] = env29439[11] === env29439[12];
|
|
env29439[14] = performance.now() - env29439[6];
|
|
c2920_4.verbose(`[WebP] Pixel hash results: fileName=${env29439[0].name} fileLength={${env29439[0].size}} width=${env29439[8].width} height=${env29439[8].height} pixelHash=${env29439[11]} mezzanineFileLength={${env29439[5].size}} mezzaninePixelHash=${env29439[12]} match=${env29439[13]} elapsed_ms=${Math.round(env29439[14])}`);
|
|
r397 = env29439[13] ? {
|
|
success: true,
|
|
webpBlob: env29439[5],
|
|
pixelHashTimeMs: env29439[14]
|
|
} : {
|
|
success: false,
|
|
reason: c2920_5.PIXEL_HASH_MISMATCH,
|
|
pixelHashTimeMs: env29439[14]
|
|
};
|
|
} catch ($e) {
|
|
const r76 = $e;
|
|
let r7 = r76;
|
|
c25295_3 = r76;
|
|
let r77 = c25295_4;
|
|
if (r77 !== 0) {
|
|
while (true) {
|
|
if (r77 === 1) {
|
|
try {
|
|
const r418 = c25295_3;
|
|
c25295_4 = 0;
|
|
URL.revokeObjectURL(env29439[4]);
|
|
throw r418;
|
|
} catch (r416) {
|
|
r7 = r416;
|
|
c25295_3 = r416;
|
|
r77 = c25295_4;
|
|
if (r77 === 0) {
|
|
break;
|
|
}
|
|
}
|
|
} else {
|
|
try {
|
|
const r408 = c25295_3;
|
|
c25295_4 = 0;
|
|
URL.revokeObjectURL(env29439[9]);
|
|
throw r408;
|
|
} catch (r406) {
|
|
r7 = r406;
|
|
c25295_3 = r406;
|
|
r77 = c25295_4;
|
|
if (r77 === 0) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
throw r7;
|
|
}
|
|
return r397;
|
|
};
|
|
env2920[9] = r8;
|
|
return r8.apply(this, arguments);
|
|
};
|
|
c2920_4 = new Logger("WebP");
|
|
c2920_5 = {
|
|
ALREADY_WEBP: "already_webp",
|
|
UNSUPPORTED_FORMAT: "unsupported_format",
|
|
ANIMATED_IMAGE: "animated_image",
|
|
HAS_TRANSPARENCY: "has_transparency",
|
|
PNG8_FORMAT: "png8_format",
|
|
INSUFFICIENT_SAVINGS: "insufficient_savings",
|
|
CONVERSION_FAILED: "conversion_failed",
|
|
CORRUPTED_FILE: "corrupted_file",
|
|
PIXEL_HASH_MISMATCH: "pixel_hash_mismatch",
|
|
ICC_NON_SRGB_PROFILE: "icc_non_srgb_profile",
|
|
ICC_DETECTION_FAILED: "icc_detection_failed",
|
|
UNKNOWN_ERROR: "unknown_error"
|
|
};
|
|
export { c2920_5 as ConversionFailureReason };
|
|
export async function maybeConvertToWebP(c25296_0) {
|
|
let r110, r191, r229, r255;
|
|
let reason, c25296_2, c25296_3, c25296_4;
|
|
let c25296_5 = 0;
|
|
const r22 = env2920;
|
|
L27: {
|
|
L26: {
|
|
L23: {
|
|
try {
|
|
let env29440;
|
|
c25296_3 = r22;
|
|
const r30 = env29440 = {
|
|
$parent: r22
|
|
};
|
|
c25296_2 = r30;
|
|
env29440[0] = c25296_0;
|
|
env29440[1] = void 0;
|
|
env29440[2] = void 0;
|
|
env29440[4] = void 0;
|
|
env29440[5] = void 0;
|
|
env29440[6] = void 0;
|
|
env29440[7] = void 0;
|
|
env29440[8] = void 0;
|
|
env29440[3] = function createFailedResult(a0, sizeAfter = env29440[0].size) {
|
|
const originalFile = env29440[0];
|
|
return {
|
|
success: false,
|
|
originalFile,
|
|
sizeBefore: originalFile.size,
|
|
sizeAfter,
|
|
compressionRatio: originalFile.size > 0 ? sizeAfter / originalFile.size : 1,
|
|
reason: a0,
|
|
compressTimeMs: Math.round(performance.now() - env29440[2])
|
|
};
|
|
};
|
|
if (c25296_0 == null) {
|
|
throw new Error("file is null or undefined");
|
|
}
|
|
c2920_4.verbose(`[WebP] Starting conversion for: ${c25296_0.name}`);
|
|
env29440[2] = performance.now();
|
|
c25296_5 = 1;
|
|
env29440[4] = await _shouldConvertToWebP(c25296_0);
|
|
if (env29440[4] != null) {
|
|
c2920_4.verbose(`[WebP] Conversion rejected: ${env29440[4]}`);
|
|
r110 = (0, env29440[3])(env29440[4]);
|
|
c25296_5 = 0;
|
|
break L27;
|
|
}
|
|
const r113 = env29440[0];
|
|
env29440[5] = await $mk114625(env2920)(r113);
|
|
if (env29440[5].success && env29440[5].webpBlob != null) {
|
|
env29440[6] = env29440[5].webpBlob;
|
|
env29440[7] = env29440[0].size > 0 ? env29440[6].size / env29440[0].size : 1;
|
|
env29440[8] = 1 - env29440[7];
|
|
if (env29440[8] < 0) {
|
|
c2920_4.verbose(`[WebP] Insufficient savings: ${Math.round(100 * env29440[8])}% < 0% (${env29440[0].size} -> ${env29440[6].size} bytes)`);
|
|
r191 = (0, env29440[3])(c2920_5.INSUFFICIENT_SAVINGS, env29440[6].size);
|
|
} else {
|
|
env29440[1] = performance.now() - env29440[2];
|
|
c2920_4.verbose(`[WebP] Conversion successful: ${env29440[0].name} to WebP in ${Math.round(env29440[1])}ms`);
|
|
r191 = {
|
|
success: true,
|
|
originalFile: env29440[0],
|
|
convertedBlob: env29440[6],
|
|
sizeBefore: env29440[0].size,
|
|
sizeAfter: env29440[6].size,
|
|
compressionRatio: env29440[7],
|
|
hashTimeMs: env29440[5].pixelHashTimeMs,
|
|
compressTimeMs: Math.round(env29440[1])
|
|
};
|
|
}
|
|
c25296_5 = 0;
|
|
break L23;
|
|
}
|
|
const r151 = env29440[3];
|
|
reason = env29440[5].reason;
|
|
if (reason == null) {
|
|
reason = c2920_5.UNKNOWN_ERROR;
|
|
}
|
|
r229 = r151(reason);
|
|
c25296_5 = 0;
|
|
break L26;
|
|
} catch ($e) {
|
|
const r51 = $e;
|
|
let r8 = r51;
|
|
c25296_4 = r51;
|
|
if (c25296_5 !== 0) {
|
|
while (true) {
|
|
try {
|
|
const r241 = c25296_4;
|
|
c25296_5 = 0;
|
|
env29440[9] = r241;
|
|
c2920_4.error(`[WebP] Conversion failed for ${env29440[0].name}:`, env29440[9]);
|
|
r255 = (0, env29440[3])(c2920_5.CONVERSION_FAILED);
|
|
} catch (r237) {
|
|
r8 = r237;
|
|
c25296_4 = r237;
|
|
if (c25296_5 === 0) {
|
|
break;
|
|
}
|
|
continue;
|
|
}
|
|
return r255;
|
|
}
|
|
}
|
|
throw r8;
|
|
}
|
|
}
|
|
return r191;
|
|
}
|
|
return r229;
|
|
}
|
|
return r110;
|
|
}
|