Powerfap

Adds full screen lightbox feature (with preloading) for imagefap galleries. Just click on image thumbnail from the category or homepage.

目前為 2019-05-10 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         Powerfap
// @namespace    http://tampermonkey.net/
// @version      0.3
// @description  Adds full screen lightbox feature (with preloading) for imagefap galleries. Just click on image thumbnail from the category or homepage. 
// @author       Alekc
// @match        https://www.imagefap.com/*
// @require      https://cdn.jsdelivr.net/npm/[email protected]/src/simpleLightbox.min.js
// @grant        none
// ==/UserScript==

const css_lightbox = `
.slbOverlay, .slbWrapOuter, .slbWrap {
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
}

.slbOverlay {
overflow: hidden;
z-index: 2000;
background-color: #000;
opacity: 0.7;
-webkit-animation: slbOverlay 0.5s;
-moz-animation: slbOverlay 0.5s;
animation: slbOverlay 0.5s;
}

.slbWrapOuter {
overflow-x: hidden;
overflow-y: auto;
z-index: 2010;
}

.slbWrap {
position: absolute;
text-align: center;
}

.slbWrap:before {
content: "";
display: inline-block;
height: 100%;
vertical-align: middle;
}

.slbContentOuter {
position: relative;
display: inline-block;
vertical-align: middle;
margin: 0px auto;
padding: 0 1em;
box-sizing: border-box;
z-index: 2020;
text-align: left;
max-width: 100%;
}

.slbContentEl .slbContentOuter {
padding: 5em 1em;
}

.slbContent {
position: relative;
}

.slbContentEl .slbContent {
-webkit-animation: slbEnter 0.3s;
-moz-animation: slbEnter 0.3s;
animation: slbEnter 0.3s;
background-color: #fff;
box-shadow: 0 0.2em 1em rgba(0, 0, 0, 0.4);
}

.slbImageWrap {
-webkit-animation: slbEnter 0.3s;
-moz-animation: slbEnter 0.3s;
animation: slbEnter 0.3s;
position: relative;
}

.slbImageWrap:after {
content: "";
position: absolute;
left: 0;
right: 0;
top: 5em;
bottom: 5em;
display: block;
z-index: -1;
box-shadow: 0 0.2em 1em rgba(0, 0, 0, 0.6);
background-color: #FFF;
}

.slbDirectionNext .slbImageWrap {
-webkit-animation: slbEnterNext 0.4s;
-moz-animation: slbEnterNext 0.4s;
animation: slbEnterNext 0.4s;
}

.slbDirectionPrev .slbImageWrap {
-webkit-animation: slbEnterPrev 0.4s;
-moz-animation: slbEnterPrev 0.4s;
animation: slbEnterPrev 0.4s;
}

.slbImage {
width: auto;
max-width: 100%;
height: auto;
display: block;
line-height: 0;
box-sizing: border-box;
padding: 5em 0;
margin: 0 auto;
}

.slbCaption {
display: inline-block;
max-width: 100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
word-wrap: normal;
font-size: 1.4em;
position: absolute;
left: 0;
right: 0;
bottom: 0;
padding: 0.71429em 0;
color: #fff;
color: rgba(255, 255, 255, 0.7);
text-align: center;
}

.slbCloseBtn, .slbArrow {
margin: 0;
padding: 0;
border: 0;
cursor: pointer;
background: none;
}

.slbCloseBtn::-moz-focus-inner, .slbArrow::-moz-focus-inner {
padding: 0;
border: 0;
}

.slbCloseBtn:hover, .slbArrow:hover {
opacity: 0.5;
}

.slbCloseBtn:active, .slbArrow:active {
opacity: 0.8;
}

.slbCloseBtn {
-webkit-animation: slbEnter 0.3s;
-moz-animation: slbEnter 0.3s;
animation: slbEnter 0.3s;
font-size: 3em;
width: 1.66667em;
height: 1.66667em;
line-height: 1.66667em;
position: absolute;
right: -0.33333em;
top: 0;
color: #fff;
color: rgba(255, 255, 255, 0.7);
text-align: center;
}

.slbLoading .slbCloseBtn {
display: none;
}

.slbLoadingText {
font-size: 1.4em;
color: #fff;
color: rgba(255, 255, 255, 0.9);
}

.slbArrows {
position: fixed;
top: 50%;
left: 0;
right: 0;
}

.slbLoading .slbArrows {
display: none;
}

.slbArrow {
position: absolute;
top: 50%;
margin-top: -5em;
width: 5em;
height: 10em;
opacity: 0.7;
text-indent: -999em;
overflow: hidden;
}

.slbArrow:before {
content: "";
position: absolute;
top: 50%;
left: 50%;
margin: -0.8em 0 0 -0.8em;
border: 0.8em solid transparent;
}

.slbArrow.next {
right: 0;
}

.slbArrow.next:before {
border-left-color: #fff;
}

.slbArrow.prev {
left: 0;
}

.slbArrow.prev:before {
border-right-color: #fff;
}

.slbIframeCont {
width: 80em;
height: 0;
overflow: hidden;
padding-top: 56.25%;
margin: 5em 0;
}

.slbIframe {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
box-shadow: 0 0.2em 1em rgba(0, 0, 0, 0.6);
background: #000;
}

@-webkit-keyframes slbOverlay {
from {
opacity: 0;
}
to {
opacity: 0.7;
}
}

@-moz-keyframes slbOverlay {
from {
opacity: 0;
}
to {
opacity: 0.7;
}
}

@keyframes slbOverlay {
from {
opacity: 0;
}
to {
opacity: 0.7;
}
}

@-webkit-keyframes slbEnter {
from {
opacity: 0;
-webkit-transform: translate3d(0, -1em, 0);
}
to {
opacity: 1;
-webkit-transform: translate3d(0, 0, 0);
}
}

@-moz-keyframes slbEnter {
from {
opacity: 0;
-moz-transform: translate3d(0, -1em, 0);
}
to {
opacity: 1;
-moz-transform: translate3d(0, 0, 0);
}
}

@keyframes slbEnter {
from {
opacity: 0;
-webkit-transform: translate3d(0, -1em, 0);
-moz-transform: translate3d(0, -1em, 0);
-ms-transform: translate3d(0, -1em, 0);
-o-transform: translate3d(0, -1em, 0);
transform: translate3d(0, -1em, 0);
}
to {
opacity: 1;
-webkit-transform: translate3d(0, 0, 0);
-moz-transform: translate3d(0, 0, 0);
-ms-transform: translate3d(0, 0, 0);
-o-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);
}
}

@-webkit-keyframes slbEnterNext {
from {
opacity: 0;
-webkit-transform: translate3d(4em, 0, 0);
}
to {
opacity: 1;
-webkit-transform: translate3d(0, 0, 0);
}
}

@-moz-keyframes slbEnterNext {
from {
opacity: 0;
-moz-transform: translate3d(4em, 0, 0);
}
to {
opacity: 1;
-moz-transform: translate3d(0, 0, 0);
}
}

@keyframes slbEnterNext {
from {
opacity: 0;
-webkit-transform: translate3d(4em, 0, 0);
-moz-transform: translate3d(4em, 0, 0);
-ms-transform: translate3d(4em, 0, 0);
-o-transform: translate3d(4em, 0, 0);
transform: translate3d(4em, 0, 0);
}
to {
opacity: 1;
-webkit-transform: translate3d(0, 0, 0);
-moz-transform: translate3d(0, 0, 0);
-ms-transform: translate3d(0, 0, 0);
-o-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);
}
}

@-webkit-keyframes slbEnterPrev {
from {
opacity: 0;
-webkit-transform: translate3d(-4em, 0, 0);
}
to {
opacity: 1;
-webkit-transform: translate3d(0, 0, 0);
}
}

@-moz-keyframes slbEnterPrev {
from {
opacity: 0;
-moz-transform: translate3d(-4em, 0, 0);
}
to {
opacity: 1;
-moz-transform: translate3d(0, 0, 0);
}
}

@keyframes slbEnterPrev {
from {
opacity: 0;
-webkit-transform: translate3d(-4em, 0, 0);
-moz-transform: translate3d(-4em, 0, 0);
-ms-transform: translate3d(-4em, 0, 0);
-o-transform: translate3d(-4em, 0, 0);
transform: translate3d(-4em, 0, 0);
}
to {
opacity: 1;
-webkit-transform: translate3d(0, 0, 0);
-moz-transform: translate3d(0, 0, 0);
-ms-transform: translate3d(0, 0, 0);
-o-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);
}
}
.lds-ellipsis {
display: inline-block;
position: relative;
width: 64px;
height: 64px;
}
.lds-ellipsis div {
position: absolute;
top: 27px;
width: 11px;
height: 11px;
border-radius: 50%;
background: #fff;
animation-timing-function: cubic-bezier(0, 1, 1, 0);
}
.lds-ellipsis div:nth-child(1) {
left: 6px;
animation: lds-ellipsis1 0.6s infinite;
}
.lds-ellipsis div:nth-child(2) {
left: 6px;
animation: lds-ellipsis2 0.6s infinite;
}
.lds-ellipsis div:nth-child(3) {
left: 26px;
animation: lds-ellipsis2 0.6s infinite;
}
.lds-ellipsis div:nth-child(4) {
left: 45px;
animation: lds-ellipsis3 0.6s infinite;
}
@keyframes lds-ellipsis1 {
0% {
transform: scale(0);
}
100% {
transform: scale(1);
}
}
@keyframes lds-ellipsis3 {
0% {
transform: scale(1);
}
100% {
transform: scale(0);
}
}
@keyframes lds-ellipsis2 {
0% {
transform: translate(0, 0);
}
100% {
transform: translate(19px, 0);
}
}
#overlay {

display:none;
}
#overlay .lds-ellipsis {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
`;

