DefSoul / Hive - Send to Hive Index Page

// ==UserScript==
// @name            Hive - Send to Hive Index Page
// @namespace     	https://openuserjs.org/users/DefSoul/scripts
// @description     Allows sending multiple items from index pages to hive
// @version         2.4 > Transfers now go into Videos/# Index # (Can be changed in source config)
// @author          DefSoul
// @include         http*://*
// @include		  	http*://touch.hive.im/account/*
// @include		  	http*://api.hive.im/api/*
// @exclude		 	http*://www.youtube.com/*
// @exclude		 	http*://*.google.com/*
// @exclude		 	http*://*.stripe.com/*
// @exclude		 	http*://*.facebook.com/*
// @exclude		 	http*://facebook.com/*
// @grant		 	GM_getValue
// @grant		 	GM_setValue
// @grant			GM_deleteValue
// @grant			GM_listValues
// @grant		 	GM_log
// @grant		 	GM_xmlhttpRequest
// @grant       	GM_addStyle
// @grant       	GM_getResourceText
// @require      	http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js
// @resource     	toastrCss          http://cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/css/toastr.min.css
// @require      	http://cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/js/toastr.min.js
// @require      	https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.3/jquery-ui.min.js
// @resource     	jQueryUICSS          http://code.jquery.com/ui/1.10.4/themes/ui-lightness/jquery-ui.css
// ==/UserScript==
/*jshint multistr: true */

// CONFIG //
var detectIndexPage = true; // FALSE MEANS IT WILL RUN ON EVERY PAGE
var folderName = "# Index #"; // CASE SENSITIVE
// END CONFIG //

// GLOBALS //
var nameB = "Send to Hive Index Page: Test ";
GM_log(nameB + location.href);
var auth;
var bA;
var postMag = [];
var a = [];
var s;
var origHref = [];
var uploadFolderId;

//auth = "";
//GM_deleteValue("auth");

auth = GM_getValue("auth");
var link;
GM_setValue("ready", "false");

toastr.options = {
  "closeButton": false,
  "debug": false,
  "newestOnTop": false,
  "progressBar": false,
  "positionClass": "toast-bottom-right",
  "preventDuplicates": true,
  "onclick": null,
  "showDuration": "300",
  "hideDuration": "1000",
  "timeOut": "5000",
  "extendedTimeOut": "1000",
  "showEasing": "swing",
  "hideEasing": "linear",
  "showMethod": "fadeIn",
  "hideMethod": "fadeOut"
};

//=========
function log(str, colour){console.log('%c dbg> ' + str, 'background: #D3D3D3; color: ' + colour);} // CUSTOM LOG

var newCSS = GM_getResourceText ("toastrCss");
GM_addStyle(newCSS);

var newCSS2 = GM_getResourceText ("jQueryUICSS");
GM_addStyle(newCSS2);

//=========UNSAFEWINDOW=========//
var bGreasemonkeyServiceDefined	= false;

try {if (typeof Components.interfaces.gmIGreasemonkeyService === "object") {bGreasemonkeyServiceDefined = true;}}
catch (err) {}

if (typeof unsafeWindow === "undefined"  ||  !bGreasemonkeyServiceDefined){
    unsafeWindow = (function(){
		var a = document.createElement('p');
        a.setAttribute ('onclick', 'return window;');
        return a.onclick ();
    })();
}
//

