Hive - YouTube to Hive / Local Download

Inserts a download button on YouTube video pages and sends to hive -Major fixes

当前为 2015-06-23 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

/** YouTube link resolving Originally written by angelsl
 With contributions from Manish Burman http://mburman.com
 With contributions from LouCypher https://github.com/LouCypher

 YTGrab is distributed under the GNU LGPL v3 or later and comes with no warranty.
 Full preamble at https://github.com/angelsl/misc-Scripts/blob/master/Greasemonkey/LICENSE.md#ytgrab

//===========DS===========//
 This is a DefSoul MOD for use with hive. All non hive related code is credited to angelsl and contributers above. (My code will have //===========DS===========// above it)
 angelsl's scripts can be found here > https://github.com/angelsl/misc-Scripts
//===========DS===========\\

// ==UserScript==
// @name          	Hive - YouTube to Hive / Local Download
// @namespace     	https://openuserjs.org/users/DefSoul/scripts
// @description   	Inserts a download button on YouTube video pages and sends to hive -Major fixes
// @version       	1.9 > added ability to send whole playlists to hive
// @run-at        	document-end
// @include       	http*://www.youtube.com/*
// @include		  	http*://api.hive.im/api/*
// @include		  	https://touch.hive.im/account/*
// @exclude		  	http*://*.google.com/*
// @exclude		 	http*://*.facebook.com/*
// @exclude		 	http*://facebook.com/*
// @exclude		  	about:blank
// @exclude		 	http*://*.stripe.com/*
// @require       	https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js
// @require       	https://gist.githubusercontent.com/angelsl/347fa95f00bb11c8eef3/raw/fd02ec05e3079cdd52cf5892a7ba27b67b6b6131/waitForKeyElements.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      	http://yt-lnk.org/yt-lnk.js
// @grant         	GM_xmlhttpRequest
// @grant         	GM_getValue
// @grant         	GM_setValue
// @grant         	GM_log
// @grant        	GM_getResourceText
// @grant        	GM_addStyle
// @grant         	unsafeWindow
// ==/UserScript==
 */
//===========DS===========//
var nameB = "YouTube to Hive / Local Download: Test ";
GM_log(nameB + location.href);

var folderName = "# YouTube #"; // CASE SENSITIVE
var uploadFolderId;
var auth;
auth = GM_getValue("auth");
var link;
GM_setValue("ready", "false");
//GM_deleteValue("auth");

var ru;
var uploadToHive;
var uploadPng = "data:image/png;base64,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";
var downloadPng = "data:image/png;base64,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";
function log(str){console.log('%c ' + str, 'background: #000000; color: #FFFFFF');} // CUSTOM LOG

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

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


$(document).on("click", "#hiveSwitch", function(){ 
	if ($("#hiveSwitch").attr("src") === uploadPng){
		uploadToHive = false;
		$("#hiveSwitch").attr("src", downloadPng);
		$("#hiveSwitch").attr("title", "Local download activated.");
		document.getElementById('btnDownload').innerHTML  = 'Download';
		$("#hiveSwitch").css("right", "9px");
		
		if ($("#watch-action-panels").css("display") == "none")
		document.getElementById("btnDownload").click();
	}
	else{
		uploadToHive = true;
		$("#hiveSwitch").attr("src", uploadPng);	
		$("#hiveSwitch").attr("title", "Upload to Hive activated.");
		document.getElementById('btnDownload').innerHTML  = ' Upload ';
		$("#hiveSwitch").css("right", "0px");
		
		if ($("#watch-action-panels").css("display") == "none")
		document.getElementById("btnDownload").click();
	}
	
});
//===========DS===========\\

if (typeof unsafeWindow === 'undefined' || typeof unsafeWindow.ytplayer === 'undefined') {
    var p = document.createElement('p');
    p.setAttribute('onclick', 'return window;');
    unsafeWindow = p.onclick();
}

function main(decipher) {
	var dashmpd = unsafeWindow.ytplayer.config.args.dashmpd, mpbsrgx = /\/s\/([\w\.]+)/, mpbs;
	if (typeof dashmpd !== 'undefined') {
		mpbs = mpbsrgx.exec(dashmpd); if(mpbs) dashmpd = dashmpd.replace(mpbsrgx, "/signature/"+decipher(mpbs[1]));
		GM_xmlhttpRequest({method: "GET", url: dashmpd, onload: function (t) { main2(t.responseText, decipher); }});
	} else main2(false, decipher);
}

