- // ==UserScript==
- // @name e621 Thumbnail Enhancer
- // @version 1.01
- // @description Resizes thumbnails on e621.net, replacing them with higher resoltion images and adding support for video previews.
- // @author swordgedance
- // @include http://*e621.net/post*
- // @include https://*e621.net/post*
- // @include http://*e621.net/pool*
- // @include https://*e621.net/pool*
- // @grant GM.xmlHttpRequest
- // @namespace https://greasyfork.org/de/users/398891
- // ==/UserScript==
-
- //original rooshoos
- //http://twitter.com/rooshoos
-
-
-
- var sty =document.createElement("style");
- sty.innerHTML=[
- "div.thumbEnh_cont{"
- ," display: grid;"
- ," grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));"
- ,"}"
- ,"div.thumbEnh_cont span.thumb{"
- ," width:90%;"
- ," height:auto;"
- ,"}"
- ,"span.thumb img{"
- ," width:100%;"
- ," height:auto;"
- ,"}"
- // ,"span.thumb {"
- // ," width: 30%;" //auto;"
- // ," height: auto;" //250px;"
- // ," margin: 0 10px 10px 0;"
- // ,"}"
-
- ,"span.thumb .preview {"
- ," display: block;"
- ," height: auto;"//220px;"
- ," width: 100%;"//auto;"
- ,"}"
-
- ,"#child-posts-expanded-thumbs span.thumb,"
- ,"#child-posts-expanded-thumbs span.thumb .preview {"
- ," width: 32%;"//180px;"
- ," height:auto;"
- ,"}"
-
- ,"span.thumb .post-score {"
- ," width: auto !important;"
- ,"}"
-
- ,"span.thumb .tooltip-thumb {"
- ," display: block;"
- ," position: relative;"
- ,"}"
-
- ,"span.thumb .gif,"
- ,"span.thumb .video {"
- ," position: relative;"
- ," display: block;"
- ,"}"
-
- ,"span.thumb .gif:not(:hover)::after,"
- ,"span.thumb .video:not(:hover)::after {"
- ," content: '';"
- ," display: block;"
- ," position: absolute;"
- ," top: 0; bottom: 0; left: 0; right: 0;"
- ,"}"
-
- ,"span.thumb .video:not(:hover)::after {"
- ," background: transparent "
- ," url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjA2IiBoZWlnaHQ9IjIwNiIgdmlld0JveD0iMCAwIDIwNiAyMDYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPjxkZWZzPjxjaXJjbGUgaWQ9ImIiIGN4PSI5MCIgY3k9IjkwIiByPSI5MCIvPjxmaWx0ZXIgeD0iLTUwJSIgeT0iLTUwJSIgd2lkdGg9IjIwMCUiIGhlaWdodD0iMjAwJSIgZmlsdGVyVW5pdHM9Im9iamVjdEJvdW5kaW5nQm94IiBpZD0iYSI+PGZlT2Zmc2V0IGluPSJTb3VyY2VBbHBoYSIgcmVzdWx0PSJzaGFkb3dPZmZzZXRPdXRlcjEiLz48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI2LjUiIGluPSJzaGFkb3dPZmZzZXRPdXRlcjEiIHJlc3VsdD0ic2hhZG93Qmx1ck91dGVyMSIvPjxmZUNvbXBvc2l0ZSBpbj0ic2hhZG93Qmx1ck91dGVyMSIgaW4yPSJTb3VyY2VBbHBoYSIgb3BlcmF0b3I9Im91dCIgcmVzdWx0PSJzaGFkb3dCbHVyT3V0ZXIxIi8+PGZlQ29sb3JNYXRyaXggdmFsdWVzPSIwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwLjI5NDE1NzYwOSAwIiBpbj0ic2hhZG93Qmx1ck91dGVyMSIvPjwvZmlsdGVyPjwvZGVmcz48ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEzIDEzKSI+PHVzZSBmaWxsPSIjMDAwIiBmaWx0ZXI9InVybCgjYSkiIHhsaW5rOmhyZWY9IiNiIi8+PHVzZSBmaWxsLW9wYWNpdHk9Ii44ODEiIGZpbGw9IiNGRkYiIHhsaW5rOmhyZWY9IiNiIi8+PC9nPjxwYXRoIGZpbGwtb3BhY2l0eT0iLjQiIGZpbGw9IiMwMDAiIGQ9Ik04MS41IDE0Ny42NThWNTkuMzQybDY1IDQ0LjE1OCIvPjwvZz48L3N2Zz4=)"
- ," no-repeat center/80px;"
- ,"}"
-
- ,"span.thumb .gif:not(:hover)::after {"
- ," content: 'GIF';"
- ," width: 60px;"
- ," height: 30px;"
- ," margin: auto;"
- ," font-size: 16px;"
- ," font-weight: bold;"
- ," line-height: 30px;"
- ," color: rgba(0,0,0,0.4);"
- ," background-color: rgba(255,255,255,0.8);"
- ," border-radius: 6px;"
- ," box-shadow: 0 0 13px rgba(0,0,0,0.29);"
- ,"}"
-
- ,"span.thumb .gif:hover .preview {"
- ," display: none !important;"
- ,"}"
-
- ,"span.thumb .gif:hover img.preview {"
- ," display: block !important;"
- ,"}"
- ].join("");
- document.head.appendChild(sty);
-
-
- (function () {
- var contDiv = document.querySelector("span.thumb").parentElement;
- contDiv.className = "thumbEnh_cont";
-
-
- function is_gif(i) {
- return /^(?!data:).*\.gif/i.test(i.src);
- }
-
- function freeze_gif(i) {
- var c = document.createElement('canvas');
- var w = c.width = i.naturalWidth;
- var h = c.height = i.naturalHeight;
- var p = i.parentNode;
- c.getContext('2d').drawImage(i, 0, 0, w, h);
- p.className = ['gif', p.className].join(' ');
- try {
- i.src = c.toDataURL("image/gif"); // if possible, retain all css aspects
- } catch (e) { // cross-domain -- mimic original with all its tag attributes
- replaceImg(c, i);
- i.style.display = 'none';
- p.insertBefore(i, p.firstChild);
- }
- }
-
- function replaceImg(e, i) {
- e.className = i.className;
- var s = window.getComputedStyle(i);
- e.style.border = s.getPropertyValue('border');
- e.style.borderRadius = s.getPropertyValue('border-radius');
- i.parentNode.replaceChild(e, i);
- }
-
- function setVideo(thumb, videoUrl) {
- var video = document.createElement('video'),
- parent = thumb.parentNode;
- video.controls = false;
- video.loop = true;
- video.muted = true;
- video.preload = 'metadata';
- video.addEventListener('loadedmetadata', function () {
- parent.className = ['video', parent.className].join(' ');
- parent.addEventListener('mouseenter', function () {
- video.play();
- });
- parent.addEventListener('mouseleave', function () {
- video.pause();
- });
- replaceImg(this, thumb);
- }, false);
- video.src = videoUrl;
- }
-
- /* Replace video thumbnails with actual playable video */
- function videoThumb(thumb, parseHTML) {
- parseHTML = parseHTML || false;
- var parent = thumb.parentNode;
-
- GM.xmlHttpRequest({
- method: "GET",
- url: parent.href,
- headers: {
- "Accept": "text/xml"
- },
- onload: function (response) {
- var videoUrl = null;
- if (response.readyState !== 4) return;
- if (!response.responseXML) return;
-
- var file_url = response.responseXML.getElementsByTagName('file_url')[0];
- if (!file_url) return;
-
- videoUrl = file_url.childNodes[0].nodeValue;
- setVideo(thumb, videoUrl);
- }
- });
-
- }
-
- /* Replace image thumbnails with higher resolution */
- function imageThumb(thumb) {
- var newThumb = new Image(),
- replace = function (thumb) {
- thumb.src = this.src;
- if (is_gif(thumb)) {
- //freeze_gif(thumb);
- }
- },
- trynoSample = function (thumb) {
- this.onerror = tryGif.bind(this, thumb);
- this.src = thumb.src.replace('/preview/', '/');
-
- },
- tryGif = function (thumb) {
- this.onerror = null;
- this.src = thumb.src.replace('/preview/', '/').replace('.jpg', '.gif');
- };
- newThumb.onload = replace.bind(newThumb, thumb);
- newThumb.onerror = trynoSample.bind(newThumb, thumb);
- newThumb.src = thumb.src.replace('/preview/', '/sample/');
- }
-
- function imgError(image) {
- image.onerror = "";
- image.src = "/images/noimage.gif";
- return true;
- }
-
- /* Run above on all thumbnails */
- var thumbs = document.querySelectorAll('span.thumb img');
- //var typ=document.querySelectorAll('span.thumb span.type-badge');
- for (i = 0; i < thumbs.length; i++) {
- var thumb = thumbs[i];
- var badge = thumb.parentElement.querySelector("span.type-badge");
- if (badge && badge.innerHTML.toLowerCase() == "webm") {
- (function (thumb, i) {
- setTimeout(function () {
- videoThumb(thumb);
- }, 100 * i);
- })(thumb, i);
- } else {
-
- imageThumb(thumb);
-
- }
- }
- })();