Hive - Send to Hive Index Page

Allows sending multiple items from index pages to hive

Versão de: 23/06/2015. Veja: a última versão.

Você precisará instalar uma extensão como Tampermonkey, Greasemonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Userscripts para instalar este script.

Você precisará instalar uma extensão como o Tampermonkey para instalar este script.

Você precisará instalar um gerenciador de scripts de usuário para instalar este script.

(Eu já tenho um gerenciador de scripts de usuário, me deixe instalá-lo!)

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

(Eu já possuo um gerenciador de estilos de usuário, me deixar fazer a instalação!)

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