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).

Versión del día 9/1/2015. Echa un vistazo a la versión más reciente.

Tendrás que instalar una extensión para tu navegador como Tampermonkey, Greasemonkey o Violentmonkey si quieres utilizar este script.

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

Necesitarás instalar una extensión como Tampermonkey o Violentmonkey para instalar este script.

Necesitarás instalar una extensión como Tampermonkey o Userscripts para instalar este script.

Necesitará instalar una extensión como Tampermonkey para instalar este script.

Necesitarás instalar una extensión para administrar scripts de usuario si quieres instalar este script.

(Ya tengo un administrador de scripts de usuario, déjame instalarlo)

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

(Ya tengo un administrador de estilos de usuario, déjame instalarlo)

// ==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     3.2
// @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);
	
	var inputVideo=document.createElement("input");	
	inputVideo.type="button";
	inputVideo.value="Video URLs";
	inputVideo.onclick = getVideoUrl;
	inputVideo.setAttribute("style","font-size:18px;position:fixed;top:140px;right:20px;z-index:10000;");
	document.body.appendChild(inputVideo);

	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:180px;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();
}
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 = {'Range': 'bytes=0-3000'};
		//load last paginationsite if last is realy true
		GM_xmlhttpRequest({
            method: "get",
            'url': urlwithoutpagenumber+lasttmp,
            headers: $.extend({}, {
                'User-agent': 'Mozilla/4.0',
                'Accept': 'application/atom+xml,application/xml,text/xml',
                '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://thumbs.motherlessmedia.com/thumbs/"]');
				$test.each(function(){
					try{
						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);
				parralelizeTask(siteurls, loopGetSites, "getallimages", function(){
					getImages("getallimages", ids);
					return;
				});
            }
        });
	}, "get", {
			'Range': 'bytes=0-3000' //grab first 3k
	});
	return;
}

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;
		
	}
	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://thumbs.motherlessmedia.com/thumbs/"]');
	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);
				var fs = new findSrc();
				fs.findImgSrc(id[1], function(src){
					$this.text("View full size");
					clearTimeout(timer);
					if(single){
						data = [src];
					} else {
						data.unshift(src);
					}
					fapLog("addSinglePreview: image src: " + src.toSource());
					
					displayOverlay(data, "image");
				});
				return false;
			});
		}	
	});
}

function getImages(buttonname, arrimg) {
	fapLog("getImages: arrimg.length=" + arrimg.length);
	fapLog(arrimg);
	$button = $("input[name*='"+buttonname+"']");
	$button.val("working...");
	if(arrimg.length > 0){
		parralelizeTask(arrimg, loopFindImageSource, buttonname, function(){
			fapLog("getImages: iamgesUrl= " + imagesUrl.toSource());
			arrimg = [];
			displayOverlay(imagesUrl, "images", thisurl);
			imagesUrl = [];
			return;
		});
	}
	fapLog("getImages: last call for return");
	arrimg = [];
	return;
}

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"/mi) ? RegExp.$1 : null;
			if(url){
				cb({url:"http:" + url + ".mp4"});
			}
			return;
		}, "get", {
			'Range': 'bytes=0-3000' //grab first 3k
		});
		return;
	};
	
	this.findImgSrc = function(id, cb){
		var href = "http://motherless.com/"+id+"?full";
		sneakyXHR(href, function(d){
			var img = d.match(/property="og:image" content="([^"]+)"/mi) ? RegExp.$1 : null;
			if(img){
				cb({url:img});
			}
			return;
		}, "get", {
			'Range': 'bytes=0-3000' //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': 'application/atom+xml,application/xml,text/xml',
                '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.screen.width - 50;
	var myheight = window.screen.height - 120;
	var html = "";
	
	fapLog("monitor resolution: " + mywidht + ":" + myheight);
	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:100%; 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": "900px",
        "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 -----

//paralelliiese for getting all sites within pagination 
function loopGetSites(doneTask, value){
	sneakyXHR(value, function(src){
		$firstids = $("<div>"+src+"</div");
		$test=$firstids.find('img[src^="http://thumbs.motherlessmedia.com/thumbs/"]');
		$test.each(function(){
			try{
				var id = $(this).attr("data-strip-src").match("thumbs/([^.]+).\\w");
			}
			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);		
	});
}
//function to parallelize the findImageSource function
function loopFindImageSource(doneTask, value) {
	var fs = new findSrc();
	fs.findImgSrc(value, function(src){
		var i=0;		
		data = [src];
		imagesUrl.push(data[0].url);
		doneTask();
		return;
	});
	return;
}

//helper function for parralelize functions
function parralelizeTask(arr, fn, buttonname, done) {
	fapLog("parralelizeTask: arr= " + arr);
	var total = arr.length;
	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;
}