Files
discord-decomp/lib/uploader/webpConversion.tsx
T
2026-11-01 12:12:55 +02:00

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;
}