Browse Source

Fix GIFs

pull/46/head
coomdev 2 years ago
parent
commit
18aca99da5
  1. 2
      README.md
  2. 22
      chrome/dist/main.js
  3. 2
      chrome/manifest.json
  4. 22
      dist/main.js
  5. 22
      firefox/dist/main.js
  6. 2
      firefox/manifest.json
  7. 2
      firefox_update.json
  8. 2
      main.meta.js
  9. 24
      main.user.js
  10. BIN
      pngextraembedder-0.268.xpi
  11. 10
      src/gif.ts
  12. 2
      src/stores.ts

2
README.md

@ -25,7 +25,7 @@ Please report any issue you have with those (only for mainstream browsers)
Also, use this if you plan to use b4k's archive. Also, use this if you plan to use b4k's archive.
- [Install 4chanX (recommended)](https://www.4chan-x.net/builds/4chan-X.user.js) - [Install 4chanX (recommended)](https://www.4chan-x.net/builds/4chan-X.user.js)
- Install the correct WebExtension for your Browser ([Firefox](https://git.coom.tech/fuckjannies/lolipiss/raw/branch/%E4%B8%AD%E5%87%BA%E3%81%97/pngextraembedder-0.267.xpi) or [Chrome-based](https://chrome.google.com/webstore/detail/pngextraembedder/bfhpobiikighljcapcfmfganodihbicj)) - Install the correct WebExtension for your Browser ([Firefox](https://git.coom.tech/fuckjannies/lolipiss/raw/branch/%E4%B8%AD%E5%87%BA%E3%81%97/pngextraembedder-0.268.xpi) or [Chrome-based](https://chrome.google.com/webstore/detail/pngextraembedder/bfhpobiikighljcapcfmfganodihbicj))
For FF users, the extension is signed so you can just drag and drop it on your about:addons tab. For FF users, the extension is signed so you can just drag and drop it on your about:addons tab.

22
chrome/dist/main.js

@ -51,7 +51,7 @@
var define_BUILD_VERSION_default; var define_BUILD_VERSION_default;
var init_define_BUILD_VERSION = __esm({ var init_define_BUILD_VERSION = __esm({
"<define:BUILD_VERSION>"() { "<define:BUILD_VERSION>"() {
define_BUILD_VERSION_default = [0, 267]; define_BUILD_VERSION_default = [0, 268];
} }
}); });
@ -15455,7 +15455,7 @@
maxe: 5, maxe: 5,
conc: 8, conc: 8,
ho: false, ho: false,
blacklist: ["guro", "scat", "ryona", "gore"], blacklist: [],
rsources: [], rsources: [],
...localLoad("settingsv2", {}) ...localLoad("settingsv2", {})
}); });
@ -18344,17 +18344,17 @@
return [ret, () => b]; return [ret, () => b];
}; };
var inject_data = async (container, injb) => { var inject_data = async (container, injb) => {
let magic3 = false; let magic4 = false;
const [writestream, extract7] = BufferWriteStream2(); const [writestream, extract7] = BufferWriteStream2();
const encoder = new PNGEncoder(writestream); const encoder = new PNGEncoder(writestream);
const decoder = new PNGDecoder(container.stream().getReader()); const decoder = new PNGDecoder(container.stream().getReader());
for await (const [name, chunk, crc, offset] of decoder.chunks()) { for await (const [name, chunk, crc, offset] of decoder.chunks()) {
if (magic3 && name != "IDAT") if (magic4 && name != "IDAT")
break; break;
if (!magic3 && name == "IDAT") { if (!magic4 && name == "IDAT") {
const passed = import_buffer3.Buffer.from(injb); const passed = import_buffer3.Buffer.from(injb);
await encoder.insertchunk(["tEXt", async () => buildChunk("tEXt", import_buffer3.Buffer.concat([CUM7, passed])), () => Promise.resolve(0), 0]); await encoder.insertchunk(["tEXt", async () => buildChunk("tEXt", import_buffer3.Buffer.concat([CUM7, passed])), () => Promise.resolve(0), 0]);
magic3 = true; magic4 = true;
} }
await encoder.insertchunk([name, chunk, crc, offset]); await encoder.insertchunk([name, chunk, crc, offset]);
} }
@ -18561,6 +18561,7 @@
var netscape = import_buffer5.Buffer.from("!\xFF\vNETSCAPE2.0", "ascii"); var netscape = import_buffer5.Buffer.from("!\xFF\vNETSCAPE2.0", "ascii");
var magic = import_buffer5.Buffer.from("!\xFF\vDOOMTECH1.1", "ascii"); var magic = import_buffer5.Buffer.from("!\xFF\vDOOMTECH1.1", "ascii");
var magic2 = import_buffer5.Buffer.from("!\xFF\vVOOMTECH1.1", "ascii"); var magic2 = import_buffer5.Buffer.from("!\xFF\vVOOMTECH1.1", "ascii");
var magic3 = import_buffer5.Buffer.from("!\xFF\vANIMEXTS1.0", "ascii");
var read_section = (gif, pos) => { var read_section = (gif, pos) => {
const begin = pos; const begin = pos;
pos += 3 + gif[pos + 2]; pos += 3 + gif[pos + 2];
@ -18608,7 +18609,8 @@
} while (sec.appname == "DOOMTECH" && gif[end] == "!".charCodeAt(0)); } while (sec.appname == "DOOMTECH" && gif[end] == "!".charCodeAt(0));
return decodeCoom3Payload(ret); return decodeCoom3Payload(ret);
} }
if (sec.appname == "VOOMTECH") { const cond = () => sec.appname == "VOOMTECH" || sec.appname == "ANIMEXTS";
if (cond()) {
const ret = import_buffer5.Buffer.alloc(sec.data.readInt32LE(0)); const ret = import_buffer5.Buffer.alloc(sec.data.readInt32LE(0));
let ptr = 0; let ptr = 0;
do { do {
@ -18616,7 +18618,7 @@
sec.data.copy(ret, ptr); sec.data.copy(ret, ptr);
ptr += sec.data.byteLength; ptr += sec.data.byteLength;
end = sec.end; end = sec.end;
} while (sec.appname == "VOOMTECH" && gif[end] == "!".charCodeAt(0)); } while (cond() && gif[end] == "!".charCodeAt(0));
xor3(ret, password3); xor3(ret, password3);
return decodeCoom3Payload(ret); return decodeCoom3Payload(ret);
} }
@ -18626,7 +18628,7 @@
}; };
var extract3 = extractBuff; var extract3 = extractBuff;
var write_data = async (writer, inj) => { var write_data = async (writer, inj) => {
await writer.write(magic2); await writer.write(magic3);
const byte = import_buffer5.Buffer.from([0]); const byte = import_buffer5.Buffer.from([0]);
let size = inj.byteLength; let size = inj.byteLength;
let ws; let ws;
@ -18681,7 +18683,7 @@
end += 3 * (1 << (field & 7) + 1); end += 3 * (1 << (field & 7) + 1);
} }
while (end < gif.byteLength && gif.readUInt8(end) == "!".charCodeAt(0)) { while (end < gif.byteLength && gif.readUInt8(end) == "!".charCodeAt(0)) {
if ([magic, magic2].every((m) => m.compare(gif, end, end + m.byteLength) != 0)) { if ([magic, magic2, magic3].every((m) => m.compare(gif, end, end + m.byteLength) != 0)) {
end += 3 + gif.readUInt8(end + 2); end += 3 + gif.readUInt8(end + 2);
while (true) { while (true) {
const v = gif.readUInt8(end++); const v = gif.readUInt8(end++);

2
chrome/manifest.json

@ -2,7 +2,7 @@
"manifest_version": 3, "manifest_version": 3,
"name": "PngExtraEmbedder", "name": "PngExtraEmbedder",
"description": "Discover embedded files on 4chan and archives!", "description": "Discover embedded files on 4chan and archives!",
"version": "0.267", "version": "0.268",
"icons": { "icons": {
"64": "1449696017588.png" "64": "1449696017588.png"
}, },

22
dist/main.js

@ -51,7 +51,7 @@
var define_BUILD_VERSION_default; var define_BUILD_VERSION_default;
var init_define_BUILD_VERSION = __esm({ var init_define_BUILD_VERSION = __esm({
"<define:BUILD_VERSION>"() { "<define:BUILD_VERSION>"() {
define_BUILD_VERSION_default = [0, 267]; define_BUILD_VERSION_default = [0, 268];
} }
}); });
@ -15455,7 +15455,7 @@
maxe: 5, maxe: 5,
conc: 8, conc: 8,
ho: false, ho: false,
blacklist: ["guro", "scat", "ryona", "gore"], blacklist: [],
rsources: [], rsources: [],
...localLoad("settingsv2", {}) ...localLoad("settingsv2", {})
}); });
@ -18179,17 +18179,17 @@
return [ret, () => b]; return [ret, () => b];
}; };
var inject_data = async (container, injb) => { var inject_data = async (container, injb) => {
let magic3 = false; let magic4 = false;
const [writestream, extract7] = BufferWriteStream2(); const [writestream, extract7] = BufferWriteStream2();
const encoder = new PNGEncoder(writestream); const encoder = new PNGEncoder(writestream);
const decoder = new PNGDecoder(container.stream().getReader()); const decoder = new PNGDecoder(container.stream().getReader());
for await (const [name, chunk, crc, offset] of decoder.chunks()) { for await (const [name, chunk, crc, offset] of decoder.chunks()) {
if (magic3 && name != "IDAT") if (magic4 && name != "IDAT")
break; break;
if (!magic3 && name == "IDAT") { if (!magic4 && name == "IDAT") {
const passed = import_buffer3.Buffer.from(injb); const passed = import_buffer3.Buffer.from(injb);
await encoder.insertchunk(["tEXt", async () => buildChunk("tEXt", import_buffer3.Buffer.concat([CUM7, passed])), () => Promise.resolve(0), 0]); await encoder.insertchunk(["tEXt", async () => buildChunk("tEXt", import_buffer3.Buffer.concat([CUM7, passed])), () => Promise.resolve(0), 0]);
magic3 = true; magic4 = true;
} }
await encoder.insertchunk([name, chunk, crc, offset]); await encoder.insertchunk([name, chunk, crc, offset]);
} }
@ -18396,6 +18396,7 @@
var netscape = import_buffer5.Buffer.from("!\xFF\vNETSCAPE2.0", "ascii"); var netscape = import_buffer5.Buffer.from("!\xFF\vNETSCAPE2.0", "ascii");
var magic = import_buffer5.Buffer.from("!\xFF\vDOOMTECH1.1", "ascii"); var magic = import_buffer5.Buffer.from("!\xFF\vDOOMTECH1.1", "ascii");
var magic2 = import_buffer5.Buffer.from("!\xFF\vVOOMTECH1.1", "ascii"); var magic2 = import_buffer5.Buffer.from("!\xFF\vVOOMTECH1.1", "ascii");
var magic3 = import_buffer5.Buffer.from("!\xFF\vANIMEXTS1.0", "ascii");
var read_section = (gif, pos) => { var read_section = (gif, pos) => {
const begin = pos; const begin = pos;
pos += 3 + gif[pos + 2]; pos += 3 + gif[pos + 2];
@ -18443,7 +18444,8 @@
} while (sec.appname == "DOOMTECH" && gif[end] == "!".charCodeAt(0)); } while (sec.appname == "DOOMTECH" && gif[end] == "!".charCodeAt(0));
return decodeCoom3Payload(ret); return decodeCoom3Payload(ret);
} }
if (sec.appname == "VOOMTECH") { const cond = () => sec.appname == "VOOMTECH" || sec.appname == "ANIMEXTS";
if (cond()) {
const ret = import_buffer5.Buffer.alloc(sec.data.readInt32LE(0)); const ret = import_buffer5.Buffer.alloc(sec.data.readInt32LE(0));
let ptr = 0; let ptr = 0;
do { do {
@ -18451,7 +18453,7 @@
sec.data.copy(ret, ptr); sec.data.copy(ret, ptr);
ptr += sec.data.byteLength; ptr += sec.data.byteLength;
end = sec.end; end = sec.end;
} while (sec.appname == "VOOMTECH" && gif[end] == "!".charCodeAt(0)); } while (cond() && gif[end] == "!".charCodeAt(0));
xor3(ret, password3); xor3(ret, password3);
return decodeCoom3Payload(ret); return decodeCoom3Payload(ret);
} }
@ -18461,7 +18463,7 @@
}; };
var extract3 = extractBuff; var extract3 = extractBuff;
var write_data = async (writer, inj) => { var write_data = async (writer, inj) => {
await writer.write(magic2); await writer.write(magic3);
const byte = import_buffer5.Buffer.from([0]); const byte = import_buffer5.Buffer.from([0]);
let size = inj.byteLength; let size = inj.byteLength;
let ws; let ws;
@ -18516,7 +18518,7 @@
end += 3 * (1 << (field & 7) + 1); end += 3 * (1 << (field & 7) + 1);
} }
while (end < gif.byteLength && gif.readUInt8(end) == "!".charCodeAt(0)) { while (end < gif.byteLength && gif.readUInt8(end) == "!".charCodeAt(0)) {
if ([magic, magic2].every((m) => m.compare(gif, end, end + m.byteLength) != 0)) { if ([magic, magic2, magic3].every((m) => m.compare(gif, end, end + m.byteLength) != 0)) {
end += 3 + gif.readUInt8(end + 2); end += 3 + gif.readUInt8(end + 2);
while (true) { while (true) {
const v = gif.readUInt8(end++); const v = gif.readUInt8(end++);

22
firefox/dist/main.js

@ -51,7 +51,7 @@
var define_BUILD_VERSION_default; var define_BUILD_VERSION_default;
var init_define_BUILD_VERSION = __esm({ var init_define_BUILD_VERSION = __esm({
"<define:BUILD_VERSION>"() { "<define:BUILD_VERSION>"() {
define_BUILD_VERSION_default = [0, 267]; define_BUILD_VERSION_default = [0, 268];
} }
}); });
@ -15455,7 +15455,7 @@
maxe: 5, maxe: 5,
conc: 8, conc: 8,
ho: false, ho: false,
blacklist: ["guro", "scat", "ryona", "gore"], blacklist: [],
rsources: [], rsources: [],
...localLoad("settingsv2", {}) ...localLoad("settingsv2", {})
}); });
@ -18321,17 +18321,17 @@
return [ret, () => b]; return [ret, () => b];
}; };
var inject_data = async (container, injb) => { var inject_data = async (container, injb) => {
let magic3 = false; let magic4 = false;
const [writestream, extract7] = BufferWriteStream2(); const [writestream, extract7] = BufferWriteStream2();
const encoder = new PNGEncoder(writestream); const encoder = new PNGEncoder(writestream);
const decoder = new PNGDecoder(container.stream().getReader()); const decoder = new PNGDecoder(container.stream().getReader());
for await (const [name, chunk, crc, offset] of decoder.chunks()) { for await (const [name, chunk, crc, offset] of decoder.chunks()) {
if (magic3 && name != "IDAT") if (magic4 && name != "IDAT")
break; break;
if (!magic3 && name == "IDAT") { if (!magic4 && name == "IDAT") {
const passed = import_buffer3.Buffer.from(injb); const passed = import_buffer3.Buffer.from(injb);
await encoder.insertchunk(["tEXt", async () => buildChunk("tEXt", import_buffer3.Buffer.concat([CUM7, passed])), () => Promise.resolve(0), 0]); await encoder.insertchunk(["tEXt", async () => buildChunk("tEXt", import_buffer3.Buffer.concat([CUM7, passed])), () => Promise.resolve(0), 0]);
magic3 = true; magic4 = true;
} }
await encoder.insertchunk([name, chunk, crc, offset]); await encoder.insertchunk([name, chunk, crc, offset]);
} }
@ -18538,6 +18538,7 @@
var netscape = import_buffer5.Buffer.from("!\xFF\vNETSCAPE2.0", "ascii"); var netscape = import_buffer5.Buffer.from("!\xFF\vNETSCAPE2.0", "ascii");
var magic = import_buffer5.Buffer.from("!\xFF\vDOOMTECH1.1", "ascii"); var magic = import_buffer5.Buffer.from("!\xFF\vDOOMTECH1.1", "ascii");
var magic2 = import_buffer5.Buffer.from("!\xFF\vVOOMTECH1.1", "ascii"); var magic2 = import_buffer5.Buffer.from("!\xFF\vVOOMTECH1.1", "ascii");
var magic3 = import_buffer5.Buffer.from("!\xFF\vANIMEXTS1.0", "ascii");
var read_section = (gif, pos) => { var read_section = (gif, pos) => {
const begin = pos; const begin = pos;
pos += 3 + gif[pos + 2]; pos += 3 + gif[pos + 2];
@ -18585,7 +18586,8 @@
} while (sec.appname == "DOOMTECH" && gif[end] == "!".charCodeAt(0)); } while (sec.appname == "DOOMTECH" && gif[end] == "!".charCodeAt(0));
return decodeCoom3Payload(ret); return decodeCoom3Payload(ret);
} }
if (sec.appname == "VOOMTECH") { const cond = () => sec.appname == "VOOMTECH" || sec.appname == "ANIMEXTS";
if (cond()) {
const ret = import_buffer5.Buffer.alloc(sec.data.readInt32LE(0)); const ret = import_buffer5.Buffer.alloc(sec.data.readInt32LE(0));
let ptr = 0; let ptr = 0;
do { do {
@ -18593,7 +18595,7 @@
sec.data.copy(ret, ptr); sec.data.copy(ret, ptr);
ptr += sec.data.byteLength; ptr += sec.data.byteLength;
end = sec.end; end = sec.end;
} while (sec.appname == "VOOMTECH" && gif[end] == "!".charCodeAt(0)); } while (cond() && gif[end] == "!".charCodeAt(0));
xor3(ret, password3); xor3(ret, password3);
return decodeCoom3Payload(ret); return decodeCoom3Payload(ret);
} }
@ -18603,7 +18605,7 @@
}; };
var extract3 = extractBuff; var extract3 = extractBuff;
var write_data = async (writer, inj) => { var write_data = async (writer, inj) => {
await writer.write(magic2); await writer.write(magic3);
const byte = import_buffer5.Buffer.from([0]); const byte = import_buffer5.Buffer.from([0]);
let size = inj.byteLength; let size = inj.byteLength;
let ws; let ws;
@ -18658,7 +18660,7 @@
end += 3 * (1 << (field & 7) + 1); end += 3 * (1 << (field & 7) + 1);
} }
while (end < gif.byteLength && gif.readUInt8(end) == "!".charCodeAt(0)) { while (end < gif.byteLength && gif.readUInt8(end) == "!".charCodeAt(0)) {
if ([magic, magic2].every((m) => m.compare(gif, end, end + m.byteLength) != 0)) { if ([magic, magic2, magic3].every((m) => m.compare(gif, end, end + m.byteLength) != 0)) {
end += 3 + gif.readUInt8(end + 2); end += 3 + gif.readUInt8(end + 2);
while (true) { while (true) {
const v = gif.readUInt8(end++); const v = gif.readUInt8(end++);

2
firefox/manifest.json

@ -7,7 +7,7 @@
}, },
"name": "PngExtraEmbedder", "name": "PngExtraEmbedder",
"description": "Discover embedded files on 4chan and archives!", "description": "Discover embedded files on 4chan and archives!",
"version": "0.267", "version": "0.268",
"icons": { "icons": {
"64": "1449696017588.png" "64": "1449696017588.png"
}, },

2
firefox_update.json

@ -1 +1 @@
{"addons":{"{34ac4994-07f2-44d2-8599-682516a6c6a6}":{"updates":[{"version":"0.267","update_link":"https://git.coom.tech/fuckjannies/lolipiss/raw/branch/%E4%B8%AD%E5%87%BA%E3%81%97/pngextraembedder-0.267.xpi"}]}}} {"addons":{"{34ac4994-07f2-44d2-8599-682516a6c6a6}":{"updates":[{"version":"0.268","update_link":"https://git.coom.tech/fuckjannies/lolipiss/raw/branch/%E4%B8%AD%E5%87%BA%E3%81%97/pngextraembedder-0.268.xpi"}]}}}

2
main.meta.js

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

24
main.user.js

@ -1,7 +1,7 @@
// ==UserScript== // ==UserScript==
// @name PNGExtraEmbed // @name PNGExtraEmbed
// @namespace https://coom.tech/ // @namespace https://coom.tech/
// @version 0.267 // @version 0.268
// @description uhh // @description uhh
// @author You // @author You
// @match https://boards.4channel.org/* // @match https://boards.4channel.org/*
@ -87,7 +87,7 @@ const _DOMParser = DOMParser;
var define_BUILD_VERSION_default; var define_BUILD_VERSION_default;
var init_define_BUILD_VERSION = __esm({ var init_define_BUILD_VERSION = __esm({
"<define:BUILD_VERSION>"() { "<define:BUILD_VERSION>"() {
define_BUILD_VERSION_default = [0, 267]; define_BUILD_VERSION_default = [0, 268];
} }
}); });
@ -15491,7 +15491,7 @@ const _DOMParser = DOMParser;
maxe: 5, maxe: 5,
conc: 8, conc: 8,
ho: false, ho: false,
blacklist: ["guro", "scat", "ryona", "gore"], blacklist: [],
rsources: [], rsources: [],
...localLoad("settingsv2", {}) ...localLoad("settingsv2", {})
}); });
@ -18215,17 +18215,17 @@ const _DOMParser = DOMParser;
return [ret, () => b]; return [ret, () => b];
}; };
var inject_data = async (container, injb) => { var inject_data = async (container, injb) => {
let magic3 = false; let magic4 = false;
const [writestream, extract7] = BufferWriteStream2(); const [writestream, extract7] = BufferWriteStream2();
const encoder = new PNGEncoder(writestream); const encoder = new PNGEncoder(writestream);
const decoder = new PNGDecoder(container.stream().getReader()); const decoder = new PNGDecoder(container.stream().getReader());
for await (const [name, chunk, crc, offset] of decoder.chunks()) { for await (const [name, chunk, crc, offset] of decoder.chunks()) {
if (magic3 && name != "IDAT") if (magic4 && name != "IDAT")
break; break;
if (!magic3 && name == "IDAT") { if (!magic4 && name == "IDAT") {
const passed = import_buffer3.Buffer.from(injb); const passed = import_buffer3.Buffer.from(injb);
await encoder.insertchunk(["tEXt", async () => buildChunk("tEXt", import_buffer3.Buffer.concat([CUM7, passed])), () => Promise.resolve(0), 0]); await encoder.insertchunk(["tEXt", async () => buildChunk("tEXt", import_buffer3.Buffer.concat([CUM7, passed])), () => Promise.resolve(0), 0]);
magic3 = true; magic4 = true;
} }
await encoder.insertchunk([name, chunk, crc, offset]); await encoder.insertchunk([name, chunk, crc, offset]);
} }
@ -18432,6 +18432,7 @@ const _DOMParser = DOMParser;
var netscape = import_buffer5.Buffer.from("!\xFF\vNETSCAPE2.0", "ascii"); var netscape = import_buffer5.Buffer.from("!\xFF\vNETSCAPE2.0", "ascii");
var magic = import_buffer5.Buffer.from("!\xFF\vDOOMTECH1.1", "ascii"); var magic = import_buffer5.Buffer.from("!\xFF\vDOOMTECH1.1", "ascii");
var magic2 = import_buffer5.Buffer.from("!\xFF\vVOOMTECH1.1", "ascii"); var magic2 = import_buffer5.Buffer.from("!\xFF\vVOOMTECH1.1", "ascii");
var magic3 = import_buffer5.Buffer.from("!\xFF\vANIMEXTS1.0", "ascii");
var read_section = (gif, pos) => { var read_section = (gif, pos) => {
const begin = pos; const begin = pos;
pos += 3 + gif[pos + 2]; pos += 3 + gif[pos + 2];
@ -18479,7 +18480,8 @@ const _DOMParser = DOMParser;
} while (sec.appname == "DOOMTECH" && gif[end] == "!".charCodeAt(0)); } while (sec.appname == "DOOMTECH" && gif[end] == "!".charCodeAt(0));
return decodeCoom3Payload(ret); return decodeCoom3Payload(ret);
} }
if (sec.appname == "VOOMTECH") { const cond = () => sec.appname == "VOOMTECH" || sec.appname == "ANIMEXTS";
if (cond()) {
const ret = import_buffer5.Buffer.alloc(sec.data.readInt32LE(0)); const ret = import_buffer5.Buffer.alloc(sec.data.readInt32LE(0));
let ptr = 0; let ptr = 0;
do { do {
@ -18487,7 +18489,7 @@ const _DOMParser = DOMParser;
sec.data.copy(ret, ptr); sec.data.copy(ret, ptr);
ptr += sec.data.byteLength; ptr += sec.data.byteLength;
end = sec.end; end = sec.end;
} while (sec.appname == "VOOMTECH" && gif[end] == "!".charCodeAt(0)); } while (cond() && gif[end] == "!".charCodeAt(0));
xor3(ret, password3); xor3(ret, password3);
return decodeCoom3Payload(ret); return decodeCoom3Payload(ret);
} }
@ -18497,7 +18499,7 @@ const _DOMParser = DOMParser;
}; };
var extract3 = extractBuff; var extract3 = extractBuff;
var write_data = async (writer, inj) => { var write_data = async (writer, inj) => {
await writer.write(magic2); await writer.write(magic3);
const byte = import_buffer5.Buffer.from([0]); const byte = import_buffer5.Buffer.from([0]);
let size = inj.byteLength; let size = inj.byteLength;
let ws; let ws;
@ -18552,7 +18554,7 @@ const _DOMParser = DOMParser;
end += 3 * (1 << (field & 7) + 1); end += 3 * (1 << (field & 7) + 1);
} }
while (end < gif.byteLength && gif.readUInt8(end) == "!".charCodeAt(0)) { while (end < gif.byteLength && gif.readUInt8(end) == "!".charCodeAt(0)) {
if ([magic, magic2].every((m) => m.compare(gif, end, end + m.byteLength) != 0)) { if ([magic, magic2, magic3].every((m) => m.compare(gif, end, end + m.byteLength) != 0)) {
end += 3 + gif.readUInt8(end + 2); end += 3 + gif.readUInt8(end + 2);
while (true) { while (true) {
const v = gif.readUInt8(end++); const v = gif.readUInt8(end++);

BIN
pngextraembedder-0.268.xpi

Binary file not shown.

10
src/gif.ts

@ -6,6 +6,7 @@ import { decodeCoom3Payload, uploadFiles } from "./utils";
const netscape = Buffer.from("!\xFF\x0BNETSCAPE2.0", 'ascii'); const netscape = Buffer.from("!\xFF\x0BNETSCAPE2.0", 'ascii');
const magic = Buffer.from("!\xFF\x0B" + "DOOMTECH1.1", 'ascii'); const magic = Buffer.from("!\xFF\x0B" + "DOOMTECH1.1", 'ascii');
const magic2 = Buffer.from("!\xFF\x0B" + "VOOMTECH1.1", 'ascii'); const magic2 = Buffer.from("!\xFF\x0B" + "VOOMTECH1.1", 'ascii');
const magic3 = Buffer.from("!\xFF\x0B" + "ANIMEXTS1.0", 'ascii');
const read_section = (gif: Buffer, pos: number) => { const read_section = (gif: Buffer, pos: number) => {
const begin = pos; const begin = pos;
@ -59,7 +60,8 @@ const extractBuff = (gif: Buffer) => {
} while (sec.appname == "DOOMTECH" && gif[end] == '!'.charCodeAt(0)); } while (sec.appname == "DOOMTECH" && gif[end] == '!'.charCodeAt(0));
return decodeCoom3Payload(ret); return decodeCoom3Payload(ret);
} }
if (sec.appname == "VOOMTECH") { const cond = () => sec.appname == "VOOMTECH" || sec.appname == 'ANIMEXTS';
if (cond()) {
const ret = Buffer.alloc(sec.data.readInt32LE(0)); const ret = Buffer.alloc(sec.data.readInt32LE(0));
let ptr = 0; let ptr = 0;
do { do {
@ -67,7 +69,7 @@ const extractBuff = (gif: Buffer) => {
sec.data.copy(ret, ptr); sec.data.copy(ret, ptr);
ptr += sec.data.byteLength; ptr += sec.data.byteLength;
end = sec.end; end = sec.end;
} while (sec.appname == "VOOMTECH" && gif[end] == '!'.charCodeAt(0)); } while (cond() && gif[end] == '!'.charCodeAt(0));
xor(ret, password); xor(ret, password);
return decodeCoom3Payload(ret); return decodeCoom3Payload(ret);
} }
@ -80,7 +82,7 @@ const extractBuff = (gif: Buffer) => {
const extract = extractBuff; const extract = extractBuff;
const write_data = async (writer: WritableStreamDefaultWriter<Buffer>, inj: Buffer) => { const write_data = async (writer: WritableStreamDefaultWriter<Buffer>, inj: Buffer) => {
await writer.write(magic2); await writer.write(magic3);
const byte = Buffer.from([0]); const byte = Buffer.from([0]);
let size = inj.byteLength; let size = inj.byteLength;
let ws; let ws;
@ -142,7 +144,7 @@ const has_embed = (gif: Buffer) => {
} }
// skip beeg blocks // skip beeg blocks
while (end < gif.byteLength && gif.readUInt8(end) == '!'.charCodeAt(0)) { while (end < gif.byteLength && gif.readUInt8(end) == '!'.charCodeAt(0)) {
if ([magic, magic2].every(m => m.compare(gif, end, end + m.byteLength) != 0)) { if ([magic, magic2, magic3].every(m => m.compare(gif, end, end + m.byteLength) != 0)) {
end += 3 + gif.readUInt8(end + 2); end += 3 + gif.readUInt8(end + 2);
// eslint-disable-next-line no-constant-condition // eslint-disable-next-line no-constant-condition
while (true) { // skip sub blocks while (true) { // skip sub blocks

2
src/stores.ts

@ -40,7 +40,7 @@ export const initial_settings = localLoad('settingsv2', {
maxe: 5, maxe: 5,
conc: 8, conc: 8,
ho: false, ho: false,
blacklist: ['guro', 'scat', 'ryona', 'gore'], blacklist: [],
rsources: [] as (Omit<Booru, 'quirks'> & {view: string, disabled?: boolean})[], rsources: [] as (Omit<Booru, 'quirks'> & {view: string, disabled?: boolean})[],
...localLoad('settingsv2', {}), ...localLoad('settingsv2', {}),
}); });

Loading…
Cancel
Save