Hive - Send to Hive Index Page

Allows sending multiple items from index pages to hive

Ekde 2015/06/23. Vidu La ĝisdata versio.

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

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

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

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

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

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==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);
}