Create ehentai_better_viewer.user.js
This commit is contained in:
98
ehentai_better_viewer.user.js
Normal file
98
ehentai_better_viewer.user.js
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
// ==UserScript==
|
||||||
|
// @name E-Hentai better viewer
|
||||||
|
// @namespace https://github.com/lifegpc/userscript
|
||||||
|
// @version 0.1
|
||||||
|
// @description Add a viewer to view original picture on website. Also support cache pictures to reduce Image Limit cost.
|
||||||
|
// @author lifegpc
|
||||||
|
// @match https://*.e-hentai.org/s/*/*
|
||||||
|
// @icon https://e-hentai.org/favicon.ico
|
||||||
|
// @grant GM_getResourceText
|
||||||
|
// @grant GM_addElement
|
||||||
|
// @grant GM_addStyle
|
||||||
|
// @grant GM_xmlhttpRequest
|
||||||
|
// @require https://github.com/lifegpc/viewerjs/raw/main/dist/viewer.min.js
|
||||||
|
// @resource viewercss https://github.com/lifegpc/viewerjs/raw/main/dist/viewer.min.css
|
||||||
|
// @run-at document-start
|
||||||
|
// @connect hath.network
|
||||||
|
// @connect e-hentai.org
|
||||||
|
// ==/UserScript==
|
||||||
|
GM_addStyle(GM_getResourceText("viewercss"));
|
||||||
|
GM_addElement('script', { textContent: GM_getResourceText('viewer') });
|
||||||
|
async function fetchData(url) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
GM_xmlhttpRequest({method: 'GET', url, cookie: document.cookie, responseType: 'blob', onabort: reject, onerror: reject, onload: /**@param {{responseHeaders: string}} res*/(res) => {
|
||||||
|
console.log(res);
|
||||||
|
let headers = new Headers();
|
||||||
|
res.responseHeaders.split("\r\n").forEach((v) => {
|
||||||
|
v = v.trim();
|
||||||
|
if (!v.length) return;
|
||||||
|
let s = v.split(":");
|
||||||
|
headers.append(s[0], s.slice(1).join(":"));
|
||||||
|
});
|
||||||
|
resolve(new Response(res.response, {status: res.status, statusText: res.statusText, headers}));
|
||||||
|
}})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
window.addEventListener("DOMContentLoaded", () => {
|
||||||
|
let img = document.getElementById("img");
|
||||||
|
let parent = img.parentElement;
|
||||||
|
parent.replaceWith(img);
|
||||||
|
let options = {
|
||||||
|
title: () => {
|
||||||
|
return document.getElementsByTagName("h1")[0].innerText
|
||||||
|
},
|
||||||
|
navbar: false
|
||||||
|
};
|
||||||
|
/**@type {HTMLAnchorElement}*/
|
||||||
|
let original = document.querySelector("#i7>a");
|
||||||
|
if (original != null) {
|
||||||
|
let ourl = original.href;
|
||||||
|
console.log(ourl);
|
||||||
|
let getData = async () => {
|
||||||
|
let url = new URL(ourl);
|
||||||
|
url.searchParams.delete("key");
|
||||||
|
let curl = url.toString();
|
||||||
|
let cache = await caches.open("original-image");
|
||||||
|
let res = await cache.match(curl);
|
||||||
|
if (res === undefined) {
|
||||||
|
res = await fetchData(ourl, {mode: "no-cors", redirect: "follow"});
|
||||||
|
console.log(res.status, res.statusText);
|
||||||
|
if (!res.ok) throw new TypeError("Bad response status");
|
||||||
|
await cache.put(curl, res);
|
||||||
|
console.log("Added to cache:", curl);
|
||||||
|
res = await cache.match(curl);
|
||||||
|
} else console.log("Cache hited:", curl);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
options.url = async () => {
|
||||||
|
let res = await getData();
|
||||||
|
return URL.createObjectURL(await res.blob());
|
||||||
|
}
|
||||||
|
original.href = 'javascript:void(0)';
|
||||||
|
let clickE = async () => {
|
||||||
|
let res = await getData();
|
||||||
|
original.href = URL.createObjectURL(await res.blob());
|
||||||
|
function get_download_name() {
|
||||||
|
if (res && res.headers.has("content-disposition")) {
|
||||||
|
let v = res.headers.get("content-disposition");
|
||||||
|
let s = v.split("filename=");
|
||||||
|
if (s.length > 1) return s[1].trim();
|
||||||
|
}
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
original.download = get_download_name();
|
||||||
|
original.removeEventListener("click", clickE);
|
||||||
|
original.click();
|
||||||
|
};
|
||||||
|
original.addEventListener('click', clickE);
|
||||||
|
}
|
||||||
|
console.log(options);
|
||||||
|
let viewer = new Viewer(img, options);
|
||||||
|
let click = async () => {
|
||||||
|
img.removeEventListener("click", click);
|
||||||
|
await viewer.init();
|
||||||
|
console.log("Inited complete");
|
||||||
|
await viewer.show();
|
||||||
|
};
|
||||||
|
img.addEventListener("click", click);
|
||||||
|
})
|
||||||
Reference in New Issue
Block a user