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