function createFolder(uploadFolderName){
	GM_xmlhttpRequest({ //CROSS DOMAIN POST REQUEST
		"method": "get",
		"url": "https://api.hive.im/api/hive/get/",
		"headers": {  
			'Content-Type': 'application/x-www-form-urlencoded;',
			'Authorization': auth,
			'Client-Type': 'Browser',
			'Client-Version': '0.1',
			'Referer': 'https://touch.hive.im/myfiles/videos',
			'Origin': 'https://touch.hive.im/'
		},
		"onload": function(data){
			var r = data.responseText;
			var json = JSON.parse(r);
			
			for (var i = 0; i < json.data.length; i++){
				var id;
				
				if (json.data[i].title === "Videos"){ // FINDS INITIAL VIDEOS FOLDER ID
					//log("we got a video ova here", "green");	
					
					parentId = json.data[i].parentId;
					id = json.data[i].id;
					
					GM_xmlhttpRequest({ //CROSS DOMAIN POST REQUEST
						"method": "post",
						"url": "https://api.hive.im/api/hive/get-children/",
						"data": "&parentId=" + id + "&limit=1000",
						"headers": {  
							'Content-Type': 'application/x-www-form-urlencoded;',
							'Authorization': auth,
							'Client-Type': 'Browser',
							'Client-Version': '0.1',
							'Referer': 'https://touch.hive.im/',
							'Origin': 'https://touch.hive.im/'
						},
						"onload": function(data){
							var r = data.responseText;
							var json = JSON.parse(r);
							var hasFolderIndex;
							
							Object.keys(json.data).forEach(function(key) {
								//log(json.data[key].title, "blue");
								hasFolderIndex += json.data[key].title;
								
								if (json.data[key].title === uploadFolderName){
									uploadFolderId = json.data[key].id;
									log("<" + uploadFolderName + "> Already exists. " + uploadFolderId, "green");
									//return json.data[key].id;
								}
							});
							
							if (hasFolderIndex.indexOf(uploadFolderName) == -1){ // SEARCHES VIDEOS FOLDER TO SEE IF uploadFolderName EXISTS
								log("does not contain: " + uploadFolderName, "red");
								
								GM_xmlhttpRequest({ //CROSS DOMAIN POST REQUEST
									"method": "post",
									"url": "https://api.hive.im/api/hive/create/",
									"data": "filename=" + uploadFolderName + "&parent=" + id + "&locked=false",
									"headers": {  
										'Content-Type': 'application/x-www-form-urlencoded;',
										'Authorization': auth,
										'Client-Type': 'Browser',
										'Client-Version': '0.1',
										'Referer': 'https://touch.hive.im/',
										'Origin': 'https://touch.hive.im/'
									},
									"onload": function(data){
										var r = data.responseText;
										var json = JSON.parse(r);
										
										uploadFolderId = json.data.id;

										log("Create folder <" + uploadFolderName + "> " + json.data.id);
										return json.data.id;
									}
								});
							}
							else{
								//log("does contain: " + uploadFolderName, "green");
							}
						}
					});
					//log(parentId + "\n" + currentId);
				}
				
				//log(item, "blue");
			}
			
			//log(r, "blue");
		}
	});	
	
}

function cdReq(href, nameT, folderId){
	log("cdReq start: " + href);
	GM_xmlhttpRequest({ //CROSS DOMAIN POST REQUEST
		"method": "post",
		"url": "https://api.hive.im/api/transfer/add/",
		"data": "remoteUrl=" + window.btoa(href) + "&parentId=" + folderId,
		//"data": "remoteUrl=" + window.btoa(href),
		"headers": {  
			'Content-Type': 'application/x-www-form-urlencoded;',
			'Authorization': GM_getValue("auth"),
			'Client-Type': 'Browser',
			'Client-Version': '0.1',
			'Referer': 'https://touch.hive.im/',
			'Origin': 'https://touch.hive.im/'
		},
		"onload": function(data){
			var r = data.responseText;
			var json = JSON.parse(r);
			
			if (json.status === "success"){
				toastr.success(nameT, "Status: " + json.data.status); 
				
				log("========= " + nameT + " success =========", "green");
				log("Job ID: " + json.data.jobId, "blue");
				log("Data Status: " + json.data.status, "blue");
				log("Folder Id: " + folderId, "blue");
				log("", "red");
			}
			else{
				if (json.message === "quotaExceeded"){
					toastr.warning(nameT, "Quota Exceeded");
				}
				else if (json.message === "securityViolation"){
					toastr.error(nameT, "Security Violation");
				}

				log("========= " + nameT + " error =========", "green");
				log("Message: " + json.message, "blue");
				log("", "red");
			}
			
			//log("cdReq >" + data.responseText);
			
			//transferItemsList(); // GO GET ITEMS IN CURRENT TRANSFER LIST
		}
	});	
};

