Sleazy Fork is available in English.

FapFun

Userscript for Motherless.com. Provide direct links for pictures and video files. Download all Images on one site with DownThemAll(firefox) or Download Master(Chrome).

Version vom 16.05.2016. Aktuellste Version

// ==UserScript==
// @name            FapFun
// @namespace   	https://greasyfork.org/scripts/7156-fapfun/code/FapFun.user.js
// @description 	Userscript for Motherless.com. Provide direct links for pictures and video files. Download all Images on one site with DownThemAll(firefox) or Download Master(Chrome).
// @require			https://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.min.js
// @include         htt*://motherless.com*
// @version         4.0
// @grant           GM_xmlhttpRequest
// @grant           GM_setClipboard
// @grant           GM_setValue
// @grant           GM_getValue
// @grant           GM_deleteValue
// @grand           UnsafeWindow
// @author          sodomgomora
// @license         GPLv3
// ==/UserScript==
// Some of this script based on Pornifier2 script by Jesscold 
// This script is realesed under GPL v3
// Globals
var debug = false;
var images = [];
var ids = [];
var imagesUrl = [];
var siteurls = [];
var thisurl = '';
// Start the magic
main();
function fapLog(log) {
    if (debug === true) {
        console.log(log);
        return;
    }
    return;
}
function main() {
    fapLog('entered main');
    // try to become Premium
    // setTimeout(function(){
    // unsafeWindow.__is_premium = true; //really motherless?
    // }, 500);
    thisurl = window.location.href;
    var inputList = document.createElement('input');
    inputList.type = 'button';
    inputList.value = 'Images URLs';
    inputList.name = 'imagesurl';
    inputList.onclick = getImageList;
    inputList.setAttribute('style', 'font-size:18px;position:fixed;top:100px;right:20px;z-index:10000;');
    document.body.appendChild(inputList);
    addSinglePreview();
    checkForPaginationLinks(function (hasOne) {
        fapLog('main: haseOne= ' + hasOne);
        if (hasOne > 0) {
            var inputAllImages = document.createElement('input');
            inputAllImages.type = 'button';
            inputAllImages.value = 'Get all Images';
            inputAllImages.name = 'getallimages';
            inputAllImages.onclick = getAllImages;
            inputAllImages.setAttribute('style', 'font-size:18px;position:fixed;top:140px;right:20px;z-index:10000;');
            document.body.appendChild(inputAllImages);
        }
        return;
    });
    return;
}
function addResetButton() {
    var resetButton = document.createElement('input');
    resetButton.type = 'button';
    resetButton.value = 'Reset';
    resetButton.name = 'deletevalue';
    resetButton.onclick = deleteGMValue;
    resetButton.setAttribute('style', 'font-size:18px;position:fixed;top:220px;right:20px;z-index:10000;');
    document.body.appendChild(resetButton);
    return;
}
function checkForPaginationLinks(cb) {
    var ret = '';
    ret = $('.pagination_link').contents().text();
    fapLog('checkForPaginationLinks: entered!');
    fapLog('checkForPaginationLinks: ret= ' + ret);
    if (ret === '') {
        cb(0);
        return;
    } else {
        cb(1);
        return;
    }
}
//----- Button onclick functions -----

