// ==UserScript==
// @name E-Hentai / nHentai highlight thumb when open Anthology gallery
// @name:zh-CN E-Hentai / nHentai highlight thumb when open Anthology gallery
// @name:zh-TW E-Hentai / nHentai highlight thumb when open Anthology gallery
// @name:ja E-Hentai / nHentai highlight thumb when open Anthology gallery
// @namespace E-Hentai_highlight_thumb_when_open_Anthology_gallery_from_tag_artist
// @supportURL https://github.com/zhuzemin
// @description highlight and navigate to artist work first thumb when open "Anthology gallery" from search page with tag "artist"
// @description:zh-CN highlight and navigate to artist work first thumb when open "Anthology gallery" from search page with tag "artist"
// @description:zh-TW highlight and navigate to artist work first thumb when open "Anthology gallery" from search page with tag "artist"
// @description:ja highlight and navigate to artist work first thumb when open "Anthology gallery" from search page with tag "artist"
// @include https://exhentai.org/g/*
// @include https://e-hentai.org/g/*
// @include https://nhentai.net/g/*
// @include https://en.nyahentai3.com/g/*
// @include https://zh.nyahentai.co/g/*
// @include https://ja.nyahentai.net/g/*
// @include https://zh.nyahentai.pro/g/*
// @include https://ja.nyahentai.org/g/*
// @include https://zh.nyahentai4.com/g/*
// @version 1.43
// @run-at document-start
// @author zhuzemin
// @license Mozilla Public License 2.0; http://www.mozilla.org/MPL/2.0/
// @license CC Attribution-ShareAlike 4.0 International; http://creativecommons.org/licenses/by-sa/4.0/
// @grant GM_xmlhttpRequest
// @grant GM_registerMenuCommand
// @grant GM_setValue
// @grant GM_getValue
// @connect-src e-hentai.org
// @connect-src exhentai.org
// @connect-src proud-surf-e590.zhuzemin.workers.dev
// ==/UserScript==
var config = {
'debug': false
}
var debug = config.debug ? console.log.bind(console) : function () {
};
//for avoid exhentai login require
var cloudFlareUrl = 'https://proud-surf-e590.zhuzemin.workers.dev/ajax/';
var searchStatus = 0;
class E_hentai {
constructor(keyword) {
this.method = 'GET';
this.url = "https://e-hentai.org/?f_search=" + keyword;
this.headers = {
'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey',
'Accept': 'application/atom+xml,application/xml,text/xml',
'Referer': window.location.href,
};
this.charset = 'text/plain;charset=utf8';
}
}
class Exhentai {
constructor(keyword) {
this.method = 'GET';
this.url = "https://exhentai.org/?f_search=" + keyword;
this.headers = {
'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey',
'Accept': 'application/atom+xml,application/xml,text/xml',
'Referer': window.location.href,
};
this.charset = 'text/plain;charset=utf8';
}
}
class CloudFlare {
constructor(keyword) {
this.method = 'GET';
this.url = "https://proud-surf-e590.zhuzemin.workers.dev/ajax/https://exhentai.org/?f_search=" + keyword;
this.headers = {
'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey',
'Accept': 'application/atom+xml,application/xml,text/xml',
'Referer': window.location.href,
};
this.charset = 'text/plain;charset=utf8';
}
}
class Gallery {
constructor(href) {
this.method = 'GET';
this.url = href;
this.headers = {
'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey',
'Accept': 'application/atom+xml,application/xml,text/xml',
'Referer': window.location.href,
};
this.charset = 'text/plain;charset=utf8';
}
}
var exhentai;
var e_hentai;
var GetArtistStartImg = function () {
debug("Start: GetArtistStartImg");
let object=null;
if (document.referrer.includes("/tag/artist:") || window.location.href.includes("#/tag/artist:") || document.referrer.includes("/artist/")) {
var taglist;
var links;
if (document.referrer.includes("/artist/")) {
taglist = document.querySelector('#tags');
links = taglist.querySelectorAll("a.tag");
}
else {
taglist = document.querySelector('#taglist');
links = taglist.querySelectorAll("a");
}
for (var link of links) {
var tag = link.innerText;
if (tag.includes('anthology')) {
debug(tag);
/*var title=document.querySelector("#gn").textContent;
debug("Title: "+title);
if(title.toLowerCase().includes("anthology")||(title.toLowerCase().match(/^comic/)!=null)){*/
var artist;
if (document.referrer.includes("/artist/")) {
artist = document.referrer.match(/\/artist\/([\d\w\-]*)/)[1].replace("-", " ");
}
else {
try {
artist = document.referrer.match(/\/tag\/artist:([\d\w\+]*)/)[1].replace("+", " ");
} catch (e) {
artist = window.location.href.match(/\/tag\/artist:([\d\w\+]*)/)[1].replace("+", " ");
}
}
debug("Artist: " + artist);
var divs = document.querySelectorAll("div.c1");
for (var div of divs) {
var comment = div.querySelector("div.c6");
debug(comment);
if (comment.innerHTML.toLowerCase().includes(artist)) {
/*var links=comment.querySelectorAll("a");
debug(links);
for(var a of links){
var textContent=a.textContent.toLowerCase();
if(textContent.includes(artist)){
var array=textContent.match(/(\d{1,4})/);
debug(array);
if(array!=null){
var ArtistStartImg=parseInt(array[1]);
debug("ArtistStartImg: "+ArtistStartImg);
var object={
"ArtistStartImg":ArtistStartImg,
"artist":artist
}
return object;
}
}
}*/
let ArtistStartImg=null;
if (comment.innerHTML.toLowerCase().includes('https://')){
let names=comment.innerText.split("…");
let count=0;
for(let name of names){
if(name.match(/\w+/)!=null){
debug('name: '+name);
if(name.toLowerCase().includes(artist)){
debug('count: '+count);
break;
}
count++;
}
}
let urls=comment.querySelectorAll('a');
let artistUrl=urls[count];
debug('artistUrl: '+artistUrl);
ArtistStartImg = artistUrl.href.match(/\d*-(\d{1,4})/)[1];
}
else{
var lines = comment.innerText.split("\n");
debug(lines);
for (var line of lines) {
var line = line.toLowerCase();
if (line.includes(artist)) {
var array = line.match(/(\d{1,4})/);
debug(array);
if (array != null) {
ArtistStartImg = parseInt(array[1]);
}
}
}
}
debug("ArtistStartImg: " + ArtistStartImg);
object = {
"ArtistStartImg": ArtistStartImg,
"artist": artist
}
break;
}
}
break;
}
else if (link == links[links.length - 1]) {
debug("End: GetArtistStartImg");
break;
}
}
}
return object;
}
GetCurrentPageTotalImg = function () {
debug("Start: GetCurrentPageTotalImg");
var divs;
if (document.referrer.includes("/artist/")) {
divs = document.querySelectorAll("div.thumb-container");
}
else {
divs = document.querySelectorAll("div.gdtl");
}
debug(divs);
if (divs != null) {
var CurrentPageTotalImg = divs.length;
debug("CurrentPageTotalImg: " + CurrentPageTotalImg);
var object = {
"CurrentPageTotalImg": CurrentPageTotalImg,
"divs": divs
}
return object;
}
debug("End: GetCurrentPageTotalImg");
return null;
}
CreateStyle = function () {
debug("Start: CreateStyle");
var style = document.createElement("style");
style.setAttribute("type", "text/css");
style.innerHTML = `
.glowbox {
background: #4c4c4c;
//width: 400px;
margin: 40px 0 0 40px;
padding: 10px;
-moz-box-shadow: 0 0 5px 5px #FFFF00;
-webkit-box-shadow: 0 0 5px 5px #FFFF00;
box-shadow: 0 0 5px 5px #FFFF00;
}
`;
debug("Processing: CreateStyle");
var head = document.querySelector("head");
head.insertBefore(style, null);
debug("End: CreateStyle");
}
init = function () {
debug("init");
//nhentai
if (!/(https:\/\/e(-|x)hentai\.org\/g\/[\d\w]*\/[\d\w]*\/)/.test(window.location.href)) {
debug("nhentai");
var info = document.querySelector('#info');
var title;
try {
title = info.querySelector("h2").innerText;
}
catch (e) {
title = info.querySelector("h1").innerText;
}
title = encodeURIComponent('"' + title.replace(' ', '+') + '"');
exhentai = new Exhentai(title);
e_hentai = new E_hentai(title);
cloudflare = new CloudFlare(title);
request(exhentai, SearchGallery);
}
var interval = setInterval(function () {
var cdiv = document.querySelector('#cdiv');
if (cdiv != null || searchStatus != 0) {
clearInterval(interval);
if (cdiv != null) {
var ObjectArtistStartImg = GetArtistStartImg();
var ArtistStartImg = ObjectArtistStartImg.ArtistStartImg;
if (ArtistStartImg != null) {
var ObjectCurrentPageTotalImg = GetCurrentPageTotalImg();
var CurrentPageTotalImg = ObjectCurrentPageTotalImg.CurrentPageTotalImg;
var ArtistStartImgInCurrentPage = ArtistStartImg % CurrentPageTotalImg;
if (ArtistStartImgInCurrentPage == 0) {
ArtistStartImgInCurrentPage = CurrentPageTotalImg - 1;
}
else {
ArtistStartImgInCurrentPage -= 1;
}
debug("ArtistStartImgInCurrentPage: " + ArtistStartImgInCurrentPage);
//e-hentai
if (!document.referrer.includes("/artist/")) {
if (window.location.href.includes("#/tag/artist:")) {
ArtistStartImg = ArtistStartImgInCurrentPage;
}
var CorrectPage;
if (ArtistStartImg == 0) {
CorrectPage = 0;
}
else {
CorrectPage = Math.ceil(ArtistStartImg / CurrentPageTotalImg) - 1;
}
debug("CorrectPage: " + CorrectPage);
if (CorrectPage != 0) {
window.location.href += "?p=" + CorrectPage + "#/tag/artist:" + ObjectArtistStartImg.artist;
}
}
CreateStyle();
var div = ObjectCurrentPageTotalImg.divs[ArtistStartImgInCurrentPage];
var img = div.querySelector("img");
img.className += " glowbox";
debug(div);
div.scrollIntoView();
}
}
}
}, 2000);
}
window.addEventListener('DOMContentLoaded', init);
function SearchGallery(responseDetails) {
var responseText = responseDetails.responseText;
if (responseText != null && responseText.length < 200 || !responseDetails.finalUrl.includes('.workers.dev')) {
request(cloudflare, SearchGallery);
return;
}
else if (responseText != null && responseText.length < 200 && responseDetails.finalUrl.includes('.workers.dev')) {
request(e_hentai, SearchGallery);
return;
}
var href = responseText.match(/(https:\/\/e(-|x)hentai\.org\/g\/[\d\w]*\/[\d\w]*\/)/)[1];
debug("href: " + href);
if (href != null) {
/*var dom = new DOMParser().parseFromString(responseText, "text/html");
var div = dom.getElementsByClassName('itg')[0];
var href = div.querySelector('a').href;*/
var url;
if (responseDetails.finalUrl.includes('.workers.dev')) {
url = cloudFlareUrl + href;
}
else {
url = href;
}
var gallery = new Gallery(url);
debug("SearchGallery");
request(gallery, GetComments);
}
else {
searchStatus = 2;
}
}
function GetComments(responseDetails) {
var responseText = responseDetails.responseText;
var dom = new DOMParser().parseFromString(responseText, "text/html");
var comments = dom.querySelector("#cdiv");
comments.style.color = "#34495e";
var content = document.querySelector("#content");
var related = content.querySelector("#related-container");
debug("GetComments");
content.insertBefore(comments, related);
var link = document.createElement("link");
link.innerHTML = `<link rel="stylesheet" type="text/css" href="https://e-hentai.org/z/0347/g.css">`;
var head = document.querySelector("head");
head.insertBefore(link, null);
searchStatus = 1;
}
function request(object, func) {
GM_xmlhttpRequest({
method: object.method,
url: object.url,
headers: object.headers,
overrideMimeType: object.charset,
timeout: 60000,
//synchronous: true
onload: function (responseDetails) {
debug(responseDetails);
//Dowork
func(responseDetails);
},
ontimeout: function (responseDetails) {
debug(responseDetails);
//Dowork
func(responseDetails);
},
ononerror: function (responseDetails) {
debug(responseDetails);
//Dowork
func(responseDetails);
}
});
}