const loadingSplashScreenHtml = `<div id='overlay' class="slbOverlay"><div class="lds-ellipsis"><div></div><div></div><div></div><div></div></div></div>`
var $ = window.$;
const galRegex = /\/photo\/(\d+)/m;
const homeRegex = /image\.php\?id=(\d+)/m;

var preloadedImages = [];
var lightBox;
(function() {
    'use strict';

    //prepare lightBox
    $("body").append("<style>" + css_lightbox + "</style>" + loadingSplashScreenHtml);

    //link from category page
    $("img.gal_thumb").parent("a").click(function(){
        event.preventDefault();
        showOverlay();
        var match = galRegex.exec($(this).attr("href"));
        if (match == null){
            alert("can't find photo id");
            return;
        }


        var galId = $(this).closest("tr[valign='top']").prev().attr("id");
        var photoId = match[1];
        run(photoId, galId,[]);
    });

    $('a[href*="image.php?id="]').click(function(){
        event.preventDefault();
        showOverlay();
        var match = homeRegex.exec($(this).attr("href"));
        if (match == null){
            alert("can't find photo id");
            return;
        }

        var galId = $(this).closest("tr:not([bgcolor])").prev().attr("id");
        var photoId = match[1];
        run(photoId, galId,[]);
    });
    //
})();

