Browse Source

Move to violentmonkey

pull/4/head
coomdev 2 years ago
parent
commit
cdd5e3be75
  1. 1
      build.js
  2. 3
      main.d.ts
  3. 67
      main.user.js
  4. 86
      src/main.ts

1
build.js

@ -11,6 +11,7 @@ const extheader = `// ==UserScript==
// @match https://boards.4channel.org/g/thread/*
// @icon https://www.google.com/s2/favicons?domain=4channel.org
// @grant GM_xmlhttpRequest
// @require https://greasyfork.org/scripts/421384-gm-fetch/code/GM_fetch.js?version=898562
// @run-at document-start
// @connect 4chan.org
// @connect 4channel.org

3
main.d.ts

@ -0,0 +1,3 @@
/* eslint-disable */
declare const GM_fetch = fetch;

67
main.user.js

@ -1,13 +1,14 @@
// ==UserScript==
// @name PNGFileEmbed
// @namespace http://tampermonkey.net/
// @namespace https://tampermonkey.net/
// @version 0.1
// @description uhh
// @author You
// @match https://boards.4channel.org/g/thread/*
// @icon https://www.google.com/s2/favicons?domain=4channel.org
// @grant GM_xmlhttpRequest
// @run-at document-start
// @require https://greasyfork.org/scripts/421384-gm-fetch/code/GM_fetch.js?version=898562
// @run-at document-start
// @connect 4chan.org
// @connect 4channel.org
// @connect i.4cdn.org
@ -6986,74 +6987,18 @@
ptr += length + 4;
} while (!chunk.done);
} catch (e) {
console.error(e);
await reader.cancel();
reader.releaseLock();
}
};
var TMFetch = GM_xmlhttpRequest || GM.xmlHttpRequest;
var getUrl = (u) => {
let xml;
let pos = 0;
let total = 0;
return new ReadableStream({
cancel() {
xml?.abort();
},
start(cont) {
return new Promise((reso) => {
const size = cont.desiredSize > 2 ** 17 ? cont.desiredSize : 2 ** 17;
const range = !total ? `bytes=${pos}-${pos + size - 1}` : `bytes=${pos}-${total - 1}`;
console.log(range, cont.desiredSize);
xml = TMFetch({
url: u,
fetch: true,
method: "GET",
binary: true,
responseType: "arraybuffer",
headers: {
range
},
onload(res) {
let hr = res.responseHeaders.split("\n").map((e) => e.split(":"));
let r = hr.find((e) => e[0] == "content-range");
let er = hr.find((e) => e[0] == "content-length");
cont.enqueue(import_buffer.Buffer.from(res.response));
pos += +er[1];
if (r) {
let m = r[1].match(/bytes 0-\d+\/(\d+)/);
if (m)
total = +m[1];
}
if (pos >= total) {
cont.close();
reso();
return;
}
reso();
}
});
});
},
pull(cont) {
console.log("pulling");
return this.start(cont);
}
}, {
highWaterMark: 40,
size(c) {
return 1;
}
});
};
var processImage = async (src) => {
if (!src.match(/\.png$/))
return;
let resp = getUrl(src);
let reader = resp?.getReader();
let resp = await GM_fetch(src);
let reader = (await resp.blob()).stream();
if (!reader)
return;
return await extractTextData(reader);
return await extractTextData(new ReadableStreamDefaultReader(reader));
};
var processPost = async (post) => {
let thumb = post.querySelector(".fileThumb");

86
src/main.ts

@ -3,6 +3,7 @@
import { Buffer } from "buffer";
import { buf } from "crc-32";
import { fileTypeFromBuffer } from 'file-type';
import { Readable } from "stream";
const IDAT = Buffer.from("IDAT");
const IEND = Buffer.from("IEND");
@ -68,93 +69,30 @@ let extractTextData = async (reader: ReadableStreamDefaultReader<Uint8Array>) =>
ptr += length + 4; // skips over data section and crc
} while (!chunk!.done);
} catch (e) {
console.error(e);
//console.error(e);
await reader.cancel();
reader.releaseLock();
}
}
let TMFetch = GM_xmlhttpRequest || GM.xmlHttpRequest;
let getUrl = (u: string) => {
let xml: Tampermonkey.AbortHandle<void>;
let pos = 0;
let total = 0;
return new ReadableStream<Uint8Array>({
cancel() {
xml?.abort();
},
start(cont) {
/*
get a small 128k chunk first then get the rest if required
*/
return new Promise<void>(reso => {
const size = (cont.desiredSize! > 2 ** 17 ? cont.desiredSize! : 2 ** 17);
const range = !total ? `bytes=${pos}-${pos + size - 1}` : `bytes=${pos}-${total - 1}`;
console.log(range, cont.desiredSize);
xml = TMFetch({
url: u,
fetch: true,
method: "GET",
binary: true,
responseType: "arraybuffer",
headers: {
range
},
// a bit spagetthi
onload(res) {
let hr = res.responseHeaders.split('\n').map(e => e.split(':'));
let r = hr.find(e => e[0] == "content-range")!;
let er = hr.find(e => e[0] == "content-length")!;
cont.enqueue(Buffer.from(res.response))
pos += +er[1];
if (r) {
let m = r[1].match(/bytes 0-\d+\/(\d+)/)
if (m)
total = +m[1];
}
if (pos >= total) {
cont.close()
reso();
return;
}
reso();
}
});
})
},
pull(cont) {
console.log("pulling") // shouldn't ever happen
return this.start!(cont);
}
}, {
highWaterMark: 40,
size(c) {
return 1;
}
})
}
let processImage = async (src: string) => {
if (!src.match(/\.png$/))
return;
let resp = getUrl(src);
let reader = resp?.getReader();
let resp = await GM_fetch(src);
let reader = (await resp.blob()).stream();
if (!reader)
return;
return await extractTextData(reader);
return await extractTextData(new ReadableStreamDefaultReader(reader));
};
/* Used for debugging */
let processImage2 = async (src: string) => {
if (!src.match(/\.png$/))
return;
let resp = getUrl(src);
let reader = resp.getReader();
let resp = await GM_fetch(src);
let reader = resp.body!.getReader();
if (!reader)
return;
let data = Buffer.alloc(0);
let chunk;
@ -209,14 +147,14 @@ let processPost = async (post: HTMLDivElement) => {
let contract = () => {
cont.style.width = "auto";
cont.style.height = "auto";
cont.style.maxWidth = "125px";
cont.style.maxWidth = "125px";
cont.style.maxHeight = "125px";
}
let expand = () => {
cont.style.width = `${w}px`;
cont.style.height = `${h}px`;
cont.style.maxWidth = "unset";
cont.style.maxWidth = "unset";
cont.style.maxHeight = "unset";
}
@ -304,6 +242,8 @@ let buildInjection = async (container: File, inj: File) => {
const startup = async () => {
await Promise.all([...document.querySelectorAll('.postContainer')].map(e => processPost(e as any)));
//await Promise.all([...document.querySelectorAll('.postContainer')].filter(e => e.textContent?.includes("191 KB")).map(e => processPost(e as any)));
document.addEventListener('PostsInserted', <any>(async (e: CustomEvent<string>) => {
processPost(e.target as any);
}));

Loading…
Cancel
Save