// ==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.9
// @grant GM.xmlHttpRequest
// @grant GM.setClipboard
// @grant GM.setValue
// @grant GM.getValue
// @grant GM.deleteValue
// @grant 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 = '';
var protocol = document.location.protocol;
// Start the magic
main();
function fapLog(log) {
if (debug === true) {
console.log(log);
return;
}
return;
}
function main() {
fapLog('entered main');
fapLog(protocol);
var turl = thisurl = window.location.href;
var casesn = turl.indexOf('/',7);
var cases = turl.substring(casesn + 1, casesn + 2);
fapLog('main: m= ' + cases + ": :" + turl);
if (cases == "m") {
var uploads = document.createElement('input');
uploads.type = 'button';
uploads.value = 'Uploads';
uploads.name = 'useruploads';
//fapLog('main: entered m= ' + turl);
uploads.onclick = uploss;
uploads.setAttribute('style', 'font-size:18px;position:fixed;top:160px;right:20px;z-index:10000;');
document.body.appendChild(uploads);
}
var inputName = document.createElement('input');
inputName.type = 'text';
inputName.value = '';
inputName.name = 'newname';
inputName.id = 'newname';
//inputName.onclick = getImageList;
inputName.setAttribute('style', 'font-size:16px;position:fixed;top:60px;right:20px;z-index:10000;');
document.body.appendChild(inputName);
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();
if (cases == "u"){
var t = turl.lastIndexOf("/");
var tt = turl.lastIndexOf("?");
if (tt < 1){
tt = turl.length;
}
document.getElementById("newname").value = turl.substring(t+1, tt);
}
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 uploss() {
//alert("Hello! I am an alert box!");
var turl = window.location.href;
var newurl = turl.replace("/m/","/u/");
window.location = newurl;
//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 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) == thisurl) {
fapLog('getAllImages: was processed earlyer!');
fapLog(GM.getValue(url.allsites));
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^="' + protocol + '//cdn5-thumbs.motherlessmedia.com/thumbs/"]');
$test.each(function () {
try {
var id = $(this).attr('data-strip-src').match('thumbs/([^?]+)');
}
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 = protocol +'//motherless.com/GI' + gup + '?page=1';
urlall = protocol +'//motherless.com/GI' + gup;
break;
case 'g':
var g = parthref.substring(casesn + 3, parthref.lenght);
fapLog('getUrl: g= ' + g);
url = protocol +'//motherless.com/gi' + g + '?page=1';
urlall = protocol +'//motherless.com/gi' + g;
break;
case 'u':
var u = parthref.substring(casesn, parthref.lenght);
fapLog('getUrl: u= ' + u);
url = protocol +'//motherless.com' + u + '?t=i&page=1';
urlall = protocol +'//motherless.com' + u;
break;
case 't':
var t = parthref.substring(casesn, parthref.lenght);
fapLog('getUrl: t= ' + t);
url = protocol +'//motherless.com' + t + '?range=0&size=0&sort=relevance&page=1';
urlall = protocol +'//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;
}
// Get url for full image and add url under thumbnail
function addSinglePreview() {
var data = [];
var i = 0;
var imgs = $('img[src^="' + protocol + '//cdn5-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);
var $a = $wrap.closest('a');
var vid = $wrap.attr('src').match('thumbs/([^.]+)');
// test for video preview and not an image
var vlink = vid[1];
var n = vlink.indexOf('-');
fapLog('vlink: ' + vlink);
const regex = new RegExp(/-[s]/i);
if (regex.test(vlink)) {
var videoClicky = $('<a href=\'javascript;\' class=\'p2-single-preview\'><font color="#bb00ff" size="4">View Video</font></a>');
$a.after(videoClicky);
var href = $a.attr('href');
fapLog("HREF video: " + href);
if (typeof href == 'undefined') return;
href = href.match(/\.com\/(\w)(\w+)/) ? [
RegExp.$1,
RegExp.$2
] : false;
videoClicky.click(function (e, single) {
var $this = $(this);
//$this.text('loading...');
var id = $wrap.attr('data-strip-src').match('thumbs/([^.]+)');
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);
data[0] = {url: protocol + "//cdn5-videos.motherlessmedia.com/videos/" + id[1] +".mp4?fs=opencloud"}
fapLog('addSinglePreview: video src: ' + data.toString());
displayOverlay(data, 'video');
//$this.text('View Video');
//clearTimeout(timer);
return false;
});
}
else {
try {
var id = $wrap.attr('data-strip-src').match('thumbs/([^?]+)');
}
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\'><font color="#5500ff" size="4">View</font></a>');
$a.after(imageClicky);
href = $a.attr('href');
fapLog("HREF image: " + href);
if (typeof href == 'undefined') return;
href = href.match(/\.com\/(\w)(\w+)/) ? [
RegExp.$1,
RegExp.$2
] : false;
imageClicky.click(function (e, single) {
var $this = $(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: protocol + "//cdn5-images.motherlessmedia.com/images/" + id[1] +"?fs=opencloud"}
fapLog('addSinglePreview: image src: ' + data.toString());
displayOverlay(data, 'image');
//$this.text('View');
//clearTimeout(timer);
return false;
});
}
});
}
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(protocol + "//cdn5-images.motherlessmedia.com/images/" + value +"?fs=opencloud");
});
displayOverlay(imagesUrl, 'images', thisurl);
$('input[name*=\'stopvalue\']').remove();
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;
}
//-- handler for Overlay (jquery)
function removeOverlay() {
$('#overlay').remove();
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><div id="close"><img src=\'' + data[0].url + '\' style=\'width:auto; hight:auto; max-height:' + myheight + 'px; max-width:' + mywidht + 'px\'></div></td></tr></tbody></table>';
break;
case 'video':
html = '<table id=\'overlay\'><tbody><tr><td><video src="'+ data[0].url +'" type="video/mp4" controls></video><br><a href=\'' + data[0].url + '\'>Video Link</a><br><br><div id="close">Close</div></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');
var newname = document.getElementById("newname").value;
html = '<table id=\'overlay\'><tbody><tr><td><br><div id="close">Close</div>';
data.forEach(function (value) {
var extension = value.substr(value.lastIndexOf('.')+1, 3);
html += '<a class=\'changeColorLink\' href=\'' + value + '\' download= '+ newname + count + '.' + extension +' >link ' + count + '</a> ';
clipboard += value + ' \n';
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.toString());
setTimeout(function () {
var $el = $(html).css({
'overlay':'before',
'position': 'fixed',
'top': 0,
'left': 0,
'width': '90%',
'height': '100%',
'background-color': 'rgba(0,0,0,.7)',
'z-index': 300000,
'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');
$("#close").click(function () {
fapLog("BUTTON CLICK");
if ($('#overlay').length > 0) {
removeOverlay();
return;
}
});
}, 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^="' + protocol +'//cdn5-thumbs.motherlessmedia.com/thumbs/"]');
$test.each(function () {
try {
var id = $(this).attr('data-strip-src').match('thumbs/([^?]+)');
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);
}