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

2015/01/09のページです。最新版はこちら。

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください。
// ==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;
}