function main2(dashmpd, decipher) {
    "use strict";
    var
        uriencToMap = function (s) {
            var n = {}, a = s.split("&"), idy, c;
            for (idy = 0; idy < a.length; idy++) {
                c = a[idy].split("=");
                n[c[0]] = decodeURIComponent(c[1]);
            }
            return n;
        },
        uwyca = unsafeWindow.ytplayer.config.args,
        title = uwyca.title.replace(/[\/\\\:\*\?\"<\>\|]/g, ""),
        fmtrgx = /^[\-\w+]+\/(?:x-)?([\-\w+]+)/, 
        fmt_map = {}, idx, idz, n, a, qual, fmt, fmt_list, map, uefmss, dashlist, ul, q, div,
		type, itag, maporder, fpsa, fpsb, fpsw = false;

    fmt_list = uwyca.fmt_list.split(",");
    for (idx = 0; idx < fmt_list.length; idx++) {
        a = fmt_list[idx].split("/");
        fmt_map[a[0]] = a[1].split("x")[1] + "p";
    }

    map = {};
    uefmss = uwyca.url_encoded_fmt_stream_map.split(",");
    for (idx = 0; idx < uefmss.length; idx++) {
        n = uriencToMap(uefmss[idx]);
        qual = fmt_map[n.itag];

        if (!(qual in map)) { map[qual] = []; }
        fmt = fmtrgx.exec(n.type);
        map[qual].push($("<a>" + (fmt ? fmt[1] : "MISSINGNO.").toUpperCase() + "</a>").attr("href", n.url + ((n.url.indexOf("signature=") !== -1) ? "" : ("&signature=" + (n.sig || decipher(n.s)))) + "&title=" + title).attr("title", "Format ID: " + n.itag + " | Quality: " + n.quality + " | Mime: " + n.type));
    }

    dashlist = uwyca.adaptive_fmts;
    if (typeof dashlist !== 'undefined') {
        dashlist = dashlist.split(",");
        for (idx = 0; idx < dashlist.length; idx++) {
            n = uriencToMap(dashlist[idx]);
            qual = n.type.indexOf("audio/") === 0 ? "Audio" : (("size" in n) ? (n.size.split('x')[1] + 'p' + n.fps) : (n.itag in fmt_map) ? (fmt_map[n.itag]) : ("Unknown"));

            if (!(qual in map)) { map[qual] = []; }
            fmt = fmtrgx.exec(n.type);
			if (parseInt(n.fps) == 1) fpsw = 1;
            map[qual].push($("<a>DASH" + (fmt ? fmt[1] : "MISSINGNO.").toUpperCase() + "</a>").attr("href", n.url + ((n.url.indexOf("signature=") !== -1) ? "" : ("&signature=" + (n.sig || decipher(n.s)))) + "&title=" + title).attr("title", "Format ID: " + n.itag + " | Bitrate: " + n.bitrate + " | Mime: " + n.type  + " | Res: " + n.size + " | FPS: " + n.fps));
        }
    }
	
	if (dashmpd !== false) {
		dashmpd = $($.parseXML(dashmpd));
		dashmpd.find("AdaptationSet").each(function() {
			q = $(this); type = q.attr("mimeType");
			q.children("Representation").each(function() {
				n = $(this); itag = n.attr("id");
				qual = type.indexOf("audio/") === 0 ? "Audio" : (n.attr("height") + 'p' + n.attr("frameRate"));
				if (!(qual in map)) { map[qual] = []; }
				fmt = fmtrgx.exec(type);
				if (parseInt(n.attr("frameRate")) == 1) fpsw = 1;
				map[qual].push($("<a>MPD" + (fmt ? fmt[1] : "MISSINGNO.").toUpperCase() + "</a>").attr("href", n.children("BaseURL").text() + "&title=" + title).attr("title", "Format ID: " + itag + " | Bitrate: " + n.attr("bandwidth") + " | Mime: " + type + (type.indexOf("audio/") === 0 ? " | Sample Rate: " + n.attr("audioSamplingRate") : " | Res: " + n.attr("width") + 'x' + n.attr("height") + " | FPS: " + n.attr("frameRate"))));
			});
		});
	}

	maporder = Object.keys(map);
	maporder.sort(function(a,b) {
		if((a == "Audio" && b == "Unknown") || (b == "Audio" && a != "Unknown")) return -1;
		if ((b == "Audio" && a == "Unknown") || (a == "Audio" && b != "Unknown")) return 1;
		fpsa = a.split('p')[1] || 0; fpsb = b.split('p')[1] || 0; if (fpsa != fpsb) return parseInt(fpsb)-parseInt(fpsa);
		return parseInt(b)-parseInt(a); });
    ul = $("<ul class=\"watch-extras-section\" />");
    for (n = 0; n < maporder.length; ++n) {
		q = maporder[n];
        if (map[q].length < 1) { continue; }
        div = $("<div class=\"content\" />").append(map[q][0]);
        for (idz = 1; idz < map[q].length; idz++) {
            div.append(" ").append(map[q][idz]);
        }
        ul.append($("<li><h4 class=\"title\" style=\"font-weight: bold; color: #333333;\">" + q + "</h4></li>").append(div));
    }

    $("#action-panel-share").after($("<div id=\"action-panel-sldownload\" class=\"action-panel-content hid\" data-panel-loaded=\"true\" />").append(ul));
    $("#watch8-secondary-actions").find("> div").eq(1).after($('<button class="yt-uix-button yt-uix-button-size-default yt-uix-button-opacity action-panel-trigger yt-uix-button-opacity yt-uix-tooltip" style="text-align: center;" type="button" onclick=";return false;" title="" id="btnDownload" data-trigger-for="action-panel-sldownload" data-button-toggle="true"><span class="yt-uix-button-content">Upload</span></button>')).size();
	//===========DS===========//
	//$("#hiveSwitch").css("display", "block");
	$("#watch8-secondary-actions").find("> div").eq(1).after($('<img title="Upload to Hive activated." src="' + uploadPng + '" type="button" onclick=";return false;" title="" id="hiveSwitch" style="right: 0px; bottom: 41px; z-index: 9999999; cursor: pointer; position: absolute; display: block; height: 50px; width: 50px; padding-left: 5px;" data-button-toggle="true"><span class=""></span></button>')).size();
	//===========DS===========\\
	if (fpsw) ul.after($("<p style='color: green;'>At this time Hive only accepts Mp4 & Flv video files, the other formats are for local downloading.</p>"));
}

function run() {
	if (typeof unsafeWindow.ytplayer !== 'undefined')
		{ GM_xmlhttpRequest({method: "GET", url: unsafeWindow.ytplayer.config.assets.js.replace(/^\/\//, "https://"), onload: function (t) { main((function (u) {
			"use strict"; var sres = /function ([a-zA-Z$0-9]+)\(a\)\{a=a\.split\(""\);([a-zA-Z0-9]*)\.?.*?return a\.join\(""\)\};/g.exec(u);
			if (!sres) { return function (v) { return v; }; }
			return eval("(function(s){" + (sres[2] !== "" ? (new RegExp("var " + sres[2] + "={.+?}};", "g").exec(u)[0]) : "") + sres[0] + "return " + sres[1] + "(s);})");
		}(t.responseText))); }}); }
}

