From cdd5e3be75394c5bf011d34d5bd33406660e8fdf Mon Sep 17 00:00:00 2001 From: coomdev Date: Thu, 23 Dec 2021 02:19:08 +0100 Subject: [PATCH] Move to violentmonkey --- build.js | 1 + main.d.ts | 3 ++ main.user.js | 67 ++++------------------------------------ src/main.ts | 86 ++++++++-------------------------------------------- 4 files changed, 23 insertions(+), 134 deletions(-) create mode 100644 main.d.ts diff --git a/build.js b/build.js index beed1db..b6675f1 100644 --- a/build.js +++ b/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 diff --git a/main.d.ts b/main.d.ts new file mode 100644 index 0000000..55925b9 --- /dev/null +++ b/main.d.ts @@ -0,0 +1,3 @@ +/* eslint-disable */ + +declare const GM_fetch = fetch; \ No newline at end of file diff --git a/main.user.js b/main.user.js index aaebb1b..2a794c3 100644 --- a/main.user.js +++ b/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"); diff --git a/src/main.ts b/src/main.ts index 3633a8e..171e26f 100644 --- a/src/main.ts +++ b/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) => 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; - - let pos = 0; - let total = 0; - return new ReadableStream({ - cancel() { - xml?.abort(); - }, - - start(cont) { - /* - get a small 128k chunk first then get the rest if required - */ - 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 - }, - - // 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', (async (e: CustomEvent) => { processPost(e.target as any); }));