function showOverlay(){
    $("#overlay").show();
}
function hideOverlay(){
    $("#overlay").hide();
}
function run(photoId, galId, result){
    var url = "https://www.imagefap.com/photo/"+ photoId +"/?gid=" + galId + "&idx=" + result.length + "&partial=true";
    $.ajax({
        url: url,
        type: "GET",
        dataType: "html",
        success: function(data) {
            var newLinks = [];
            $(data).find("a").each(function(){
                newLinks.push($(this).attr("href"));
            });
            result = result.concat(newLinks);
            if (newLinks.length == 0 || newLinks.length < 24) {
                //todo: generate library
                generateLightBox(result);
                return;
            }
            run(photoId, galId, result);
        },
        error: function(jqXHR, textStatus,errorThrown ){
            alert("Error: "+ textStatus + " (" + errorThrown + ")");
            hideOverlay();
        }
    });
}

function generateLightBox(result){
    lightBox = SimpleLightbox.open({
        items: result
    });

    //$(lightBox.$content).parent().find("button.next").click(preloadNextSlide);
    lightBox.next = function (event){
        this.showPosition(this.currentPosition + 1);
        var preloadCount = 5;
        if (this.currentPosition + preloadCount <= this.items.length){
            preloadImage(this.items[this.currentPosition + preloadCount]);
        }
    }
    //preload first x
    for (var i = 1; i<6;i++){
        preloadImage(result[i]);
    }
    hideOverlay();
    lightBox.show();
}
function preloadImage(href){
    if (href === 'undefined' || typeof(preloadedImages[href]) !== 'undefined'){
        return;
    }
    preloadedImages[href] = new Image();
    preloadedImages[href].src = href;
}