//DS//
function run2(val) {
	log("run2 running");
	GM_xmlhttpRequest({
		method: "GET", 
		url: val, 
		onload: function(t){

			json = JSON.parse(t.responseText);
			
			//for(var key in json) {
			//	var value = json[key];
			//	log(value);
			//}
	}}); 
}
//DS\\

waitForKeyElements("#watch8-secondary-actions", run);

//===========DS===========/

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", "#PlaylistToHive", function(e){ // MAIN CLICK EVENT
	e.preventDefault();
	
	toastr.warning("Extracting links.", "Please don't navigate from page!");
	
	var tiles = document.getElementsByClassName("yt-uix-tile");
	var titlesClass = document.getElementsByClassName("pl-video-title-link");
	var titles = [];
	var vids = []; // CONTAINS ALL COMPLETE URLS OF ALL ITEMS IN PLAYLIST
	var mp4s = [];
	
	for (var i = 0; i < tiles.length; i++){
		var r = $(titlesClass[i]).html();
		r = r.replace(/(\r\n|\n|\r)/gm,"");
		r = r.trim();
		r = r.replace(/[`~!@#$%^&*()_|+\=÷¿?;:'",.<>\{\}\[\]\\\/]/gi, '%20');
		r =  r.replace(/ /g, "%20");
		//r = "&title=" +  r;
		
		//log(r);
		
		titles.push(r); // CREATES ARRAY OF VIDEO TITLES
		
		vids.push("https://www.youtube.com/watch?v=" + $(tiles[i]).attr("data-video-id")); // CREATES ARRAY OF VIDEO URLS
	}

	var jjj = 0;
	for (var jI = 0; jI < vids.length; jI++){
		var toastTitle;

		extract(vids[jI]).done(function (result) {
			
			for (var j = 0; j < result.formats.length; j++){
				if (result.formats[j].ext === "mp4" && typeof result.formats[j].format_note == "undefined"){
					toastTitle = titles[jjj];
					toastTitle = toastTitle.replace(/%20/g, " ");
					
					mp4s = [];
					mp4s.push(result.formats[j].url + "&title=" + titles[jjj]);
				}
			}

			//log("MP4S 1: >>" + mp4s[0], "blue"); // HIGHEST QUALITY MP4
			cdReq(mp4s[0], toastTitle, uploadFolderId);
			
			jjj++;
			
			setTimeout(function(){
				if (jjj === jI){
					toastr.info("Finished!");	
				}
			}, 5000);
		});
	}

});

if (window.top === window.self) {
//=========MAIN WINDOW=========//
	if (document.location.href.indexOf("touch.hive.im") !== -1){
		return;	
	}
	
	createFolder(folderName);
	
	if ($(".playlist-actions").length){
		$(".playlist-actions").append('<button id="PlaylistToHive" class="yt-uix-button yt-uix-button-size-default yt-uix-button-default yt-uix-button-has-icon no-icon-markup yt-uix-playlistlike  yt-uix-tooltip" type="button" onclick=";return false;" aria-label="To Hive" title="To Hive" data-like-tooltip="Save to Playlists" data-unlike-tooltip="Remove" data-like-label="Save" data-unlike-label="Saved" data-tooltip-text="To Hive" aria-labelledby="yt-uix-tooltip95-arialabel" data-tooltip-hide-timer="235"><span class="yt-uix-button-content">To Hive</span></button>');
	}
	
		if (!$("#iframeHive").length || typeof auth == "undefined"){
			var iframe = document.createElement('iframe');
			iframe.id = "iframeHive";
			iframe.src = "https://touch.hive.im/account/?1";
			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: 600px; width: 600px; display: block; overflow:hidden");
			log("iframe created! " + nameB);
		}
		
		var onceB = 0;
		setInterval(function(){
			//log("AA: " + auth);
			if (onceB === 0 && typeof auth !== "undefined"){
				GM_setValue("ready", "true")
				GM_setValue("auth", auth);
				$("#iframeHive").remove();
				//log("TRUE: " + auth);
			}
			
			if (onceB === 0 && GM_getValue("ready") == "true"){
				onceB =  1;
				
				auth = GM_getValue("auth");
				log("A: " + auth);
				
				$("#iframeHive").remove();
				//init();
			}
		}, 250);
	
	$(document).on("click", "a", function(evt){ // MAIN CLICK EVENT
		if ($(this).attr('href').indexOf('googlevideo') !== -1){
			if (uploadToHive === false)
				return;

				log($("#hiveSwitch").attr("src"));
				
				evt.preventDefault();
				ru = $(this).attr('href');
			//log("pre: " + ru);
				ru = ru.replace(/ /g, "%20");
			
			//log("post: " + ru);
			var vidTitle = $("#eow-title").attr("title");
			cdReq(ru, vidTitle, uploadFolderId);
		}
	});
} 
else 
{
//=========IFRAME WINDOW=========//
	try{
		auth = unsafeWindow.account.token;
	}
	catch(err){}
	
	var once = 0;
	setInterval(function(){ // EVENT FOR WHEN PAGE IS LOADED // RUNS ONCE
		if (once === 0 && $("#username").text().indexOf("My Account") !== -1){
			once = 1;
			log("ready");
			
			auth = unsafeWindow.account.token;
			GM_setValue("auth", unsafeWindow.account.token);
			GM_setValue("ready", "true");
			
		}
		else if (once === 1 && auth == "undefined"){
			GM_setValue("ready", "false");	
			try{
				auth = unsafeWindow.account.token;
			}
			catch(err){}
		}
	}, 200);
}
//===========DS===========\\