function deleteGMValue() {
    fapLog('deleteGMValue: thisurl= ' + thisurl);
    GM_deleteValue(thisurl);
    $('input[name*=\'deletevalue\']').remove();
    $('input[name*=\'stopvalue\']').remove();
}
function getAllImagesJPG() {
	
}
function getAllImages() {
    var href = '';
    var lasttmp = 0;
    ids = [
    ];
    href = window.location.href;
    href = href.replace(/^(http|https):\/\//i, '');
    fapLog('getAllImages: href= ' + href);
    var url = getUrl(href);
    if (GM_getValue(url.allsites) != undefined) {
        fapLog('getAllImages: was processed earlyer!');
        addResetButton();
        displayOverlay(imagesUrl, 'lasti', url.allsites);
        thisurl = url.allsites;
        return;
    }
    thisurl = url.allsites;
    sneakyXHR(url.onesite, function (src) {
        fapLog('getAllImages: callback from sneakyXHR = ' + src);
        var urlwithoutpagenumber = url.onesite.substring(0, url.onesite.length - 1);
        $firstids = $('<div>' + src + '</div');
        $firstsite = $('<div>' + src + '</div').find('.pagination_link a');
        fapLog($firstsite);
        $firstsite.each(function () {
            var tmp = parseInt($(this).text());
            if (tmp > lasttmp) {
                lasttmp = tmp;
            }
        });
        var headers = {
			'Accept': 'text/xml',
            'Range': 'bytes=0-300'
        };
        //load last paginationsite if last is realy true
        GM_xmlhttpRequest({
            method: 'get',
            'url': urlwithoutpagenumber + lasttmp,
            headers: $.extend({
            }, {
                'User-agent': 'Mozilla/4.0',
                'Accept': 'text/xml',
				'Range': 'bytes=0-300',
                'Cookie': document.cookie
            }, headers || {
            }),
            onload: function (responseDetails) {
                var lastsitetmp = 1;
                var text = responseDetails.responseText;
                $lastsite = $('<div>' + text + '</div').find('.pagination_link a');
                fapLog($lastsite);
                $lastsite.each(function () {
                    var tmp = parseInt($(this).text());
                    if (tmp > lastsitetmp) {
                        lastsitetmp = tmp;
                    }
                });
                fapLog('getAllImages: lasttmp= ' + lasttmp + ' lastsitetmp=' + lastsitetmp);
                if (lasttmp < lastsitetmp) {
                    lasttmp = lastsitetmp;
                }
                $test = $firstids.find('img[src^="http://cdn4.thumbs.motherlessmedia.com/thumbs/"]');
                $test.each(function () {
                    try {
						//new version 4.0 change . to ?
                        var id = $(this).attr('data-strip-src').match('thumbs/([^?]+).\\w');
                    }
                    catch (err) {
                        return;
                    }
                    ids.push(id[1]);
                });
                fapLog('getAllImages: lasttmp= ' + lasttmp);
                //paginationsite shown but has no link
                if (lasttmp == 0) {
                    getImages('getallimages', ids);
                    return;
                }
                var urlwithoutpagenumber = url.onesite.substring(0, url.onesite.length - 1);
                for (var i = 2; i < lasttmp + 1; i++) {
                    var lenght = siteurls.push(urlwithoutpagenumber + i);
                }
                fapLog('getAllImages: siteURLs= ' + siteurls);
                addStop();
                parralelizeTask(siteurls, loopGetSites, 'getallimages', function () {
                    getImages('getallimages', ids);
					ids = [];
                    return;
                });
            }
        });
    }, 'get', {
		'Accept': 'text/xml',
        'Range': 'bytes=0-300' //grab first 3k
    });
    return;
}
// retrun URLs for user,group,galleries and search page
function getUrl(href) {
    var url = '';
    var urlall = '';
    var parthref = '';
    var n = href.indexOf('?');
    if (n != -1) {
        parthref = href.substring(0, n);
    } else {
        parthref = href;
    }
    fapLog('getUrl: parthref= ' + parthref);
    var casesn = parthref.indexOf('/');
    var cases = parthref.substring(casesn + 1, casesn + 2);
    fapLog('getUrl: cases= ' + cases);
    switch (cases) {
        case 'G':
            var gup = parthref.substring(casesn + 3, parthref.lenght);
            fapLog('getUrl: gup= ' + gup);
            url = 'http://motherless.com/GI' + gup + '?page=1';
            urlall = 'http://motherless.com/GI' + gup;
            break;
        case 'g':
            var g = parthref.substring(casesn + 3, parthref.lenght);
            fapLog('getUrl: g= ' + g);
            url = 'http://motherless.com/gi' + g + '?page=1';
            urlall = 'http://motherless.com/gi' + g;
            break;
        case 'u':
            var u = parthref.substring(casesn, parthref.lenght);
            fapLog('getUrl: u= ' + u);
            url = 'http://motherless.com' + u + '?t=i&page=1';
            urlall = 'http://motherless.com' + u;
            break;
        case 't':
            var t = parthref.substring(casesn, parthref.lenght);
            fapLog('getUrl: t= ' + t);
            url = 'http://motherless.com' + t + '?range=0&size=0&sort=relevance&page=1';
            urlall = 'http://motherless.com' + t;
            break;
    }
    return {
        onesite: url,
        allsites: urlall
    };
}
function getImageList() {
    fapLog('getImageList: pressed');
    thisurl = window.location.href;
    if (thisurl.indexOf('?') == -1) {
        thisurl = thisurl + '?page=1';
    }
    if (GM_getValue(thisurl) != undefined) {
        addResetButton();
        displayOverlay(data = [], 'lasti', thisurl);
        return false;
    }
    getImages('imagesurl', images);
    return;
}
function getVideoUrl() {
    alert('not jet implemented!');
    return;
}
//-- handler for Overlay (jquery)

$(function () {
    $('body').click(function () {
        if ($('#overlay').length > 0) {
            removeOverlay();
            return;
        }
    });
    return;
});
function removeOverlay() {
    $('#overlay').remove();
    return;
}
// Get url for full image and add url under thumbnail

function addSinglePreview() {
    var data = [];
    var i = 0;
    var imgs = $('img[src^="http://cdn4.thumbs.motherlessmedia.com/thumbs/"]');
    if (typeof unsafeWindow.__fileurl != "undefined") {
        fapLog('Script url found: ' + unsafeWindow.__fileurl);
        var $wrap = $('.media-action-networks');
        fapLog('TEst' + $wrap.toSource());
        var videourl = $('<strong>Video URL: </strong><a href=\'' + unsafeWindow.__fileurl + '\' class=\'pop\'>Download</a>');
        $wrap.after(videourl);
    }
    fapLog('image urls found: ' + imgs.length);
    imgs.each(function () {
        var $wrap = $(this);
        if ($wrap.data('p2-preview')) {
            return;
        }
        $wrap.data('p2-preview', 'yep');
        var $a = $wrap.closest('a');
        var vid = $wrap.attr('src').match('thumbs/([^.]+).\\w');
        // test for video preview and not an image
        var vlink = vid[1];
        var n = vlink.indexOf('-');
        vlink = vlink.substring(n, vlink.length);
        fapLog('vlink: ' + vlink);
        // is a video
        if (vlink == '-small') {
            var videoClicky = $('<a href=\'javascript;\' class=\'p2-single-preview\'>Video URL</a>');
            $a.after(videoClicky);
            var href = $a.attr('href').match(/\.com\/(\w)(\w+)/) ? [
              RegExp.$1,
              RegExp.$2
            ] : false;
            videoClicky.click(function (e, single) {
                var $this = $currentSingle = $(this);
                $this.text('loading...');
                var id = $wrap.attr('data-strip-src').match('thumbs/([^.]+).\\w');
                var vl = id[1];
                var n = vl.indexOf('-');
                id[1] = vl.substring(0, n);
                fapLog('addSinglePreview: found url for video: ' + id[1]);
                if (!id) {
                    $this.text('cant load :P');
                    return;
                }
                var timer = setTimeout(function () {
                    $this.text('cant load :P');
                }, 8000);
                var fs = new findSrc();
                fs.findVideoSrc(id[1], function (src) {
                    $this.text('Show Video');
                    clearTimeout(timer);
                    if (single) {
                        data = [src];
                    } else {
                        data.unshift(src);
                    }
                    fapLog('addSinglePreview: video src: ' + src.toSource());
                    displayOverlay(data, 'video');
                });
                return false;
            });
        }
        else {
            try {
                var id = $wrap.attr('data-strip-src').match('thumbs/([^?]+).\\w');
            }
            catch (err) {
                fapLog(err.message);
                return;
            }
            images[i] = id[1];
            i++;
            fapLog('fill images: image=' + images[i - 1] + ' index=' + i);
            var imageClicky = $('<a href=\'javascript;\' class=\'p2-single-preview\'>View full size</a>');
            $a.after(imageClicky);
            var href = $a.attr('href').match(/\.com\/(\w)(\w+)/) ? [
              RegExp.$1,
              RegExp.$2
            ] : false;
            imageClicky.click(function (e, single) {
                var $this = $currentSingle = $(this);
                $this.text('loading...');
                fapLog('found url for image: ' + id[1]);
                if (!id) {
                    $this.text('cant load :P');
                    return;
                }
                var timer = setTimeout(function () {
                    $this.text('cant load :P');
                }, 8000);
				data[0] = {url: "http://cdn4.images.motherlessmedia.com/images/" + id[1] +"?fs=opencloud"}
				fapLog('addSinglePreview: image src: ' + data.toSource());
				displayOverlay(data, 'image');
				$this.text('View full size');
                clearTimeout(timer);
                return false;
            });
        }
    });
}
//New function in 4.0
function getImages(buttonname, arrimg)
{
	fapLog('getImagesJPG: arrimg.length=' + arrimg.length);
    fapLog(arrimg);
    $button = $('input[name*=\'' + buttonname + '\']');
    $button.val('working...');
	arrimg.forEach( function (value) {
		imagesUrl.push("http://cdn4.images.motherlessmedia.com/images/" + value +"?fs=opencloud");
	});
	displayOverlay(imagesUrl, 'images', thisurl);
	$('input[name*=\'stopvalue\']').remove();
	return;
}
//end new
function findSrc() {
    this.findVideoSrc = function (id, cb) {
        var href = 'http://motherless.com/' + id;
        sneakyXHR(href, function (d) {
            fapLog('sneaky request all: ' + d.toSource());
			var url = d.match(/http:([^"]*).mp4/m) ? RegExp.$1 : " ";
			fapLog('findVideoSrc: ' + url);
            
            if (url) {
                cb({
					url: 'http:' + url + '.mp4'
                });
            }
            return;
        }, 'get', {
			'Accept': 'text/xml',
            'Range': 'bytes=0-300' //grab first 3k
        });
        return;
    };
}
function sneakyXHR(url, cb, method, headers) {
    method = method || 'GET';
    fapLog('sneaky requesting: ' + url);
    setTimeout(function () {
        GM_xmlhttpRequest({
            method: method,
            url: url,
            headers: $.extend({
            }, {
                'User-agent': 'Mozilla/4.0',
                'Accept': 'text/xml',
				'Range': 'bytes=0-300',
                'Cookie': document.cookie
            }, headers || {
            }),
            onload: function (responseDetails) {
                var text = responseDetails.responseText;
                cb(text, responseDetails);
            }
        });
    }, 1);
    return;
}
// show the full image as overlay and shrink it to screen resolution

function displayOverlay(data, type, url) {
    var mywidht = window.innerWidth;
    var myheight = window.innerHeight;
    var html = '';
    fapLog('monitor resolution: ' + window.innerWidth + ':' + window.innerHeight);
    switch (type) {
        case 'lasti':
            fapLog('displayOverlay: lasti: url= ' + url);
            html = GM_getValue(url);
            GM_setClipboard(GM_getValue(url + 'clipboard'));
            break;
        case 'image':
            html = '<table id=\'overlay\'><tbody><tr><td><img src=\'' + data[0].url + '\' style=\'width:auto; hight:auto; max-height:' + myheight + 'px; max-width:' + mywidht + 'px\'></td></tr></tbody></table>';
            break;
        case 'video':
            html = '<table id=\'overlay\'><tbody><tr><td><a href=\'' + data[0].url + '\'>Video Link</a></td></tr></tbody></table>';
            break;
        case 'images':
            var clipboard = '';
            var count = 1;
            $('input[name*=\'getallimages\']').val('Get all Images');
            $('input[name*=\'imagesurl\']').val('Images URLs');
            html = '<table id=\'overlay\'><tbody><tr><td>';
            data.forEach(function (value) {
                html += '<a class=\'changeColorLink\' href=\'' + value + '\'>link ' + count + '</a> ';
                clipboard += value + ' ';
                count++;
            });
            html += '</td></tr></tbody></table>';
            GM_setClipboard(clipboard);
            GM_setValue(url, html.toString());
            GM_setValue(url + 'clipboard', clipboard.toString());
            break;
    }
    fapLog('displayOverlay: type= ' + type + ': html=' + html.toSource());
    setTimeout(function () {
        var $el = $(html).css({
            'position': 'fixed',
            'top': 0,
            'left': 0,
            'width': '90%',
            'height': '100%',
            'background-color': 'rgba(0,0,0,.7)',
            'z-index': 10000,
            'vertical-align': 'middle',
            'text-align': 'center',
            'color': '#fff',
            'font-size': '30px',
            'font-weight': 'bold',
            'overflow': 'hidden',
            'cursor': 'auto'
        });
        $('a.changeColorLink', $el).hover(function () {
            $(this).css('color', 'blue');
        }, function () {
            $(this).css('color', 'pink');
        });
        $el.appendTo('body');
    }, 50);
    return;
}
//----- PARALELLIZISE -----
//paralellize for getting all sites within pagination 

function loopGetSites(doneTask, value) {
	var timeout = setTimeout(function (){
		fapLog("Timeout is called");
		doneTask();
	}, 120000);
    sneakyXHR(value, function (src) {
		clearTimeout(timeout);
        $firstids = $('<div>' + src + '</div');
        $test = $firstids.find('img[src^="http://cdn4.thumbs.motherlessmedia.com/thumbs/"]');
        $test.each(function () {
            try {
				//Test for 4.0
				var id = $(this).attr('data-strip-src').match('thumbs/([^?]+).\\w');
				//end test
                //var id = $(this).attr('data-strip-src').match('thumbs/([^.]+).\\w');
				fapLog(id[1]);
            }
            catch (err) {
                fapLog(err.message);
                return;
            }
            if (id[1].lastIndexOf('-strip') != -1) {
                fapLog('loopGetSites: Falsche parameter. Enthält -strip');
                return;
            }
            ids.push(id[1]);
            return;
        });
        doneTask();
        return;
    }, 'get', {
        'Range': 'bytes=0-3000' //grab first 3k);		
    });
}
//helper function for parralelize functions

function parralelizeTask(arr, fn, buttonname, done) {
    fapLog('parralelizeTask: arr= ' + arr);
    var total = arr.length;
    var maxtotal = total;
	
    fapLog('parralelizeTask: arr.length= ' + total);
    doneTask = function () {
        if (--total === 0) {
            done();
            return;
        }
        $('input[name*=\'' + buttonname + '\']').val('processed:' + total);
        return;
    };
    arr.forEach(function (value) {
        fn(doneTask, value);
    });
    return;
}

function addStop() {
    var stopButton = document.createElement('input');
    stopButton.type = 'button';
    stopButton.value = 'Stop';
    stopButton.name = 'stopvalue';
    stopButton.onclick = stop;
    stopButton.setAttribute('style', 'font-size:18px;position:fixed;top:260px;right:20px;z-index:10000;');
    document.body.appendChild(stopButton);
    return;
}

function stop() {
    displayOverlay(imagesUrl, 'images', thisurl);
}