🏠 Home 

VNDB Cover Preview

Previews covers in vndb.org searches when hovering over the respective hyperlinks.

// ==UserScript==
// @name        VNDB Cover Preview
// @namespace   https://twitter.com/Kuroonehalf
// @namespace   https://kuroonehalf.com
// @include     https://vndb.org*
// @include     https://vndb.org/v*
// @include     https://vndb.org/g*
// @include     https://vndb.org/p*
// @include     https://vndb.org/u*
// @include     https://vndb.org/s*
// @include     https://vndb.org/r*
// @include     https://vndb.org/c*
// @include     https://vndb.org/t*
// @version     2.0.2
// @description Previews covers in vndb.org searches when hovering over the respective hyperlinks.
// @grant       GM_setValue
// @grant       GM_getValue
// @require     http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js
// @license     http://creativecommons.org/licenses/by-nc-sa/4.0/
// @inject-into content
// ==/UserScript==
// For testing what kind of page we're on
var TagLinkTest = /^https:\/\/vndb.org\/g\/links/;
var UserLinkTest = /^https:\/\/vndb.org\/u[0-9]+/;
var VNLinkTest = /^https:\/\/vndb.org\/v[0-9]+/;
var CharacterLinkTest = /^https:\/\/vndb.org\/c[0-9]+/;
var pageURL = document.URL;
// Disable tooltips on links
$('[title]').mouseover( function() {
var $this = $(this);
$this.data('title',$this.attr('title'));
$this.removeAttr('title');
});
// Image positioning function
jQuery.fn.center = function (leftoffset, topoffset) {
// Vertical displacement. Puts the image next to the link, and keeps it in bounds
this.css("top", Math.max($(window).scrollTop(), Math.min($(window).height() + $(window).scrollTop() - $(this).outerHeight() , topoffset - $(this).outerHeight()/2 + $(window).scrollTop() ) ));
// Horizontal displacement
// On some pages place the cover to the left of the link
if (pageURL.search(TagLinkTest) != -1 || pageURL.search(UserLinkTest) != -1 || pageURL.search(VNLinkTest) != -1)
this.css("left", leftoffset + $(window).scrollLeft() - $(this).outerWidth() - 25);
// On others display on the right
else
this.css("left", Math.max(0, $(window).width() * 0.6 + $(window).scrollLeft() - $(this).outerWidth()/2 ));
$('#popover img').css('display','block');
return this;
};
// Add box where the image will sit
$('body').append('<div ID="popover"></div>');
$('#popover').css('position', 'absolute');
$('#popover').css('z-index', '10');
$('#popover').css('box-shadow','0px 0px 5px black');
$('tr a').mouseover(function () {
$(this).css('font-weight', 'bold'); // Bolds hovered links
var leftoffset = this.getBoundingClientRect().left;
var topoffset =  this.getBoundingClientRect().top;
var VNnumber = $(this).attr('href');
var pagelink = 'https://vndb.org' + VNnumber;
if (GM_getValue(pagelink)){
var retrievedLink = GM_getValue(pagelink);
// Replace image being displayed with new one hovered
$('#popover').empty();
$('#popover').append('<img src="' + retrievedLink + '"></img>');
$('#popover img').load(function() {
$('#popover').center(leftoffset, topoffset);
});
//console.log(pagelink + " has been found and retrieved from the cache."); // for debug purposes
}
else{
$.ajax({
url: pagelink,
dataType: 'text',
success: function (data) {
// Convert the HTML string into a document object
var parser = new DOMParser();
let dataDOC = parser.parseFromString(data, 'text/html');
var imagelink;
// Grab character image
if (pagelink.search(CharacterLinkTest) != -1)
imagelink = dataDOC.querySelector(".charimg img").src;
// Grab visual novel cover
else
imagelink = dataDOC.querySelector(".vnimg img").src
// clear what's inside #popover and put the new image in there
$('#popover').empty();
$('#popover').append('<img src="' + imagelink + '"></img>');
$('#popover img').load(function() {
$('#popover').center();
});
// cache info
GM_setValue(pagelink, imagelink);
//console.log("(" + pagelink + ", "+ imagelink + ") successfully cached.") // for testing purposes
}
});
}
});
// Clear image on unhover
$('tr a').mouseleave(function(){
$('#popover').empty();
});