Browse Source

Move extra data in header

pull/46/head
coomdev 2 years ago
parent
commit
74d4d2f3a1
  1. 2
      main.meta.js
  2. 587
      main.user.js
  3. 22
      src/pngv3.ts

2
main.meta.js

@ -1,7 +1,7 @@
// ==UserScript==
// @name PNGExtraEmbed
// @namespace https://coom.tech/
// @version 0.123
// @version 0.124
// @description uhh
// @author You
// @match https://boards.4channel.org/*

587
main.user.js

File diff suppressed because it is too large

22
src/pngv3.ts

@ -1,4 +1,3 @@
import { buf } from "crc-32";
import { Buffer } from "buffer";
import type { ImageProcessor } from "./main";
import { PNGDecoder, PNGEncoder } from "./png";
@ -18,11 +17,9 @@ const BufferReadStream = (b: Buffer) => {
};
const extract = async (png: Buffer) => {
let magic = false;
const reader = BufferReadStream(png).getReader();
const sneed = new PNGDecoder(reader);
try {
let lastIDAT: Buffer | null = null;
for await (const [name, chunk, crc, offset] of sneed.chunks()) {
let buff: Buffer;
switch (name) {
@ -30,27 +27,18 @@ const extract = async (png: Buffer) => {
case 'tEXt':
buff = chunk;
if (buff.slice(4, 4 + CUM3.length).equals(CUM3)) {
magic = true;
return await decodeCoom3Payload(buff.slice(4, 4 + CUM3.length));
}
break;
case 'IDAT':
if (magic) {
lastIDAT = chunk;
break;
}
// eslint-disable-next-line no-fallthrough
case 'IEND':
if (!magic)
return; // Didn't find tExt Chunk;
return;
// eslint-disable-next-line no-fallthrough
default:
break;
}
}
if (lastIDAT) {
const data = (lastIDAT as Buffer).slice(4);
return await decodeCoom3Payload(data);
}
} catch (e) {
console.error(e);
} finally {
@ -105,17 +93,17 @@ const inject = async (container: File, injs: File[]) => {
}));
let magic = false;
const injb = Buffer.from(links.join(' '));
for await (const [name, chunk, crc, offset] of decoder.chunks()) {
if (magic && name != "IDAT")
break;
if (!magic && name == "IDAT") {
await encoder.insertchunk(["tEXt", buildChunk("tEXt", CUM3), 0, 0]);
await encoder.insertchunk(["tEXt", buildChunk("tEXt", Buffer.concat([CUM3, injb])), 0, 0]);
magic = true;
}
await encoder.insertchunk([name, chunk, crc, offset]);
}
const injb = Buffer.from(links.join('\0'));
await encoder.insertchunk(["IDAT", buildChunk("IDAT", injb), 0, 0]);
await encoder.insertchunk(["IEND", buildChunk("IEND", Buffer.from([])), 0, 0]);
return extract();
};

Loading…
Cancel
Save