$(document).on("click", "#bntDAll", function(){ // selector click event
	log("bntDALL clicked begin ");
	log("btnDALL: begin " + $(".ui-selected").attr("href")); 
	postMag.length = 0;
	s = "";
	a = $('.ui-selected').map(function(){      //	puts all un-encoded videos ids into an array
		return document.location.href + $(this).attr("href");		// returns an int array of videos id values
	});
	
	origHref = $('.ui-selected').map(function(){      //	puts all un-encoded videos ids into an array
		return $(this).attr("href");		// returns an int array of videos id values
	});

	for (var i = 0; i < a.length; i++){
		s = a[i];
		if (s.indexOf(".avi") 	!== -1 ||
    		s.indexOf(".mp4") 	!== -1 || 
    		s.indexOf(".flp") 	!== -1 || 
    		s.indexOf(".mp3") 	!== -1 || 
    		s.indexOf(".mpg") 	!== -1 || 
    		s.indexOf(".mov") 	!== -1 ||
    		s.indexOf(".mpeg") 	!== -1 ||
    		s.indexOf(".jpg") 	!== -1 ||
    		s.indexOf(".mkv") 	!== -1 ||
    		s.indexOf(".png") 	!== -1 ||
    		s.indexOf(".jpeg") 	!== -1 ||
    		s.indexOf(".wmv") 	!== -1){
			
			log("bntDALL: " + a[i]);
			
			cdReq(a[i], origHref[i], uploadFolderId);
			//log(a[i]);
		}
	}
	log("bntDALL clicked end");
});

function addGlobalStyle(css) {
    var head, style;
    head = document.getElementsByTagName('head')[0];
    if (!head) { return; }
    style = document.createElement('style');
    style.type = 'text/css';
    style.innerHTML = css;
    head.appendChild(style);
}


