Created
February 8, 2019 17:13
-
-
Save mo-han/fc48bdfb87068a086526d6fa0efa14a7 to your computer and use it in GitHub Desktop.
E(X)Hentai Helper userscript ver 4.05 mod 1
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ==UserScript== | |
// @name E(X)Hentai Helper | |
// @description Links between E-Hentai and ExHentai page, and also links user to ExHentai automatically if gallery is "removed" and adds "view later" function | |
// @namespace https://greasyfork.org/en/scripts/24342-e-hentai-exhentai | |
// @version 4.05 | |
// @icon https://e-hentai.org/favicon.ico | |
// @resource exCSS http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css | |
// @resource jqueryui https://code.jquery.com/ui/1.12.0/jquery-ui.min.js | |
// @include https://upload.e-hentai.org/* | |
// @include http*://e-hentai.org/* | |
// @include http*://exhentai.org/* | |
// @exclude https://e-hentai.org/archive* | |
// @exclude https://e-hentai.org/gallery* | |
// @exclude https://exhentai.org/archive* | |
// @exclude https://exhentai.org/gallery* | |
// @require https://code.jquery.com/jquery-3.1.1.min.js | |
// @require https://code.jquery.com/ui/1.12.1/jquery-ui.min.js | |
// @require https://cdn.jsdelivr.net/npm/[email protected]/js/jquery.dataTables.js | |
// @require https://greasyfork.org/scripts/27104-filesaver/code/FileSaver.js?version=173518 | |
// @author Resuha | |
// @grant GM_addStyle | |
// @grant GM_getValue | |
// @grant GM_setValue | |
// @grant GM_getResourceText | |
// ==/UserScript== | |
//Credit to developer of https://github.com/js-cookie/js-cookie | |
//Ver 4.00 changed "view/read later" layout | |
//Ver 3.00 added "view/read later" functionality | |
//Ver 2.00 added redirector and cookie remover | |
//Customize Changelog: | |
//Mod 0: default to `showFixedDivContent()`, click to `hideFixedDivContent()`; | |
//Mod 1: remove "view later" list, only keep "E(-|x)hentai" link in `fixedDiv`; | |
var targetWebsite = ""; | |
var theme = ""; | |
var readLaterList = []; | |
var lastHovered; | |
var currentPageLink = window.location.href; | |
var dataTable; | |
var cssTxt = GM_getResourceText("exCSS"); | |
GM_addStyle(cssTxt); | |
var jqueryui = GM_getResourceText("jqueryui"); | |
GM_addStyle(jqueryui); | |
var extraCSS = document.createElement("style"); | |
extraCSS.textContent = ` | |
.link, .option { | |
cursor: pointer; | |
text-decoration: underline; | |
} | |
.option, #placeholderText{font-size: 100%} | |
.readLaterItem{font-size: 125%} | |
.readLaterItem > .option{font-size: 100%} | |
.divHeader{ | |
font-size: 100%; | |
font-weight: bold; | |
} | |
#fixedDiv.dark, #readLaterDiv.dark,#successDiv.dark,#previewDiv.dark,#addDiv.dark{ | |
background-color:rgba(64, 64, 0, 1); | |
border: 1px solid rgba(255, 255, 0, 1); | |
} | |
.link.dark{color:yellow} | |
.option.dark{color:plum} | |
#mpvAddon.dark{background-color:rgba(64, 64, 0, 0.4)} | |
#fixedDiv.light, #readLaterDiv.light,#successDiv.light,#previewDiv.light,#addDiv.light{ | |
background-color:rgba(255, 255, 0, 1); | |
border: 1px solid rgba(64, 64, 0, 1); | |
} | |
.link.light{color:blue} | |
.option.light{color:Red} | |
#mpvAddon.light{background-color:rgba(255, 255, 0, 0.4)} | |
#successDiv{ | |
font-size: 125%; | |
position: absolute; | |
transform: translate(-100%, -50%); | |
z-index:10; | |
padding: 8px 8px; | |
} | |
#linker{font-size: 100%} | |
#fixedDiv{ | |
text-align: left !important; | |
position: fixed; | |
top: 0px; | |
left: 0px; | |
align: left; | |
padding: 0px 0px; | |
z-index:10; | |
} | |
#fixedDivPeek{ | |
text-align: left !important; | |
position: fixed; | |
top: 0px; | |
right: 0px; | |
width: 10px; | |
height: 10px; | |
background-color:rgba(255, 255, 0, 1); | |
align: left; | |
padding: 8px 8px; | |
z-index:10; | |
} | |
#readLaterDiv{ | |
text-align: left !important; | |
position:fixed; | |
bottom: 4%;left: 2%; | |
align: left; | |
z-index:10; | |
padding: 8px 8px; | |
} | |
#i1 > #mpvAddon{ | |
float:right; | |
padding:0px 10px 10px 10px; | |
cursor: pointer; | |
} | |
#optionDivUL, #readLaterOptionDivUL{ | |
margin: 0; | |
padding: 0px 0px 0px 20px; | |
} | |
.topRightDivButton{ | |
float: left; | |
cursor: pointer; | |
padding: 0px 4px 0px 4px; | |
border: 1px solid; | |
font-size: 80%; | |
} | |
#previewDiv{ | |
position:fixed; | |
z-index:10; | |
padding:4px; | |
} | |
#previewDiv.showLeft{transform: translate(-110%, -105%)} | |
#previewDiv.showRight{transform: translate(10%, -105%)} | |
#addDiv{ | |
position:absolute; | |
z-index:10; | |
padding:4px; | |
font-size:125%; | |
cursor: pointer; | |
} | |
.readLaterItem.hoverPopup.odd.light{background:rgba(240, 240, 0, 1)} | |
.readLaterItem.hoverPopup.odd.dark{background:rgba(48, 48, 0, 1)} | |
#readLaterTable.light{border:2px rgba(64, 64, 0, 1) solid} | |
#readLaterTable.dark{border:2px rgba(255, 255, 0, 1) solid} | |
.highlighted{font-weight: bold !important;} | |
.highlighted.light{color: red} | |
.highlighted.dark{color: lightblue} | |
`; | |
document.head.appendChild(extraCSS); | |
//var fixedDiv = `' | |
//<div id="fixedDiv"> | |
// <div class="divHeader"><label id="scriptTitleHeader">E(X)Hentai Helper v`+ GM_info.script.version + `</label><label class="topRightDivButton" id="minmaxFixedDivButton">–</label></div><BR> | |
// <div id="linkerDiv"> | |
// <label class="divHeader">Linker:</label> | |
// </div> | |
// <div id="readLaterOptionDiv"> | |
// <label class="divHeader">Read Later:</label><BR><ul id="readLaterOptionDivUL"></ul> | |
// </div> | |
// <div id="optionDiv"> | |
// <label class="divHeader">Option:</label><BR><ul id="optionDivUL"></ul> | |
// </div> | |
//</div>'`; | |
var fixedDiv = `' | |
<div id="fixedDiv"> | |
<div class="divHeader"><label id="scriptTitleHeader">E(X)Hentai Helper v`+ GM_info.script.version + `</label><label class="topRightDivButton" id="minmaxFixedDivButton">–</label></div> | |
<div id="linkerDiv"> | |
<label class="divHeader"></label> | |
</div> | |
</div>'`; | |
$('body').append(fixedDiv); | |
fixedDiv = $('#fixedDiv'); | |
linkerDiv = $('#linkerDiv'); | |
optionDiv = $('#optionDiv'); | |
optionDiv.hide(); | |
document.getElementById('minmaxFixedDivButton').addEventListener("click", function () { | |
if ($('#scriptTitleHeader').is(":visible")) { | |
hideFixedDivContent(); | |
} else { | |
showFixedDivContent(); | |
} | |
}); | |
var readLaterDiv = `' | |
<div id="readLaterDiv" style="width:96%"> | |
<div class="divHeader"><label id="rlDivHeader">Read Later List:</label><label class="topRightDivButton" id="closeReadLaterButton">✖</label></div> | |
<div id="readLaterTableWrapper"></div> | |
</div>'`; | |
$('body').append(readLaterDiv); | |
document.getElementById('closeReadLaterButton').addEventListener("click", function () { | |
hide_rlList(); | |
}); | |
readLaterDiv = $('#readLaterDiv'); | |
readLaterDiv.hide(); | |
var previewDiv = `' | |
<div id="previewDiv"> | |
<img id="previewImg" src=""></img><label id="placeholderText"></label> | |
</div>'`; | |
$('body').append(previewDiv); | |
document.getElementById('closeReadLaterButton').addEventListener("click", function () { | |
hide_rlList(); | |
}); | |
previewDiv = $('#previewDiv'); | |
previewDiv.hide(); | |
var addDiv = '<div id="addDiv"><label id="addDivLabel">Add to "view later" list</label></div>'; | |
$('body').append(addDiv); | |
addDiv = $('#addDiv'); | |
addDiv.hide(); | |
$("#addDiv").click(function () { | |
var title = lastHovered.getElementsByClassName("id2")[0].childNodes[0].innerHTML; | |
var link = parse_gallery_identifier(lastHovered.getElementsByClassName("id2")[0].childNodes[0].href); | |
var thumbnailLink = lastHovered.getElementsByClassName("id3")[0].childNodes[0].childNodes[0].src.replace("exhentai.org", "ehgt.org"); | |
if (thumbnailLink.indexOf("blank.gif") > -1) { //if there is no thumbnail, do AJAX call | |
$(document).ajaxComplete(function (event, xhr, settings) { | |
var data = xhr.responseText; | |
var divStyle = $("#gd1", data).children('div').attr("style").split(" "); | |
if (divStyle[3].startsWith("url")) { | |
thumbnailLink = divStyle[3].substring(divStyle[3].indexOf("(") + 1, divStyle[3].indexOf(")")); | |
} else { | |
for (i = 0; i < stuff.length; i++) { | |
if (divStyle[i].startsWith("url")) { | |
thumbnailLink = divStyle[i].substring(divStyle[i].indexOf("(") + 1, divStyle[i].indexOf(")")); | |
break; | |
} | |
} | |
} | |
thumbnailLink = thumbnailLink.replace("exhentai.org", "ehgt.org"); | |
add_rlEntry(title, link, thumbnailLink); | |
populate_rlDiv(); | |
}); | |
$.ajax(link); | |
} else { | |
add_rlEntry(title, link, thumbnailLink); | |
populate_rlDiv(); | |
} | |
}); | |
if (document.location.href.indexOf('exhentai') !== - 1) { | |
link = 'https://e-hentai.org' + parse_gallery_identifier(); | |
targetWebsite = 'E-Hentai'; | |
theme = "dark"; | |
} else { | |
link = 'https://exhentai.org' + parse_gallery_identifier(); | |
targetWebsite = 'ExHentai'; | |
theme = "light"; | |
} // Determine if the current page is E-Hentai or ExHentai | |
readLaterDiv.resizable({ | |
handles: "n,e,ne", | |
stop: function (event, ui) { | |
$('th')[0].click(); | |
} | |
}); | |
fixedDiv.addClass("light"); | |
readLaterDiv.addClass("light"); | |
previewDiv.addClass("light"); | |
addDiv.addClass("light"); | |
$('#readLaterTable').addClass("light"); | |
redoTheme(); | |
window.addEventListener('focus', populate_rlDiv); | |
$(document).ready(function () { | |
populate_rlDiv(); | |
if (document.title == 'Gallery Not Available - E-Hentai Galleries') { // Gallery is expunged in e-hentai | |
document.location.href = 'https://exhentai.org' + parse_gallery_identifier(); | |
} else if (document.title == "exhentai.org (260×260)") { // Got sadpanda | |
var bYes = '<button id="yesButton" class="askButton">Yes'; | |
var bNo = '<button id="noButton" class="askButton">No'; | |
var askConfirm = '<div id="confirmDiv">Are you currently logged in at e-hentai.org forum?<label id="message"><br>' + bYes + bNo + '</div>'; | |
$('body').append(askConfirm); | |
askConfirm = $('#confirmDiv'); | |
askConfirm.css({ | |
'align': 'center', | |
'color': 'blue', | |
}); | |
$('#yesButton').click(function () { // Clear cookie and refresh | |
$('#confirmDiv').text("This page will refresh. If you still see this page after the refresh, it is possible that your account is not old enough for exhentai"); | |
setTimeout(function () { | |
// delete cookie | |
Cookies.remove('yay', { domain: '.exhentai.org' }); | |
location.reload(); | |
}, 1000); | |
}); | |
$('#noButton').click(function () { // Redirect to forum | |
$('#confirmDiv').text("Redirecting to E-Hentai login page"); | |
setTimeout(function () { | |
document.location.href = 'https://forums.e-hentai.org/index.php?act=Login&CODE=00'; | |
}, 1000); | |
}); | |
} else { | |
if (currentPageLink.indexOf("/mpv/") === -1) { | |
$(".id1").hover(function () { | |
lastHovered = this; | |
var location = getOffset(this.getElementsByClassName("id3")[0]); | |
addDiv.show(); | |
addDiv.css({ | |
"top": location.top + "px", | |
"left": location.left + "px", | |
}); | |
if (getIndex_rlList(parse_gallery_identifier(lastHovered.getElementsByClassName("id3")[0].childNodes[0].href)).exactMatch) { | |
$("#addDivLabel").text('Already added to list'); | |
} | |
}, function () { | |
addDiv.hide(); | |
$("#addDivLabel").text('Add to "view later" list'); | |
}); | |
addDiv.hover(function () { | |
addDiv.show(); | |
if (getIndex_rlList(parse_gallery_identifier(lastHovered.getElementsByClassName("id3")[0].childNodes[0].href)).exactMatch) { | |
$("#addDivLabel").text('Already added to list'); | |
} else { | |
$("#addDiv").css("color", "red"); | |
} | |
}, function () { | |
$("#addDiv").hide(); | |
$("#addDiv").css("color", ""); | |
}); | |
var link; | |
var linker; | |
if (targetWebsite == 'ExHentai') { | |
if (document.location.href == 'https://upload.e-hentai.org/manage.php') { | |
linker = "https://exhentai.org/upload/manage.php"; | |
} else { | |
linker = "https://exhentai.org" + parse_gallery_identifier(); | |
} | |
linkerDiv.append(createLink("linker", linker, "To ExHentai")); | |
} else { | |
if (document.location.href == 'https://exhentai.org/upload/manage.php') { | |
linker = "https://upload.e-hentai.org/manage.php"; | |
} else { | |
linker = "https://e-hentai.org" + parse_gallery_identifier(); | |
} | |
linkerDiv.append(createLink("linker", linker, "To E-Hentai")); | |
} // Add option to switch between E-Hentai and ExHentai in the top bar of the page | |
document.getElementById('linker').addEventListener("click", function () { | |
document.location.href = linker; | |
}); | |
// Setting page | |
if (currentPageLink.indexOf("uconfig") > -1) { | |
optionDiv.show(); | |
var optionArray = []; | |
optionArray.push(createOptionWithClass("loadSettingOption", "Load saved user setting", "setting")); | |
optionArray.push(createOptionWithClass("saveSettingOption", "Save current user setting", "setting")); | |
for (i = 0; i < optionArray.length; i++) { | |
$('#optionDivUL').append(optionArray[i]); | |
} | |
document.getElementById('loadSettingOption').addEventListener("click", function () { | |
var setting = GM_getValue("userSetting", ""); | |
if (setting !== "") { | |
if (document.location.href.indexOf('exhentai') !== - 1) { | |
Cookies.set("uconfig", setting, { domain: ".exhentai.org", expires: 365 }); | |
} else { | |
Cookies.set("uconfig", setting, { domain: ".e-hentai.org", expires: 365 }); | |
} | |
alert("User setting loaded"); | |
location.reload(); | |
} else { | |
alert("Nothing to load"); | |
} | |
}); | |
document.getElementById('saveSettingOption').addEventListener("click", function () { | |
GM_setValue("userSetting", Cookies.get("uconfig")); | |
// Maybe have an option to save it to file | |
alert("User setting saved"); | |
}); | |
} | |
// Gallery page | |
if (currentPageLink.indexOf("/g/") > -1 || currentPageLink.indexOf("/s/") > -1) { | |
var indexMatch = getIndex_rlList(parse_gallery_identifier()); | |
if (indexMatch.exactMatch === true && readLaterList[indexMatch.index].thumbnailLink !== "undefined") { | |
$('#readLaterOptionDivUL').append(createOption("addReadLaterOption", 'Already in "view later" list')); | |
$('#addReadLaterOption').css({ | |
'text-decoration': 'none', | |
'cursor': 'default', | |
}); | |
} else { | |
$('#readLaterOptionDivUL').append(createOption("addReadLaterOption", 'Add to "view later" list')); | |
document.getElementById('addReadLaterOption').addEventListener("click", add_rlEntryFunction); | |
} | |
if (indexMatch.index > -1) { | |
$('#readLaterOptionDivUL').append(createOption("removeReadLaterOption", 'Remove from "view later" list')); | |
document.getElementById('removeReadLaterOption').addEventListener("click", remove_rlEntryFunction); | |
} | |
if (currentPageLink.indexOf("/s/") > -1) { | |
var successDiv; | |
if (targetWebsite === "E-Hentai") { | |
$('#i1').prepend('<div id="mpvAddon" class="dark"></div>'); | |
$('#mpvAddon').append('<img id="mpvSave_rl" src="http://i.imgur.com/rdXO8o2.png" title="Save this page to view later list (E<->Ex extension)" style="margin-top:10px; opacity:0.8">'); | |
$('#mpvAddon').append('<img id="mpvView_rl" src="http://i.imgur.com/ywCl5NP.png" title="Open view later list (E<->Ex extension)" style="margin-top:5px; opacity:0.8">'); | |
successDiv = '<div id="successDiv" class="dark">Added/updated "view later" list</div>'; | |
} else { | |
$('#i1').prepend('<div id="mpvAddon" class="light"></div>'); | |
$('#mpvAddon').append('<img id="mpvSave_rl" src="http://i.imgur.com/tWBUjde.png" title="Save this page to view later list (E<->Ex extension)" style="margin-top:10px; opacity:0.8">'); | |
$('#mpvAddon').append('<img id="mpvView_rl" src="http://i.imgur.com/XH8qCCi.png" title="Open view later list (E<->Ex extension)" style="margin-top:5px; opacity:0.8">'); | |
successDiv = '<div id="successDiv" class="light">Added/updated "view later" list</div>'; | |
} | |
$('body').append(successDiv); | |
successDiv = $('#successDiv'); | |
successDiv.hide(); | |
document.getElementById('mpvSave_rl').addEventListener("click", add_rlEntryFunction); | |
document.getElementById('mpvView_rl').addEventListener("click", view_rlButtonClick); | |
hideFixedDivContent(); | |
var oldLocation = location.href; | |
setInterval(function () { | |
if (location.href !== oldLocation) { | |
oldLocation = location.href; | |
$('#addReadLaterOption').text('Add to "view later" list'); | |
document.getElementById('addReadLaterOption').addEventListener("click", add_rlEntryFunction); | |
$('#addReadLaterOption').css({ | |
'text-decoration': 'underline', | |
'cursor': 'pointer', | |
}); | |
} | |
}, 2000); // check 2 seconds | |
} | |
} | |
$('#readLaterOptionDivUL').append(createOption("seeReadLaterListOption", 'Show "view later" list')); | |
document.getElementById('seeReadLaterListOption').addEventListener("click", view_rlButtonClick); | |
// If there is no option available, hide the optionDiv completely | |
if ($('.setting').length === 0) { | |
optionDiv.hide(); | |
} | |
$('#readLaterOptionDivUL').append(createOption("export_rlListOption", 'Export list')); | |
document.getElementById('export_rlListOption').addEventListener("click", exportFunction); | |
$('#readLaterOptionDivUL').append(createOption("import_rlListOption", 'Import list')); | |
document.getElementById('import_rlListOption').addEventListener("click", importFunction); | |
$('#readLaterOptionDivUL').append(createOption("reset_rlListOption", 'Empty the list')); | |
document.getElementById('reset_rlListOption').addEventListener("click", resetList); | |
} else { | |
var successDiv; | |
if (targetWebsite === "E-Hentai") { | |
$('#bar3').append('<div id="mpvAddon" class="dark"></div>'); | |
$('#mpvAddon').append('<img id="mpvSave_rl" src="http://i.imgur.com/rdXO8o2.png" title="Save this page to view later list (E<->Ex extension)" style="margin-top:10px; opacity:0.8">'); | |
$('#mpvAddon').append('<img id="mpvView_rl" src="http://i.imgur.com/ywCl5NP.png" title="Open view later list (E<->Ex extension)" style="margin-top:5px; opacity:0.8">'); | |
successDiv = '<div id="successDiv" class="dark">Added/updated "view later" list</div>'; | |
} else { | |
$('#bar3').append('<div id="mpvAddon" class="light"></div>'); | |
$('#mpvAddon').append('<img id="mpvSave_rl" src="http://i.imgur.com/tWBUjde.png" title="Save this page to view later list (E<->Ex extension)" style="margin-top:10px; opacity:0.8">'); | |
$('#mpvAddon').append('<img id="mpvView_rl" src="http://i.imgur.com/XH8qCCi.png" title="Open view later list (E<->Ex extension)" style="margin-top:5px; opacity:0.8">'); | |
successDiv = '<div id="successDiv" class="light">Added/updated "view later" list</div>'; | |
} | |
$('body').append(successDiv); | |
successDiv = $('#successDiv'); | |
successDiv.hide(); | |
document.getElementById('mpvSave_rl').addEventListener("click", add_rlButtonClick); | |
document.getElementById('mpvView_rl').addEventListener("click", view_rlButtonClick); | |
$('#fixedDiv').hide(); | |
} | |
redoTheme(); | |
} | |
}); | |
function resetList() { | |
if (confirm("Are you sure you want to empty the list? You cannot undo this unless you export it first.")) { | |
GM_setValue("readLater", ""); | |
} | |
} | |
function add_rlButtonClick() { //for MPV | |
var pos = getOffset(this); | |
$('#successDiv').css({ | |
'top': pos.top + 12, | |
'left': pos.left - 12, | |
}); | |
var currentPageNum = 0; | |
var currentScrollLocation = $('#pane_images').scrollTop(); | |
var allImgDiv = $('#pane_images_inner').children('div'); | |
for (i = 0; i < allImgDiv.length; i++) { | |
currentScrollLocation -= allImgDiv[i].offsetHeight; | |
currentPageNum++; | |
if (currentScrollLocation <= 0) { | |
break; | |
} | |
} | |
var lastPage = document.getElementById("pane_thumbs_inner").childElementCount; | |
var title = document.title.substring(0, document.title.lastIndexOf(" - ")) + " {" + currentPageNum + "/" + lastPage + "}"; | |
var link = parse_gallery_identifier(); | |
link = link.substring(0, link.lastIndexOf("/")) + "/#page" + currentPageNum; | |
var mainPage_URL = window.location.href.substring(0, window.location.href.lastIndexOf("/")).replace("mpv", "g"); | |
var thumbnailLink; | |
$(document).ajaxComplete(function (event, xhr, settings) { | |
var data = xhr.responseText; | |
var divStyle = $("#gd1", data).children('div').attr("style").split(" "); | |
if (divStyle[3].startsWith("url")) { | |
thumbnailLink = divStyle[3].substring(divStyle[3].indexOf("(") + 1, divStyle[3].indexOf(")")); | |
} else { | |
for (i = 0; i < stuff.length; i++) { | |
if (divStyle[i].startsWith("url")) { | |
thumbnailLink = divStyle[i].substring(divStyle[i].indexOf("(") + 1, divStyle[i].indexOf(")")); | |
break; | |
} | |
} | |
} | |
thumbnailLink = thumbnailLink.replace("exhentai.org", "ehgt.org"); | |
add_rlEntry(title, link, thumbnailLink); | |
populate_rlDiv(); | |
$('#successDiv').fadeIn(); | |
setTimeout(function () { | |
$('#successDiv').fadeOut(); | |
}, 2000); | |
}); | |
$.ajax(mainPage_URL); | |
} | |
function exportFunction() { | |
var str = rlArrayToString(readLaterList); | |
var filename = "eh_view_later_list"; | |
var blob = new Blob([str], { type: "text/plain;charset=utf-8" }); | |
saveAs(blob, filename + ".txt"); | |
} | |
function importFunction() { | |
var input = document.createElement('input'); | |
$(input).attr("type", "file"); | |
input.addEventListener("change", function readSingleFile(e) { | |
var file = e.target.files[0]; | |
if (!file) { | |
return; | |
} | |
var reader = new FileReader(); | |
reader.onload = function (e) { | |
var contents = e.target.result; | |
GM_setValue("readLater", contents); | |
populate_rlDiv(); | |
var successDiv; | |
successDiv = '<div id="successDiv" class="light">List successfully loaded</div>'; | |
$('body').append(successDiv); | |
successDiv = $('#successDiv'); | |
successDiv.hide(); | |
$('#successDiv').css({ | |
'top': 1 + 12, | |
'left': 1 - 12, | |
}); | |
$('#successDiv').fadeIn(); | |
setTimeout(function () { | |
$('#successDiv').fadeOut(); | |
}, 2000); | |
}; | |
reader.readAsText(file); | |
}, false); | |
$(input).trigger('click'); | |
} | |
function view_rlButtonClick() { | |
if ($('#readLaterDiv').is(":visible")) { | |
hide_rlList(); | |
} else { | |
show_rlList(); | |
populate_rlDiv(); | |
} | |
} | |
function getGalleryID(pageHref) { | |
var splitHref = pageHref.split("/"); | |
if (pageHref.indexOf("/g/") > -1 || pageHref.indexOf("/mpv/") > -1) { | |
return splitHref[2]; | |
} else { | |
return splitHref[3].substring(0, splitHref[3].indexOf("-")); | |
} | |
} | |
function populate_rlDiv() { | |
readLaterList = load_rlList(); | |
console.log($('#readLaterDiv').is(':visible')); | |
console.log($('.readLaterItem').length, readLaterList.length); | |
if ($('#readLaterDiv').is(':visible') && ($('.readLaterItem').length === 0 || $('.readLaterItem').length !== readLaterList.length)) { | |
$("#readLaterTable_wrapper").remove(); // remove existing ones and repopulate the list | |
$('#readLaterTableWrapper').append( | |
`<table id="readLaterTable" class="display" cellspacing="0" width="100%"> | |
<thead> | |
<tr> | |
<th>Delete</th> | |
<th>EH Link</th> | |
<th>EX Link</th> | |
<th>Title</th> | |
<th>Circle</th> | |
<th>Artist</th> | |
<th>Event</th> | |
</tr> | |
</thead> | |
<tbody id="readLaterTableBody"> | |
</tbody> | |
</table>` | |
); | |
$("#rlDivHeader").text("Read Later List: (" + readLaterList.length + " items)"); | |
for (i = 0; i < readLaterList.length; i++) { | |
var entryDOM = '<tr class="readLaterItem hoverPopup light" id="item' + i + '">'; | |
if (readLaterList[i] !== null) { | |
entryDOM += '<td class="readLaterRemoveItem option light">Remove</td>'; | |
entryDOM += '<td>' + createLink("", "https://e-hentai.org" + readLaterList[i].link, "Read") + '</td>'; | |
entryDOM += '<td>' + createLink("", "https://exhentai.org" + readLaterList[i].link, "Read") + '</td>'; | |
entryDOM += '<td>' + readLaterList[i].title + '</td>'; | |
entryDOM += '<td>' + readLaterList[i].group + '</td>'; | |
entryDOM += '<td>' + readLaterList[i].artist + '</td>'; | |
entryDOM += '<td>' + readLaterList[i].eventName + '</td>'; | |
} | |
entryDOM += "</tr>" | |
$('#readLaterTableBody').append(entryDOM); | |
} | |
$(".hoverPopup").mousemove(function (event) { //on | |
previewDiv.css({ | |
"left": event.clientX + "px", | |
"top": event.clientY + "px", | |
}); | |
if (event.clientX > (document.getElementById('readLaterDiv').offsetWidth * 0.75)) { | |
previewDiv.addClass("showLeft"); | |
previewDiv.removeClass("showRight"); | |
} else { | |
previewDiv.addClass("showRight"); | |
previewDiv.removeClass("showLeft"); | |
} | |
previewDiv.show(); | |
var arrayNumber = $(this).attr('id').replace("item", ""); | |
var thumbLink = readLaterList[arrayNumber].thumbnailLink; | |
if (thumbLink !== undefined && thumbLink !== "" && thumbLink !== "undefined") { | |
$("#previewImg").attr("src", thumbLink); | |
} else { | |
$("#previewImg").attr("src", ""); | |
$("#placeholderText").text("Sorry, please re-add the gallery to see thumbnail"); | |
previewDiv.css("width", "160px"); | |
} | |
$(this).addClass('highlighted'); | |
}); | |
$(".hoverPopup").mouseleave(function (event) { //off | |
previewDiv.hide(); | |
$("#placeholderText").text(""); | |
previewDiv.css("width", ""); | |
$(this).removeClass('highlighted'); | |
}); | |
var removeItem = document.getElementsByClassName("readLaterRemoveItem"); | |
for (i = 0; i < removeItem.length; i++) { | |
removeItem[i].addEventListener("click", function () { | |
//this.parentNode.remove(this); | |
remove_rlEntry(parse_gallery_identifier(this.nextElementSibling.children[0].href)); | |
}); | |
} | |
redoTheme(); | |
dataTable = $('#readLaterTable').DataTable({ | |
"scrollY": "400px", | |
"scrollCollapse": true, | |
"paging": false, | |
"responsive": true, | |
"bAutoWidth": true, | |
}); | |
// setTimeout(function () { | |
// $('th')[0].click(); | |
// }, 100) | |
} | |
} | |
function remove_rlEntryFunction(event) { | |
remove_rlEntry(parse_gallery_identifier()); | |
$(this).parent().remove(); | |
} | |
function add_rlEntryFunction() { | |
var title; | |
if (window.location.href.indexOf("/g/") > -1) { | |
title = $('#gn').text(); | |
} else { | |
title = $('#i1').children('h1').text() + " {" + $('#i2').children('.sn').children('div').text().replace(/ /g, "") + "}"; | |
} | |
var thumbnailLink; | |
if (currentPageLink.indexOf("/s/") > -1) { | |
var mainPage_URL = $('#i5').children('.sb').children('a').attr('href'); | |
$(document).ajaxComplete(function (event, xhr, settings) { | |
var data = xhr.responseText; | |
var divStyle = $("#gd1", data).children('div').attr("style").split(" "); | |
if (divStyle[3].startsWith("url")) { | |
thumbnailLink = divStyle[3].substring(divStyle[3].indexOf("(") + 1, divStyle[3].indexOf(")")); | |
} else { | |
for (i = 0; i < stuff.length; i++) { | |
if (divStyle[i].startsWith("url")) { | |
thumbnailLink = divStyle[i].substring(divStyle[i].indexOf("(") + 1, divStyle[i].indexOf(")")); | |
break; | |
} | |
} | |
} | |
thumbnailLink = thumbnailLink.replace("exhentai.org", "ehgt.org"); | |
add_rlEntry(title, parse_gallery_identifier(), thumbnailLink); | |
populate_rlDiv(); | |
$('#successDiv').fadeIn(); | |
setTimeout(function () { | |
$('#successDiv').fadeOut(); | |
}, 2000); | |
$('#addReadLaterOption').text('Added to list'); | |
$('#addReadLaterOption').off(); | |
$('#addReadLaterOption').css({ | |
'text-decoration': 'none', | |
'cursor': 'default', | |
}); | |
}); | |
$.ajax(mainPage_URL); | |
} else { | |
var divStyle = $("#gd1").children('div').attr("style").split(" "); | |
if (divStyle[3].startsWith("url")) { | |
thumbnailLink = divStyle[3].substring(divStyle[3].indexOf("(") + 1, divStyle[3].indexOf(")")); | |
} else { | |
for (i = 0; i < stuff.length; i++) { | |
if (divStyle[i].startsWith("url")) { | |
thumbnailLink = divStyle[i].substring(divStyle[i].indexOf("(") + 1, divStyle[i].indexOf(")")); | |
break; | |
} | |
} | |
} | |
thumbnailLink = thumbnailLink.replace("exhentai.org", "ehgt.org"); | |
add_rlEntry(title, parse_gallery_identifier(), thumbnailLink); | |
populate_rlDiv(); | |
$('#addReadLaterOption').text('Added to list'); | |
$('#addReadLaterOption').off(); | |
$('#addReadLaterOption').css({ | |
'text-decoration': 'none', | |
'cursor': 'default', | |
}); | |
} | |
} | |
function show_rlList() { | |
readLaterDiv.show(); | |
$('#seeReadLaterListOption').text('Hide "view later" list'); | |
} | |
function hide_rlList() { | |
readLaterDiv.hide(); | |
$('#seeReadLaterListOption').text('Show "view later" list'); | |
} | |
function createLink(id, link, text) { | |
return '<a id="' + id + '" href="' + link + '" class="link light">' + text + '</a>'; | |
} | |
function createOption(id, text) { | |
return '<li><label id="' + id + '" class="option light">' + text + '</label></li>'; | |
} | |
function createOptionWithClass(id, text, extraClass) { | |
return '<li><label id="' + id + '" class="option light ' + extraClass + '">' + text + '</label></li>'; | |
} | |
function rlStringToArray(string) { | |
var returnArray = []; | |
var splitString = string.split(";"); | |
for (i = 0; i < splitString.length; i++) { | |
var entrySplit = splitString[i].split("::"); | |
var entry = create_rlEntry(entrySplit[0], entrySplit[1], entrySplit[2]); | |
if (entry !== null) { | |
returnArray.push(entry); | |
} | |
} | |
return returnArray; | |
} | |
function rlArrayToString(array) { | |
var returnString = ""; | |
for (i = 0; i < array.length; i++) { | |
returnString += getStringEntry(array[i]); | |
if (i !== (array.length - 1)) { | |
returnString += ";"; | |
} | |
} | |
return returnString; | |
} | |
function create_rlEntry(title, link, thumbnailLink) { | |
if (!link || !title || !thumbnailLink) { | |
return null; | |
} else { | |
titleParse = parseTitle(title); | |
return { eventName: titleParse.eventName, group: titleParse.group, artist: titleParse.artist, title: titleParse.title, link: link, thumbnailLink: thumbnailLink }; | |
} | |
} | |
function getStringEntry(entry) { | |
var returnString = unparseTitle(entry) | |
returnString += "::" + entry.link; | |
returnString += "::" + entry.thumbnailLink; | |
return returnString; | |
} | |
function load_rlList() { | |
var rlString = GM_getValue("readLater", ""); | |
return rlStringToArray(rlString); | |
} | |
function add_rlEntry(title, link, thumbnailLink) { | |
titleParsed = parseTitle(title); | |
if (getIndex_rlList(link).index === -1) { | |
var entry = create_rlEntry(title, link, thumbnailLink); | |
var entryString = title + "::" + link + "::" + thumbnailLink; | |
// add to current saved list | |
readLaterList.push(entry); | |
// add to GM_saved list | |
var newValue = GM_getValue("readLater", ""); | |
if (newValue !== "") { | |
newValue += ";"; | |
} | |
newValue += entryString; | |
GM_setValue("readLater", newValue); | |
} else { | |
var replaceItemIndex = getIndex_rlList(link).index; | |
// update current saved list | |
readLaterList[replaceItemIndex].eventName = titleParsed.eventName; | |
readLaterList[replaceItemIndex].group = titleParsed.group; | |
readLaterList[replaceItemIndex].artist = titleParsed.artist; | |
readLaterList[replaceItemIndex].title = titleParsed.title; | |
readLaterList[replaceItemIndex].link = link; | |
readLaterList[replaceItemIndex].thumbnailLink = thumbnailLink; | |
// update current saved list | |
var savedValue = GM_getValue("readLater", ""); | |
var array = rlStringToArray(savedValue); | |
array[replaceItemIndex].eventName = titleParsed.eventName; | |
array[replaceItemIndex].group = titleParsed.group; | |
array[replaceItemIndex].artist = titleParsed.artist; | |
array[replaceItemIndex].title = titleParsed.title; | |
array[replaceItemIndex].link = link; | |
array[replaceItemIndex].thumbnailLink = thumbnailLink; | |
savedValue = rlArrayToString(array); | |
GM_setValue("readLater", savedValue); | |
} | |
} | |
function remove_rlEntry(link) { | |
var removeItemIndex = getIndex_rlList(link).index; | |
// remove from current saved list | |
readLaterList.splice(removeItemIndex, 1); | |
// remove from GM_saved list | |
var savedValue = GM_getValue("readLater", ""); | |
var array = rlStringToArray(savedValue); | |
array.splice(removeItemIndex, 1); | |
savedValue = rlArrayToString(array); | |
GM_setValue("readLater", savedValue); | |
if (location.href.indexOf(link) > -1) { | |
$('#addReadLaterOption').text('Add to "view later" list'); | |
if (currentPageLink.indexOf("/mpv/") === -1) { | |
document.getElementById('addReadLaterOption').addEventListener("click", add_rlEntryFunction); | |
} | |
$('#addReadLaterOption').css({ | |
'text-decoration': 'underline', | |
'cursor': 'pointer', | |
}); | |
} | |
if (document.getElementsByClassName("readLaterItem").length === 0) { | |
hide_rlList(); | |
} | |
populate_rlDiv(); | |
} | |
function getIndex_rlList(link) { | |
var galleryID = getGalleryID(link); | |
for (i = 0; i < readLaterList.length; i++) { | |
if (readLaterList[i].link !== undefined && readLaterList[i].link.indexOf(galleryID) > -1) { | |
if (readLaterList[i].link === link) { | |
return { index: i, exactMatch: true }; | |
} else { | |
return { index: i, exactMatch: false }; | |
} | |
} | |
} | |
return { index: -1, exactMatch: false }; | |
} | |
// Parse the gallery link | |
function parse_gallery_identifier(link) { | |
var identifier_start; | |
var identifier_end; | |
var identifier; | |
if (link === undefined) { | |
if (location.href.indexOf('e-hentai.org') !== - 1) { | |
identifier_start = location.href.indexOf('e-hentai.org') + 12; | |
} else if (location.href.indexOf('exhentai.org') !== - 1) { | |
identifier_start = location.href.indexOf('exhentai.org') + 12; | |
} | |
identifier_end = location.href.length; | |
identifier = location.href.substr(identifier_start, identifier_end); | |
} else { | |
if (link.indexOf('e-hentai.org') !== - 1) { | |
identifier_start = link.indexOf('e-hentai.org') + 12; | |
} else if (link.indexOf('exhentai.org') !== - 1) { | |
identifier_start = link.indexOf('exhentai.org') + 12; | |
} | |
identifier_end = link.length; | |
identifier = link.substr(identifier_start, identifier_end); | |
} | |
return identifier; | |
} | |
//////////////////////////////////////////////////////////////// | |
// Parsing and unparsing title | |
//////////////////////////////////////////////////////////////// | |
function unparseTitle(parsedTitle) { | |
var returnString = ""; | |
if (parsedTitle.eventName !== "") { | |
returnString += "(" + parsedTitle.eventName + ") "; | |
} | |
if (parsedTitle.group !== "" && parsedTitle.artist !== "") { | |
returnString += "[" + parsedTitle.group + " (" + parsedTitle.artist + ")] "; | |
} else if (parsedTitle.artist !== "") { | |
returnString += "[" + parsedTitle.artist + "] "; | |
} | |
returnString += parsedTitle.title; | |
return returnString; | |
} | |
function parseTitle(stringTitle) { | |
var eventName = ""; | |
var group = ""; | |
var artist = ""; | |
var title = ""; | |
var title_done = false; | |
var mode = ""; | |
var temp = ""; | |
for (j = 0; j < stringTitle.length; j++) { | |
if (stringTitle[j] === "(" && mode === "") { | |
mode = "event"; | |
} else if (stringTitle[j] === ")" && mode === "event") { | |
mode = ""; | |
} else if (stringTitle[j] === "[" && mode === "") { | |
mode = "info"; | |
} else if (stringTitle[j] === "(" && mode === "info") { | |
mode = "artist"; | |
group = temp; | |
} else if (stringTitle[j] === ")" && mode === "artist") { | |
mode = "title"; | |
} else if (stringTitle[j] === "]" && mode === "info") { | |
mode = "title"; | |
artist = temp; | |
} else if (stringTitle[j] === "]" && stringTitle[j - 1] === ")") { | |
mode = "title"; | |
} else { | |
switch (mode) { | |
case "": | |
title += stringTitle[j]; | |
break; | |
case "event": | |
eventName += stringTitle[j]; | |
break; | |
case "info": | |
temp += stringTitle[j]; | |
break; | |
case "artist": | |
artist += stringTitle[j]; | |
break; | |
case "title": | |
title += stringTitle[j]; | |
break; | |
} | |
} | |
} | |
return { eventName: eventName.trim(), group: group.trim(), artist: artist.trim(), title: title.trim() }; | |
} | |
//////////////////////////////////////////////////////////////// | |
// UI Related | |
//////////////////////////////////////////////////////////////// | |
function hideFixedDivContent() { | |
$('#minmaxFixedDivButton').text("+"); | |
$('#scriptTitleHeader').hide(); | |
$('#linkerDiv').hide(); | |
$('#readLaterOptionDiv').hide(); | |
$('#optionDiv').hide(); | |
} | |
function showFixedDivContent() { | |
$('#minmaxFixedDivButton').text("–"); | |
$('#scriptTitleHeader').show(); | |
$('#linkerDiv').show(); | |
$('#readLaterOptionDiv').show(); | |
if ($('.setting').length > 0) { | |
$('#optionDiv').show(); | |
} | |
} | |
function redoTheme() { | |
if (theme === "dark") { | |
$('.light').addClass("dark"); | |
$('.light').removeClass("light"); | |
} else { | |
$('.dark').addClass("light"); | |
$('.dark').removeClass("dark"); | |
} | |
} | |
//////////////////////////////////////////////////////////////// | |
// External codes | |
//////////////////////////////////////////////////////////////// | |
// Credit to Adam Grant: http://stackoverflow.com/questions/442404/retrieve-the-position-x-y-of-an-html-element | |
function getOffset(el) { | |
el = el.getBoundingClientRect(); | |
return { | |
left: el.left + window.scrollX, | |
top: el.top + window.scrollY | |
}; | |
} | |
/*! | |
* JavaScript Cookie v2.1.3 | |
* https://github.com/js-cookie/js-cookie | |
* | |
* Copyright 2006, 2015 Klaus Hartl & Fagner Brack | |
* Released under the MIT license | |
*/ | |
; (function (factory) { | |
var registeredInModuleLoader = false; | |
if (typeof define === 'function' && define.amd) { | |
define(factory); | |
registeredInModuleLoader = true; | |
} | |
if (typeof exports === 'object') { | |
module.exports = factory(); | |
registeredInModuleLoader = true; | |
} | |
if (!registeredInModuleLoader) { | |
var OldCookies = window.Cookies; | |
var api = window.Cookies = factory(); | |
api.noConflict = function () { | |
window.Cookies = OldCookies; | |
return api; | |
}; | |
} | |
}(function () { | |
function extend() { | |
var i = 0; | |
var result = {}; | |
for (; i < arguments.length; i++) { | |
var attributes = arguments[i]; | |
for (var key in attributes) { | |
result[key] = attributes[key]; | |
} | |
} | |
return result; | |
} | |
function init(converter) { | |
function api(key, value, attributes) { | |
var result; | |
if (typeof document === 'undefined') { | |
return; | |
} | |
// Write | |
if (arguments.length > 1) { | |
attributes = extend({ | |
path: '/' | |
}, api.defaults, attributes); | |
if (typeof attributes.expires === 'number') { | |
var expires = new Date(); | |
expires.setMilliseconds(expires.getMilliseconds() + attributes.expires * 864e+5); | |
attributes.expires = expires; | |
} | |
try { | |
result = JSON.stringify(value); | |
if (/^[\{\[]/.test(result)) { | |
value = result; | |
} | |
} catch (e) { } | |
if (!converter.write) { | |
value = encodeURIComponent(String(value)) | |
.replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent); | |
} else { | |
value = converter.write(value, key); | |
} | |
key = encodeURIComponent(String(key)); | |
key = key.replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent); | |
key = key.replace(/[\(\)]/g, escape); | |
return (document.cookie = [ | |
key, '=', value, | |
attributes.expires ? '; expires=' + attributes.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE | |
attributes.path ? '; path=' + attributes.path : '', | |
attributes.domain ? '; domain=' + attributes.domain : '', | |
attributes.secure ? '; secure' : '' | |
].join('')); | |
} | |
// Read | |
if (!key) { | |
result = {}; | |
} | |
// To prevent the for loop in the first place assign an empty array | |
// in case there are no cookies at all. Also prevents odd result when | |
// calling "get()" | |
var cookies = document.cookie ? document.cookie.split('; ') : []; | |
var rdecode = /(%[0-9A-Z]{2})+/g; | |
var i = 0; | |
for (; i < cookies.length; i++) { | |
var parts = cookies[i].split('='); | |
var cookie = parts.slice(1).join('='); | |
if (cookie.charAt(0) === '"') { | |
cookie = cookie.slice(1, -1); | |
} | |
try { | |
var name = parts[0].replace(rdecode, decodeURIComponent); | |
cookie = converter.read ? | |
converter.read(cookie, name) : converter(cookie, name) || | |
cookie.replace(rdecode, decodeURIComponent); | |
if (this.json) { | |
try { | |
cookie = JSON.parse(cookie); | |
} catch (e) { } | |
} | |
if (key === name) { | |
result = cookie; | |
break; | |
} | |
if (!key) { | |
result[name] = cookie; | |
} | |
} catch (e) { } | |
} | |
return result; | |
} | |
api.set = api; | |
api.get = function (key) { | |
return api.call(api, key); | |
}; | |
api.getJSON = function () { | |
return api.apply({ | |
json: true | |
}, [].slice.call(arguments)); | |
}; | |
api.defaults = {}; | |
api.remove = function (key, attributes) { | |
api(key, '', extend(attributes, { | |
expires: -1 | |
})); | |
}; | |
api.withConverter = init; | |
return api; | |
} | |
return init(function () { }); | |
})); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Now it's just a blank page instead of SadPanda