Offline tag search support, nhentai/Hentai2Read links on a book information page and click popup disabling
As of
// ==UserScript==
// @name Tsumino Tweaks
// @description Offline tag search support, nhentai/Hentai2Read links on a book information page and click popup disabling
// @namespace xspeed.net
// @version 6
// @icon https://static.nhentai.net/img/logo.650c98bbb08e.svg
// @match *://www.tsumino.com/*
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_xmlhttpRequest
// ==/UserScript==
(function() {
'use strict';
var jsonError = function(data) {
alert(JSON.stringify(data));
}
unsafeWindow.open = function () {
console.error('Blocked window.open', Array.prototype.slice.apply(arguments));
return { }
};
unsafeWindow.showModalDialog = function () {
console.error('Blocked window.showModalDialog', Array.prototype.slice.apply(arguments));
return { }
};
String.prototype.removeAfter = function(char) {
var ix = this.indexOf(char);
return ix == -1 ? this : this.substring(0, ix);
}
if (location.href.indexOf('/entry/') != -1) {
var title = $('#Title').text().removeAfter('/').removeAfter('|').trim();
var artist = $('a[data-type="Artist"]').text().trim().removeAfter('|').removeAfter('\n').trim();
$('#backToIndex').remove();
$('#btnMakeAccount').remove();
var onNH = function(resp) {
var respDoc = $(resp.responseText);
var cover = respDoc.find('.cover');
if (cover && cover.attr('href')) {
var dest = 'https://nhentai.net' + cover.attr('href') + '1/';
$('#btnReadOnline').after('<a href="' + dest + '" id="btnReadNH" class="book-read-button button-stack"><i class="fa fa-arrow-circle-right"></i> nhentai</a>');
}
}
var onH2R = function(resp) {
console.log(resp.responseText);
var respJson = JSON.parse(resp.responseText);
var suggestions = respJson.response.suggestions;
if (suggestions.length > 0) {
var dest = suggestions[0].slug + '1/';
$('#btnReadOnline').after('<a href="' + dest + '" id="btnReadH2R" class="book-read-button button-stack"><i class="fa fa-arrow-circle-right"></i> Hentai2Read</a>');
}
}
var url = 'https://nhentai.net/search/?q=english+' + artist.replace(' ', '+') + '+' + title.replace(/[^a-z0-9+]+/gi, '+');
GM_xmlhttpRequest({ method: "GET", url: url, onload: onNH, onerror: jsonError });
GM_xmlhttpRequest({
method: "POST",
url: 'https://hentai2read.com/api',
data: 'controller=search&action=all&query=' + encodeURIComponent(title),
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
onload: onH2R,
onerror: jsonError
});
}
else {
var tagSearch = $('#tagDataSearch');
if (tagSearch.length) {
var tagMode = false;
var tagData = GM_getValue('tagData', '[]');
var tagList = JSON.parse(tagData);
var oldAdapter = null;
var offlineQuery = function(params, callback) {
var res = [];
if (params && params.term && params.term.length != 0) {
var term = params.term.toLowerCase();
for (var tag of tagList) {
if (tag[0].toLowerCase().indexOf(term) != -1) {
res.push(tag[0]);
if (res.length > 4) break;
}
}
}
callback({ results: res.map(x => ({ key: 0, text: x, id: x })) });
};
tagSearch.next().html('<button id="tagsRefresh" type="button" class="book-read-button" style="padding: 5px 10px; margin: 5px 0;">Refresh tag list</button> Loaded tags: <span id=tagsCount>0</span>')
$('#tagsCount').text(Object.keys(tagList).length);
$('#selTagType').change(function() {
var selData = $('#selTagValue').data('select2');
if ($(this).val() == 1 && !tagMode) {
oldAdapter = selData.dataAdapter.query;
tagMode = true;
selData.dataAdapter.query = offlineQuery;
}
else if (tagMode) {
selData.dataAdapter.query = oldAdapter;
tagMode = false;
}
});
$('#btnSearch').one('click', function() {
$('#selTagType').change();
});
$('#tagsRefresh').click(function() {
this.disabled = true;
$('#tagsCount').text('0...');
var onload = function(resp) {
var respDoc = JSON.parse(resp.responseText);
tagList = [];
for (var i = 0; i < respDoc.length; ++i) {
if (respDoc[i].type == "Tag") {
var id = respDoc[i].text.trim();
if (id.length > 0) tagList.push([id, 1]);
}
}
//respDoc.find('.blog-all-post>.row-no-margin>.col-no-padding>.definition-section:nth(1)').next().find('.definition-key').each(function() {
// var id = $(this).text().trim();
// if (id.length > 0) tagList.push([id, 1]);
//});
$('#tagsCount').text(Object.keys(tagList).length);
GM_setValue('tagData', JSON.stringify(tagList));
$('#tagsRefresh').prop('disabled', false);
};
GM_xmlhttpRequest({ method: "GET", url: 'https://core.tsumino.com/api/Tag/GetAllDefinableTagsAsync', onload: onload, onerror: jsonError });
});
}
}
})();