if (window.top === window.self) {
//=========MAIN WINDOW=========//
	try{
		createFolder(folderName);
		
		bA = $("body h1").html();
		log(bA + nameB + " >body h1");
	}
	catch(err){bA = "";}
	
	if (!$("#iframeHive").length){
		var iframe = document.createElement('iframe');
		iframe.id = "iframeHive";
		iframe.src = "https://touch.hive.im/account/?3";
		iframe.style = "height: 0px; width: 0px; display: none; overflow:hidden";
		document.body.appendChild(iframe);
		
		$("#iframeHive").attr("style", "height: 0px; width: 0px; display: none; overflow:hidden");
		//$("#iframeHive").attr("style", "height: 400px; width: 600px; display: block; overflow:hidden");
		log("iframe created! " + nameB + ": " + location.href);
	}
	
	if (detectIndexPage === true && typeof bA !== "undefined" && bA.indexOf("Index of") !== -1){ // START HERE
		//toastr.info("Connecting to Hive....");
		
		$("body").append('<button type="button" id="bntDAll" title="Send Selected oo Hive" style="height: 2em; width: 12em;">Send Selected to Hive </button>');
		
		$("pre").attr("id", "selectable");
		$("pre").selectable({
			filter: ":not(:contains('/'))",
		});
		
		$("pre a:contains('/')").hover(function() { // HOVER OVER FOLDER
      		$( "pre" ).selectable( "option", "distance", 50000 );
    	});
		
		$("pre a:not(:contains('/'))").hover(function() {
			//$("pre").attr("id", "selectable");
      		$( "pre" ).selectable( "option", "distance", 0 );
    	});
		
		addGlobalStyle("#feedback { font-size: 1.4em; }\
						.ui-selecting { background: #FECA40; }\
						.ui-selected{ background: #F39814; color: white; }\
						#selectable { list-style-type: none; margin: 0; padding: 0; width: 60%; }\
						#selectable li { margin: 3px; padding: 0.4em; font-size: 1.4em; height: 18px; }");
		
		var onceB = 0;
		var onceD = 0;
		setInterval(function(){
			//log("AA: " + auth);
			//log("AA: " + onceB);
			//log("AA: " + GM_getValue("auth"));
			if (onceD === 0 && typeof auth !== "undefined"){
				//GM_setValue("ready", "true");
				//GM_setValue("auth", auth);
				log("OLD: " + auth);
				onceD = 1;
			}
			
			if (onceB === 0 && GM_getValue("ready") == "true"){
				onceB =  1;
				
				auth = GM_getValue("auth");
				log("TRUE: " + GM_getValue("auth"));
				
				$("#iframeHive").remove();
				log("#iframeHive removed");
				
				//toastr.success("Hive Connected!");
				
			}
		}, 250);

		$(document).on("click", "a", function(e){ // selector click event
			var linkA = $(this).attr("href");
			link = document.location.href + $(this).attr("href");
			log(linkA + nameB + " >link");
			if (linkA.indexOf(".avi") !== -1 ||
				linkA.indexOf(".mp4") !== -1 || 
				linkA.indexOf(".flp") !== -1 || 
				linkA.indexOf(".mp3") !== -1 || 
				linkA.indexOf(".mpg") !== -1 || 
				linkA.indexOf(".mov") !== -1 ||
				linkA.indexOf(".mpeg") !== -1 ||
				linkA.indexOf(".jpg") !== -1 ||
				linkA.indexOf(".mkv") !== -1 ||
				linkA.indexOf(".png") !== -1 ||
				linkA.indexOf(".jpeg") !== -1 ||
				linkA.indexOf(".wmv") !== -1) {
				e.preventDefault();
				log(linkA + nameB + " >link");

				log("test >" + link);

				$('body').prepend('<a href="#" class="hive">Hive</a>');
				$(".hive").attr("style", 'display: block;width: 40px;height: 40px;text-indent: -9999px;position: fixed;z-index: 999999;right: 50%;top: 3px;background: url("http://imgh.us/download_4.svg") no-repeat center 50%;border-radius: 30px');
				$(".hive").fadeOut("slow");
				
				cdReq(link, linkA, uploadFolderId);
			}
		});
	}
	else{
		try{
			 $("#bntDAll").remove();
		}
		catch(err){
			log("Could not remove btnDall");	
		}
	}
} 
else 
{
//=========IFRAME WINDOW=========//
	//GM_deleteValue("auth");
	try{
		auth = unsafeWindow.account.token;
	}
	catch(err){}
	
	var once = 0;
	setInterval(function(){ // EVENT FOR WHEN PAGE IS LOADED // RUNS ONCE
		//log($("#username").text() + nameB) + " >username";
		if (once === 0 && $("#username").text().indexOf("My Account") !== -1){
			once = 1;
			log("Iframe ready auth: " + auth);
			log("Iframe ready unsafeWindow.account.token: " + unsafeWindow.account.token);
			
			//if (auth !== unsafeWindow.account.token){
				log("auth !== unsafeWindow.account.token");
				//GM_deleteValue("auth");
				GM_setValue("auth", unsafeWindow.account.token);
				GM_setValue("ready", "true");
			//}
			//else{
				//auth = unsafeWindow.account.token;
				
				//GM_setValue("auth", unsafeWindow.account.token);
				//GM_setValue("ready", "true");
				//log("Iframe Post: ready");
			//}
			
		}
		else if (once === 1 && auth == "undefined"){
			GM_setValue("ready", "false");	
			try{
				//auth = unsafeWindow.account.token;
			}
			catch(err){
				log("iframe: " + err);
			}
		}
	}, 200);
}