KeepVid Helper

This userscript assists KeepVid in fetching download links. Mainly used as an alternative to the Java option currently provided.

当前为 2017-05-11 提交的版本,查看 最新版本

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name        KeepVid Helper
// @namespace   http://keepvid.com/
// @version     1.4.1
// @description This userscript assists KeepVid in fetching download links. Mainly used as an alternative to the Java option currently provided.
// @copyright   2014+, KeepVid
// @icon        http://keepvid.com/userscript/icon128.png
// @icon64      http://keepvid.com/userscript/icon64.png
// @homepage    http://keepvid.com/extensions
// updateURL   http://10.11.4.89/keepvid-helper.meta.js
// downloadURL http://10.11.4.89/keepvid-helper.user.js
// @require    http://code.jquery.com/jquery-1.11.0.min.js

// @include     http://*
// @include     https://*

// @run-at      document-start
// @connect     dailymotion.com
// @connect     vimeo.com
// @connect     cloudy.ec
// @connect     novamov.com
// @connect     soundcloud.com
// @connect     youtube.com
// @connect     ytimg.com
// @connect     *
// @grant       GM_xmlhttpRequest
// ==/UserScript==

var AttachStyleEnum = {
    AttachOuterTopLeft: 0, 
    AttachOuterTopRight: 1, 
    AttachOuterBottomLeft: 2, 
    AttachOuterBottomRight: 3, 
    AttachInnerTopLeft: 4, 
    AttachInnerTopRight: 5, 
    AttachInnerBottomLeft: 6, 
    AttachInnerBottomRight: 7
};

//请求,网页请求
var xhr = new XMLHttpRequest();
var facebookDom;
var isRequesting;
var requestHtml; 

//$(document).ready(function(){
//    keepvid.CheckAllWebsiteLink();
//});
window.onload=function(event){
	keepvid.requestHtml= null;
	keepvid.CheckAllWebsiteLink();
};

if("undefined" == typeof (keepvid)) {
    var keepvid = {
        buttonList: [],
        isInitialAdjustPos: false,
        mouseOutTimer: null,

        getBrowserIndent: function()
        {
            var ua = window.navigator.userAgent.toLowerCase();

            if(ua.indexOf("chrome")>0) {
                return "chrome";
            }
            else if(ua.indexOf("firefox")>0){
                return "firefox";
            }
            else if(ua.indexOf("safari")>0) {
                return "safari";
            } 
            else {
                return "";
            } 
        },

        // Get Element Position
        getElementPos: function(el) {
            var ua = window.navigator.userAgent.toLowerCase();
            var isOpera = (ua.indexOf('opera') != -1);
            var isIE = (ua.indexOf('msie') != -1 && !isOpera); // not opera spoof
            if (el.parentNode === null || (el.style != null && el.style.display == 'none')) {
                return false;
            }
            var parent = null;
            var pos = [];
            var box;
            if (el.getBoundingClientRect) {      // IE
                box = el.getBoundingClientRect();
                var scrollTop = Math.max(document.documentElement.scrollTop, document.body.scrollTop);
                var scrollLeft = Math.max(document.documentElement.scrollLeft, document.body.scrollLeft);
                return {
                    x: box.left + scrollLeft,
                    y: box.top + scrollTop
                };
            } 
            else if (document.getBoxObjectFor) { // gecko
                box = document.getBoxObjectFor(el);
                var borderLeft = (el.style.borderLeftWidth) ? parseInt(el.style.borderLeftWidth) : 0;
                var borderTop = (el.style.borderTopWidth) ? parseInt(el.style.borderTopWidth) : 0;
                pos = [box.x - borderLeft, box.y - borderTop];
            } 
            else {                              // safari & opera   
                pos = [el.offsetLeft, el.offsetTop];
                parent = el.offsetParent;
                if (parent != el) {
                    while (parent) {
                        pos[0] += parent.offsetLeft;
                        pos[1] += parent.offsetTop;
                        parent = parent.offsetParent;
                    }
                }

                if (ua.indexOf('opera') != -1 || (ua.indexOf('safari') != -1 && (el.style != null && el.style.position == 'absolute'))) {
                    pos[0] -= document.body.offsetLeft;
                    pos[1] -= document.body.offsetTop;
                }
            }

            if (el.parentNode) {
                parent = el.parentNode;
            }
            else {
                parent = null;
            }

            while (parent && parent.tagName != 'BODY' && parent.tagName != 'HTML') { // account for any scrolled ancestors
                pos[0] -= parent.scrollLeft;
                pos[1] -= parent.scrollTop;
                if (parent.parentNode) {
                    parent = parent.parentNode;
                }
                else {
                    parent = null;
                }
            }
            return {
                x: pos[0],
                y: pos[1]
            };
        }, 

        calculateButtonPos: function(attachedElement, buttonDiv, attachStyle) {
            // alter the button's position
            var btnWidth = buttonDiv.offsetWidth;
            var btnHeight = buttonDiv.offsetHeight;
            var pos = this.getElementPos(attachedElement);
            var beforeChildLeft = pos.x;
            var beforeChildTop = pos.y;
            var divLeft = 0;
            var divTop = 0;
            switch (attachStyle) {
                case AttachStyleEnum.AttachOuterTopLeft: {
                    divLeft = beforeChildLeft;
                    divTop = beforeChildTop - btnHeight;
                    break;
                }
                case AttachStyleEnum.AttachOuterTopRight: {
                    divLeft = beforeChildLeft + attachedElement.offsetWidth - btnWidth;
                    divTop = beforeChildTop - btnHeight;
                    break;
                }
                case AttachStyleEnum.AttachOuterBottomLeft: {
                    divLeft = beforeChildLeft;
                    divTop = beforeChildTop + attachedElement.offsetHeight;
                    break;
                }
                case AttachStyleEnum.AttachOuterBottomRight: {
                    divLeft = beforeChildLeft + attachedElement.offsetWidth - btnWidth;
                    divTop = beforeChildTop + attachedElement.offsetHeight;
                    break;
                }
                case AttachStyleEnum.AttachInnerTopLeft: {
                    divLeft = beforeChildLeft;
                    divTop = beforeChildTop;
                    break;
                }
                case AttachStyleEnum.AttachInnerTopRight: {
                    divLeft = beforeChildLeft + attachedElement.offsetWidth - btnWidth;
                    divTop = beforeChildTop;
                    break;
                }
                case AttachStyleEnum.AttachInnerBottomLeft: {
                    divLeft = beforeChildLeft;
                    divTop = beforeChildTop + attachedElement.offsetHeight - btnHeight;
                    break;
                }
                case AttachStyleEnum.AttachInnerBottomRight: {
                    divLeft = beforeChildLeft + attachedElement.offsetWidth - btnWidth;
                    divTop = beforeChildTop + attachedElement.offsetHeight - btnHeight;
                    break;
                }
            }
            return {
                x: divLeft, 
                y: divTop
            };
        }, 

        // Adjuest The Download Button Element
        adjustAttachButtonPos: function() {
            for (var i = 0; i < keepvid.buttonList.length; i++) {
                attachedElement = keepvid.buttonList[i].attachedElement;
                buttonDiv = keepvid.buttonList[i].buttonDiv;
                attachStyle = keepvid.buttonList[i].attachStyle;

                var divPos = keepvid.calculateButtonPos(attachedElement, buttonDiv, attachStyle);
                buttonDiv.style.left = divPos.x.toString() + 'px';
                buttonDiv.style.top = divPos.y.toString() + 'px';
            }
        },

        // 附 加 按 钮
        attachButtonDiv: function(attachedElement, attachStyle, buttonCaption, buttonLink, divId, buttonId,videoName) {
            // Create div element
            //alert(buttonLink);
            if (!attachedElement) return;
            for (var i = 0; i < this.buttonList.length; i++) {
                if (this.buttonList[i].attachedElement == attachedElement) {
                    return this.buttonList[i].buttonDiv;
                }
            };
            var downloadDiv = document.createElement("div");
            //      downloadDiv.setAttribute("id", "ws");       //[safari]
            downloadDiv.setAttribute("style", "z-index: 2147483647; background: transparent; position: absolute;");
            downloadDiv.style.width = 106 + 'px';
            downloadDiv.style.height = 31 + 'px';
            downloadDiv.style.backgroundImage = "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGoAAAAfCAYAAAAPzljlAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3ppVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTMyIDc5LjE1OTI4NCwgMjAxNi8wNC8xOS0xMzoxMzo0MCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpmYzU1NTE0Ny1hZjM2LTQ3NGItOTBlNS0xYjBiZmU2MGNmMjkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QTYyODQ4N0U2QkZCMTFFNjlGNUNENzEzOTIwRjVFNUIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QTYyODQ4N0Q2QkZCMTFFNjlGNUNENzEzOTIwRjVFNUIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUuNSAoTWFjaW50b3NoKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjMzODY0MGRjLTZiN2EtNDg0Ni1iYjNhLTM5OTQ3YmY0N2ZhZSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpmYzU1NTE0Ny1hZjM2LTQ3NGItOTBlNS0xYjBiZmU2MGNm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)";
            downloadDiv.style.cursor = "pointer";
            if (divId)  downloadDiv.setAttribute("id", divId);

            downloadDiv.style.visibility = 'visible';
			if(location.href.indexOf("instagram.com")>0)
				downloadDiv.style.visibility = 'hidden';

            // Create button element
            var btnDownload = document.createElement("a");
            //btnDownload.setAttribute("class", "fantasybutton");
            var realLink = "http://keepvid.com/?url=" + buttonLink;
            if(videoName !== undefined){
                realLink+="&videoName="+videoName;
            }
            realLink += "&from=plugin#downloader";
            // if(this.getBrowserIndent() == "firefox")
            //  btnDownload.setAttribute("href", realLink);
            // else if(this.getBrowserIndent() == "chrome")
            //  downloadDiv.onclick = function () {
            //  //btnDownload.onclick = function () {
            //      downloadDiv.style.visibility = 'hidden';
            //      myWindow1 = window.open(realLink, '_blank', '');
            //               myWindow1.focus();
            //  };
            //  //downloadDiv.href = buttonLink;

            // else if(this.getBrowserIndent() == "safari") {
            //  //btnDownload.setAttribute("href", "javascript:void(0);");
            //  btnDownload.setAttribute("href", realLink);
            //  //btnDownload.addEventListener("click", function(){this.blur(); window.location.href = buttonLink; downloadDiv.style.visibility = 'hidden'; return false; });
            //  btnDownload.addEventListener("click", function(){this.blur(); downloadDiv.style.visibility = 'hidden'; return false; });

            // }

            downloadDiv.onclick = function () {
                //btnDownload.onclick = function () {
                if(location.href.indexOf("facebook.com")< 0){
                    downloadDiv.style.visibility = 'hidden';
                }
                myWindow1 = window.open(realLink, '_blank', '');
                myWindow1.focus();
            };
            btnDownload.style.cursor = "pointer";
            var btnText = document.createElement("span");
            if (buttonCaption) btnText.innerHTML = buttonCaption;
            btnDownload.appendChild(btnText);

            downloadDiv.appendChild(btnDownload);     
            var body = document.body;
            body.insertBefore(downloadDiv, body.lastChild);

            var divPos = this.calculateButtonPos(attachedElement, downloadDiv, attachStyle);

            downloadDiv.style.left = divPos.x.toString() + 'px';
            downloadDiv.style.top = divPos.y.toString() + 'px';

            // initial onresize event
            if (!this.isInitialAdjustPos) {
                window.addEventListener("resize", keepvid.adjustAttachButtonPos, false);
                //window.addEventListener("DOMNodeInserted", WSCore.adjustAttachButtonPos, false);
                this.isInitialAdjustPos = true;
            }

            // push attachButtonInfo into attachButtonList
            var attachButtonInfo = {attachedElement: attachedElement, buttonDiv: downloadDiv, attachStyle: attachStyle};
            this.buttonList.push(attachButtonInfo);

            return downloadDiv;
        },

        //返回按钮对象
        getButtonElement: function(attachedElement) {
            for (var i = 0; i < keepvid.buttonList.length; i++) {
                if (attachedElement == keepvid.buttonList[i].attachedElement) 
                    return keepvid.buttonList[i].buttonDiv;
            }
        },

        showElement: function(el) {
            //  if (WSCore.timeoutHandle) clearTimeout(this.timeoutHandle);
            if (el) {
                if (keepvid.mouseOutTimer) clearTimeout(keepvid.mouseOutTimer);
                el.style.visibility = "visible";

            }
        }, 

        delayHideElement: function(el) {
            //  if (WSCore.timeoutHandle) clearTimeout(this.timeoutHandle);
            if (el) {
                el.style.visibility = "hidden";
            }
        },

        handleVideoMouseoverEvent: function(event) {
            //console.log("绑定新的DIV");
            for (i = 0; i < keepvid.buttonList.length; i++) {
                if (event.target == keepvid.buttonList[i].attachedElement) {
                    if (keepvid.mouseOutTimer) {clearTimeout(keepvid.mouseOutTimer);}
                    keepvid.adjustAttachButtonPos();
                    keepvid.buttonList[i].buttonDiv.style.visibility = "visible";
                    return;
                }
            }

            for (i = 0; i < keepvid.buttonList.length; i++) {
                if (event.target == keepvid.buttonList[i].buttonDiv) {
                    if (keepvid.mouseOutTimer) { clearTimeout(keepvid.mouseOutTimer); }
                    keepvid.buttonList[i].buttonDiv.style.visibility = "visible";
                    return;
                }
            }
        },

        handleVideoMouseoutEvent: function(event) {
            for (i = 0; i < keepvid.buttonList.length; i++) {
                if (event.target == keepvid.buttonList[i].attachedElement) {
                    el = keepvid.buttonList[i].buttonDiv;
                    keepvid.mouseOutTimer = setTimeout(function () {el.style.visibility = "hidden";}, 500);
                    return;
                }
            }

            for (i = 0; i < keepvid.buttonList.length; i++) {
                if (event.target == keepvid.buttonList[i].buttonDiv) {
                    el = event.target;
                    keepvid.mouseOutTimer = setTimeout(function () {el.style.visibility = "hidden";}, 500);
                    return;
                }
            }
        },
        currentUrl:null,
        handleDocumentMouseOverEvent: function(event) {            
			var desktopType = document.getElementsByTagName('body')[0].getAttribute('desktopType');
			if(desktopType!=undefined && desktopType!=null && desktopType!=''){
				return;
			}
			if(location.href.indexOf('.mp4')>=0) return;
            if(event.target.tagName=='IFRAME' && location.href.indexOf("facebook.com")>=0){
                //keepvidHref
                var savedUrl = $($(event.target).parent().parent()[0]).attr('keepvidHref');
                var downloadUrlId = $($(event.target).parent().parent()[0]).attr('downloadButtonId');
                currentUrl = savedUrl;
                //如果下载按钮已经创建过的,直接显示
                if(savedUrl !==null && savedUrl !== undefined && downloadUrlId!==null && downloadUrlId!==undefined){
                    //alert($(event.target).parent()[0].id);
                    $('#'+downloadUrlId).css("visibility","visible");
                    $('#'+downloadUrlId).css("left",$($(event.target).parent().parent()[0]).attr('downloadButtonleft'));
                    $('#'+downloadUrlId).css("top",$($(event.target).parent().parent()[0]).attr('downloadButtontop'));
                    return;
                }
            }
            //facebook不需要这个,直接用最下面的方法去查询调用。 || (event.target.toString().indexOf("HTMLIFrameElement") != -1) event.target instanceof HTMLIFrameElement ||
            if(location.href.indexOf("facebook.com")<0){
                if (event.target instanceof HTMLEmbedElement || event.target instanceof HTMLObjectElement ||  event.target instanceof HTMLVideoElement ||
                    (event.target.toString().indexOf("HTMLEmbedElement") != -1) || (event.target.toString().indexOf("HTMLObjectElement") != -1)||
                    (event.target.toString().indexOf("HTMLVideoElement") != -1)) {
					var downloadDiv;
					if( (location.href.indexOf('123movies.is')>=0||location.href.indexOf('123movieshd.to')>=0
							||location.href.indexOf('gomovies.to')>=0)
							&& event.target instanceof HTMLVideoElement ){
						var srcHref = $(event.target).attr('src');
						var title = $('.mvic-desc h3')==undefined?document.title:$('.mvic-desc h3')[0].innerText;
						downloadDiv = keepvid.attachButtonDiv(event.target, AttachStyleEnum.AttachOuterTopRight, "", encodeURIComponent(srcHref),undefined,undefined,title);
					}
					else{
						downloadDiv = keepvid.attachButtonDiv(event.target, AttachStyleEnum.AttachOuterTopRight, "", location.href);
					}
                    if (keepvid.mouseOutTimer) { clearTimeout(keepvid.mouseOutTimer); }
                    downloadDiv.style.visibility = "visible";
                    keepvid.bindEvent(event.target, downloadDiv);
                }
            }
            if(location.href.indexOf("facebook.com")<0){
				keepvid.instagram();
                keepvid.vimeo();
                keepvid.vevo();
                keepvid.discovery();
                keepvid.liveleak();
                keepvid.nbcnews();
            }
            //facebook只有在Video标签才去允许下载
            if(event.target.tagName == "VIDEO" && location.href.indexOf("facebook.com")>=0){
				//先看是不是已经拿过了,如果拿过了就不管了,直接用
				var destUrl = $($(event.target).parent().parent()[0]).attr('keepvidHref');
				var video_id = $($(event.target).parent().parent()[0]).attr('video_id');
				if(destUrl!=null && destUrl!= undefined){
					var downloadUrlId = 'FaceBookVideo_' + video_id;
					if(downloadUrlId!==null && downloadUrlId!==undefined){						
						$('#'+downloadUrlId).css("visibility","visible");
					}
					else{
						var downloadDiv = keepvid.attachButtonDiv(event.target, AttachStyleEnum.AttachOuterTopRight, "", encodeURIComponent(destUrl),undefined,undefined,'FaceBookVideo_' + video_id);
						keepvid.bindEvent(event.target, downloadDiv);
					}
					return;
				}
				else{
					keepvid.facebook(event.target);
				}
            }
            if((event.target.tagName=="DIV" || event.target.tagName=="A") && location.href.indexOf("facebook.com")>=0){
                keepvid.facebookOutLink(event.target);
            }
			//暂时不要tumblr的内链
			//if(event.target.tagName=="DIV" && location.href.indexOf("tumblr.com")>=0){
			//	keepvid.tumblrInnerLink(event.target);
			//}
        },

        bindEvent: function(element, buttonDiv) {
            element.addEventListener("mouseover", keepvid.handleVideoMouseoverEvent, false);
            element.addEventListener("mouseout", keepvid.handleVideoMouseoutEvent, false);
            buttonDiv.addEventListener("mouseover", keepvid.handleVideoMouseoverEvent, false);
            buttonDiv.addEventListener("mouseout", keepvid.handleVideoMouseoutEvent, false);
            buttonDiv.addEventListener("mousemove", keepvid.handleVideoMouseoverEvent, false);
        },
		
		//暂时不要tumblr的内链
		//tumblrInnerLink:function(targetDom){
		//	alert('asdasd');
		//	if (location.href.indexOf("tumblr.com") >= 0) {
		//		var parentDivNode = targetDom.parentNode;
		//		//如果是视频的话,应该可以从他下面获取到Video标签
		//		var videoElement = $(targetDom).find('video');
		//		var srcElement = $(videoElement).find('source');
		//		
		//		var destURL= $(srcElement).attr('src');
		//		var sourceAddrType= $(srcElement).attr('type');
		//		
		//		var videoId = $(videoElement).attr('id');
		//		//embed-5832961698132629339048_html5_api
		//		if(sourceAddrType.indexOf('mp3')>=0|| sourceAddrType.indexOf('mp4')>=0){					
		//			var downloadDiv = keepvid.attachButtonDiv(targetDom, AttachStyleEnum.AttachOuterTopRight, "", destURL,undefined,undefined,videoId);
		//			keepvid.bindEvent(targetDom, downloadDiv);
		//		}
		//	}
		//},

        vimeo: function() {
            if (location.href.indexOf("vimeo.com") >= 0) {
                var els = document.getElementsByTagName("video");
                for (var i = 0; i < els.length; i++) {
                    var el = els[i].parentNode.parentNode.parentNode.nextSibling;
                    if (el && (el instanceof HTMLDivElement) && el.className == "target") {
                        var downloadDiv = keepvid.attachButtonDiv(el, AttachStyleEnum.AttachOuterTopRight, "", location.href);
                        keepvid.bindEvent(el, downloadDiv);
                    }
                }
            }
        },
		
		instagram: function() {
            if (location.href.indexOf("instagram.com") >= 0) {
                var els = document.getElementsByTagName("video");
                for (var i = 0; i < els.length; i++) {
                    var el = els[i].parentNode.parentNode.parentNode.nextSibling;
					var dlUrl = els[i].src;
					if(dlUrl.indexOf("?") >= 0)
						dlUrl = dlUrl.split('?')[0];
					var strArr = dlUrl.split('_');
					var point = strArr.length - 2;
					if(point>0)
						videoId = strArr[point];
					else
						videoId = new Date().getTime();
					var videoName = encodeURIComponent("InstagramVideo_" + videoId.toString());
					var imgTar = els[i].nextSibling;
					var img = '';
					if(imgTar && imgTar.className == "_cr348"){
						img = '&img=' + encodeURIComponent(imgTar.src);
					}
                    if (el && el.className == "_c2kdw") {
                        var downloadDiv = keepvid.attachButtonDiv(el, AttachStyleEnum.AttachOuterTopRight, "", encodeURIComponent(els[i].src) + '&videoName='+videoName+img);
						if(document.getElementsByClassName('_nljxa').length>0)
							downloadDiv.style.position = 'fixed';
                        keepvid.bindEvent(el, downloadDiv);
                    }
					else{
						var el = els[i].parentNode.parentNode.nextSibling;
						if (el && el.className == "_c2kdw") {
							var downloadDiv = keepvid.attachButtonDiv(el, AttachStyleEnum.AttachOuterTopRight, "", encodeURIComponent(els[i].src) + '&videoName='+videoName+img);
							if(document.getElementsByClassName('_nljxa').length>0)
								downloadDiv.style.position = 'fixed';
							keepvid.bindEvent(el, downloadDiv);
						}
					}
                }
            }
        },

        facebook: function(targetDom){
            if(isRequesting) return;
            var destURL;
			facebookDom = targetDom;
			//这里要获取地址
			var parentsList = $(targetDom).parents();
			var currentVideoDiv;
			for(var i=0;i<parentsList.length;i++){
				if(($(parentsList[i]).attr('class')==null || $(parentsList[i]).attr('class')== undefined) && ($(parentsList[i]).attr('data-ft')==null ||$(parentsList[i]).attr('data-ft')==undefined)){
					currentVideoDiv = parentsList[i];
					break;
				}
			}
			var spanList = $(currentVideoDiv).find('span');
			var spanDom;
			for(var i=0;i<spanList.length;i++){
				if($(spanList[i]).attr('class')=='timestampContent'){
					spanDom = spanList[i];
					break;
				}
			}
			//如果span没有找到,可能当前就是详情页面,所以直接找stream_pagelet这个节点下的span
	        if(spanDom==undefined || spanDom ==null)
	        	spanDom = $('.timestampContent');
			var videoUrl = 'https://www.facebook.com' + $($(spanDom).parent().parent()).attr('href');
			var checkCurrentResult = false;
			if(requestHtml!= undefined && requestHtml!= null){
				checkCurrentResult = keepvid.facebookInnerLinkCheck(requestHtml,videoUrl);
			}
			if(checkCurrentResult== false){
				keepvid.RequestFaceBookDownloadUrl(videoUrl);
			}
            //只接受facebook的网站的东西
            //if(location.href.indexOf("facebook.com")>=0){
            //    //这里要区分两类,第一类是直接从页面上能找到的,找不到的时候再去保存链接里面找,再找不到就没办法了
			//	//1找到当前Video标签的父节点中包含有data-testid="fbfeed_story"属性的div
			//	var hyperfeedId;
			//	var divList = $(targetDom).parents();
			//	for(var i=0;i<divList.length;i++){
			//		if($(divList[i]).attr('data-referrer')==$(divList[i]).attr('id') && $(divList[i]).attr('data-referrer')!= undefined && $(divList[i]).attr('data-referrer')!= null){
			//			hyperfeedId = $(divList[i]).attr('id');
			//			break;
			//		}
			//	}
            //    if(hyperfeedId!=null && hyperfeedId!= undefined){
			//		var marksScriptIndex;
			//		//遍历所有script
			//		for(var i=0;i<document.scripts.length;i++){
			//			if(document.scripts[i].innerHTML.indexOf(hyperfeedId)>=0){
			//				marksScriptIndex = i;
			//				break;
			//			}
			//		}
			//		var sourceUrlScript= document.scripts[marksScriptIndex + 1].innerHTML;
			//		if(sourceUrlScript.indexOf('"'+$(targetDom).attr('id')+'"')<0){
			//			return;
			//		}
            //        var pattern = new RegExp('sd_src_no_ratelimit:".*?",','gi');  //匹配单个script标签内容的写法
			//		var matchArr = pattern.exec(sourceUrlScript);
			//		if(matchArr!=null && matchArr.length>0){
			//			destURL= matchArr[0].replace('sd_src_no_ratelimit:"','').replace('",','');
			//		}
			//		if(destURL==null ||destURL == undefined){
			//			pattern = new RegExp('hd_src_no_ratelimit:".*?",','gi');
			//			var matchArr = pattern.exec(sourceUrlScript);
			//			if(matchArr!=null && matchArr.length>0){
			//				destURL = matchArr[0].replace('hd_src_no_ratelimit:"','').replace('",','');
			//			}
			//		}
			//		if(destURL==null ||destURL == undefined){
			//			pattern = new RegExp('hd_src:".*?",','gi');
			//			var matchArr = pattern.exec(sourceUrlScript);
			//			if(matchArr!=null && matchArr.length>0){
			//				destURL = matchArr[0].replace('hd_src:"','').replace('",','');
			//			}
			//		}
			//		if(destURL==null ||destURL == undefined){
			//			pattern = new RegExp('sd_src:".*?",','gi');
			//			var matchArr = pattern.exec(sourceUrlScript);
			//			if(matchArr!=null && matchArr.length>0){
			//				destURL = matchArr[0].replace('sd_src:"','').replace('",','');
			//			}
			//		}
			//		if(destURL==null ||destURL == undefined){
			//			destURL = location.href;
			//		}
            //        //alert("添加事件");出来的链接直接传递到按钮,跳转,Keepvid网站可能需要修改来检测下载资源。
            //        //客户端同步需要能够直接接受http://www.facebook.com/video/wanglihong.mp4?参数1=0&参数2=0这种地址
            //        var downloadDiv = keepvid.attachButtonDiv(targetDom, AttachStyleEnum.AttachOuterTopRight, "", destURL,undefined,undefined,'FaceBookVideo_' + $(targetDom).attr('id'));
            //        keepvid.bindEvent(targetDom, downloadDiv);
			//	}
            //}
        },
		
		RequestFaceBookDownloadUrl: function(currentUrl){
			if (xhr) {
				//xhr.overrideMimeType("text/html");
				xhr.open('GET', currentUrl, true);
				xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
				xhr.setRequestHeader("Accept","*/*");
				xhr.setRequestHeader("Accept-Language","zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3");
				xhr.onreadystatechange = keepvid.handler;
				xhr.send();
				isRequesting = true;
			}
			else {
				//如果不行,就要找别的办法了。
				//document.getElementById("content").innerHTML = "can not create XMLHttpRequest";
			}
		},
		
		handler: function(evtXHR){
			if (xhr.readyState == 4) {
				if (xhr.status == 200) {
					var response = xhr.responseText;
					requestHtml = xhr.responseText;
					if(xhr.responseURL.indexOf('facebook.com')>=0){
						keepvid.facebookInnerLinkCheck(requestHtml,xhr.responseURL);
					}
				} 
				else {
					console.log('can not cross domain');
					//document.getElementById("content").innerHTML = "can not cross domain";
				}
				isRequesting = false;
			}
			else {
				console.log(xhr.readyState);
				//document.getElementById("content").innerHTML += "<br/>exceute status readyState" + xhr.readyState;
			}
		},
		
		facebookInnerLinkCheck:function(response,currentUrl){
			//拿着返回值去解析,从里面找出progressive,这里面有各种信息(url,quality,id等)
			//AnalysisVimeoDownloadLink(response);
			//从response里面找video_id找出下载地址。
			//var parten = new RegExp('/videos\/(\d+)?','gi');
			try{
				var video_id;
				var matcharr = currentUrl.match(/videos\/(\S*)/);
				if(matcharr.length<2){
					return false;
				}
				video_id = matcharr[1].replace('/','');
				var downloadUrlParten = new RegExp('"videoData":\\[{"is_hds":(false|true),"video_id":"' + video_id + '",.*,"sd_src":.*?,"hd_tag":','gi');//,"sd_src_no_ratelimit":.*?
				var downloadJsonArr = response.match(downloadUrlParten);
				var downloadJson;
				if(downloadJsonArr==null || downloadJsonArr.length<0){
					//他们返回有两种不同格式的Json
					downloadUrlParten= new RegExp('videoData:\\[{is_hds:(false|true),video_id:"' + video_id + '",.*,sd_src:.*?,hd_tag:','gi');//,sd_src_no_ratelimit:.*?
					downloadJsonArr = response.match(downloadUrlParten);
					downloadJson = downloadJsonArr[0];
					downloadJson = downloadJson.replace(/:/g,'":');
					downloadJson = downloadJson.replace(/https":/g,'https:');
					downloadJson = downloadJson.replace(/,/g,',"');
					downloadJson = '"' + downloadJson;
					downloadJson = downloadJson.replace('"videoData":[{','');
					downloadJson = '{"' + downloadJson;
					downloadJson = downloadJson.replace(',"hd_tag":','}');
					downloadJson = downloadJson.substr(0,downloadJson.indexOf('}')+1);
				}
				else{
					downloadJson = downloadJsonArr[0];
					//去头去尾
					downloadJson = downloadJson.replace('"videoData":[','');
					downloadJson = downloadJson.replace(',"hd_tag":','}');
					downloadJson = downloadJson.substr(0,downloadJson.indexOf('}') + 1);
					//downloadJson = downloadJson.substr(0,downloadJson.indexOf('}"sve_hd"') + 1);
				}
				if(downloadJsonArr==null || downloadJsonArr.length<0){
					keepvid.RequestFaceBookDownloadUrl(currentUrl);
					return false;
				}
				var json = JSON.parse(downloadJson);
				//获取下载地址
				var destUrl = json.hd_src_no_ratelimit;
				if(destUrl==undefined || destUrl== null){
					destUrl = json.sd_src_no_ratelimit;
				}
				if(destUrl==undefined || destUrl== null){
					destUrl = json.hd_src;
				}
				if(destUrl==undefined || destUrl== null){
					destUrl = json.sd_src;
				}
				if(destUrl==undefined || destUrl== null){
					destUrl = location.href;
				}
				//保存到facebookDom的parent的parent节点
				$($(facebookDom).parent().parent()[0]).attr('keepvidHref',destUrl);
				$($(facebookDom).parent().parent()[0]).attr('video_id',video_id);
				var downloadDiv = keepvid.attachButtonDiv(facebookDom, AttachStyleEnum.AttachOuterTopRight, "", encodeURIComponent(destUrl),undefined,undefined,'FaceBookVideo_' + video_id);
				keepvid.bindEvent(facebookDom, downloadDiv);
			}
			catch(err){
				return false;
			}
			return true;
		},
		
        facebookOutLink: function(targetDom){
            var viemoLinkUrl;
            var videoImage = $(targetDom).find('img');
            var createDivId;
            //alert($(targetDom).attr('id'));
            if(targetDom.tagName=="A")
            {
                //alert("isComming");
                var youtubeAElement = $(targetDom).find('img');
                var youtubeUrl = $(targetDom).attr('href');
                var youtubeAjaxify = $(targetDom).attr('ajaxify');
                console.log(youtubeUrl);
                console.log(youtubeAjaxify);
                if(youtubeAElement !== undefined && youtubeAElement.length > 0 && youtubeAjaxify !== undefined && youtubeAjaxify.indexOf('/ajax/flash/expand_inline.php')>=0){
                    var currentUrl = decodeURIComponent(youtubeUrl);
                    //这是针对youtube的分析
                    if(currentUrl.indexOf("youtube.com")>=0){
                        currentUrl = currentUrl.substr(currentUrl.indexOf('u=/')+3);
                        youtubeUrl= 'https://www.youtube.com/'+currentUrl;
                        //alert($(targetDom).parent()[0].id);
                        if($(targetDom).parent().parent()[0] !== null &&  $(targetDom).parent().parent()[0]!== undefined){
                            //将分析出来的url和我们创建的div的id保存,后面检查到iframe时直接根据id去展示按钮
                            $($(targetDom).parent().parent()[0]).attr('keepvidHref',youtubeUrl);
                            createDivId = 'downloadUrl_'+ $(targetDom).parent()[0].id;
                            $($(targetDom).parent().parent()[0]).attr('downloadButtonId',createDivId);
                        }
                    }
                    //这是针对其他网站你的分析,url带有video的就认为是视频
                    else if(currentUrl.indexOf("/video") >= 0 || currentUrl.indexOf("vine.co")){
                         $($(targetDom).parent().parent()[0]).attr('keepvidHref',youtubeUrl);
                         createDivId = 'downloadUrl_'+ $(targetDom).parent()[0].id;
                         $($(targetDom).parent().parent()[0]).attr('downloadButtonId',createDivId);
                    }
                    else{
                        return;
                    }
                    //如果是CNN网站的
                    //else if(currentUrl.indexOf("www.cnn.com/video")>=0){
                    //    if($(targetDom).parent().parent()[0] !== null &&  $(targetDom).parent().parent()[0]!== undefined){
                    //        $($(targetDom).parent().parent()[0]).attr('keepvidHref',youtubeUrl);
                    //        createDivId = 'downloadUrl_'+ $(targetDom).parent()[0].id;
                    //        $($(targetDom).parent().parent()[0]).attr('downloadButtonId',createDivId);
                    //    }
                    //}
                    //alert("添加事件");出来的链接直接传递到按钮,跳转,Keepvid网站可能需要修改来检测下载资源。
                    //客户端同步需要能够直接接受http://www.facebook.com/video/wanglihong.mp4?参数1=0&参数2=0这种地址
                    var downloadDiv = keepvid.attachButtonDiv(targetDom, AttachStyleEnum.AttachOuterTopRight, "", decodeURIComponent(youtubeUrl),createDivId);
                    //计算按钮显示位置,facebook分享的youtube有点不一样
                    var width = parseInt($($(targetDom).parent().parent().parent().parent().parent()[0]).css("width"));
                    var left =$($(targetDom).parent().parent().parent().parent().parent()[0]).offset().left + width- parseInt($(downloadDiv).css('width'));
                    $(downloadDiv).css('left',left+'px');
                    $($(targetDom).parent().parent()[0]).attr('downloadButtonleft',$(downloadDiv).css('left'));
                    $($(targetDom).parent().parent()[0]).attr('downloadButtontop',$(downloadDiv).css('top'));
                    keepvid.bindEvent(targetDom, downloadDiv);
                }
            }
            //这是其他网站的分析
            else{
                if(location.href.indexOf("facebook.com")>=0 && videoImage !== null && videoImage !== undefined && videoImage.length>0){
                    var aLink = $(targetDom).parent();
                    var href = $(aLink[0]).attr('href');
                    var ajaxify = $(aLink).attr('ajaxify');
                    if(ajaxify !== undefined && ajaxify.indexOf('/ajax/flash/expand_inline.php')>=0){
                    	if(href.indexOf('dai.ly')>=0)
                    		href = 'http://www.dailymotion.com/video/' + href.substr(href.indexOf('dai.ly/')+7);
                        viemoLinkUrl = href;
                        //console.log($(targetDom).parent().parent()[0].id);
                        if( $($(targetDom).parent().parent().parent()[0]) !== null &&   $($(targetDom).parent().parent().parent()[0]) !== undefined){
                            //将分析出来的url和我们创建的div的id保存,后面检查到iframe时直接根据id去展示按钮
                            $($(targetDom).parent().parent().parent()[0]).attr('keepvidHref',viemoLinkUrl);
                            createDivId = 'downloadUrl_'+ $(targetDom).parent().parent()[0].id;
                            $($(targetDom).parent().parent().parent()[0]).attr('downloadButtonId',createDivId);
                        }
                        //alert("添加事件");出来的链接直接传递到按钮,跳转,Keepvid网站可能需要修改来检测下载资源。
                        //客户端同步需要能够直接接受http://www.facebook.com/video/wanglihong.mp4?参数1=0&参数2=0这种地址
                        var otherLinkDownloadDiv = keepvid.attachButtonDiv(targetDom, AttachStyleEnum.AttachOuterTopRight, "", viemoLinkUrl,createDivId);
                        $($(targetDom).parent().parent().parent()[0]).attr('downloadButtonleft',$(otherLinkDownloadDiv).css('left'));
                        $($(targetDom).parent().parent().parent()[0]).attr('downloadButtontop',$(otherLinkDownloadDiv).css('top'));
                        keepvid.bindEvent(targetDom, otherLinkDownloadDiv);
                    }
                    else if((ajaxify === undefined || ajaxify===null) && href !== undefined && (href.indexOf('soundcloud.com')>=0 || href.indexOf('mixcloud.com')>=0 || href.indexOf('/video')>0)){
                        var musicLinkDownloadDiv = keepvid.attachButtonDiv(targetDom, AttachStyleEnum.AttachOuterTopRight, "", href);
                        keepvid.bindEvent(targetDom, musicLinkDownloadDiv);
                    }
                }
            }
        },

        vevo: function() {
            if (location.href.indexOf("vevo.com") >= 0) {
                var el = document.getElementById("control-bar");
                if (el) {
                    var downloadDiv = keepvid.attachButtonDiv(el, AttachStyleEnum.AttachOuterTopRight, "", location.href);
                    keepvid.bindEvent(el, downloadDiv);
                }
            }
        },

        discovery: function() {
            if (location.href.indexOf("discovery.com") >= 0) {
                var els = document.getElementsByClassName("overlay");
                for (var i = 0; i < els.length; i++) {
                    var downloadDiv = keepvid.attachButtonDiv(els[i], AttachStyleEnum.AttachOuterTopRight, "", location.href);
                    keepvid.bindEvent(els[i], downloadDiv);
                }
            }
        },

        liveleak: function() {
            if (location.href.indexOf("liveleak.com") >= 0) {
                var el = document.getElementById("wrapper");
                if (el) el = el.firstChild;
                var id = el.id;
                el = document.getElementById(id + "_jwplayer_display");
                if (el) {
                    var downloadDiv = keepvid.attachButtonDiv(el, AttachStyleEnum.AttachOuterTopRight, "", location.href);
                    keepvid.bindEvent(el, downloadDiv);
                }
            }
        },

        nbcnews: function() {
            if (location.href.indexOf("nbcnews.com") >= 0) {
                var els = document.getElementsByClassName("tpVideoBlocker");
                for (var i = 0; i < els.length; i++) {
                    if (els[i].firstChild.tagName.toLowerCase() == "a") {
                        var downloadDiv = keepvid.attachButtonDiv(els[i].firstChild, AttachStyleEnum.AttachOuterTopRight, "", location.href);
                        keepvid.bindEvent(els[i].firstChild, downloadDiv);
                    }
                };
            }
        },

        youtubeButton: function() {            
			var desktopType = document.getElementsByTagName('body')[0].getAttribute('desktopType');
			if(desktopType!=undefined && desktopType!=null && desktopType!=''){
				return;
			}
            if (document.getElementById("KeepVid-Button")) return;
            var downloadDiv = document.createElement("div");
            downloadDiv.id = "KeepVid-Button";
            downloadDiv.setAttribute("float", "right");
            downloadDiv.style.width = 107 + 'px';
            downloadDiv.style.height = 37 + 'px';
            downloadDiv.style.backgroundImage = "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGsAAAAlCAYAAABF7RcQAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3ppVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTMyIDc5LjE1OTI4NCwgMjAxNi8wNC8xOS0xMzoxMzo0MCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpmYzU1NTE0Ny1hZjM2LTQ3NGItOTBlNS0xYjBiZmU2MGNmMjkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QTYyODQ4N0E2QkZCMTFFNjlGNUNENzEzOTIwRjVFNUIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QTYyODQ4Nzk2QkZCMTFFNjlGNUNENzEzOTIwRjVFNUIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUuNSAoTWFjaW50b3NoKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjVkYTFlYzI5LWE5ZDMtNGI2ZS05MTFmLTJjYzY5NWRmMzA4NyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpmYzU1NTE0Ny1hZjM2LTQ3NGItOTBlNS0xYjBiZmU2MGNm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)";
            downloadDiv.style.cursor = "pointer";
            downloadDiv.style.float = "right";
            downloadDiv.onclick = function () {
                var realLink = "http://keepvid.com/?url=" + location.href + "&from=plugin#downloader";
                myWindow1 = window.open(realLink, '_blank', '');
                myWindow1.focus();
            };
            var insertDiv = document.getElementById("watch-headline-title");
            var existEl = insertDiv.firstChild;
            insertDiv.insertBefore(downloadDiv, existEl);
        },

		soundcloudButton: function() {            
			var desktopType = document.getElementsByTagName('body')[0].getAttribute('desktopType');
			if(desktopType!=undefined && desktopType!=null && desktopType!=''){
				return;
			}
            if (document.getElementById("KeepVid-Button")) return;
            var downloadDiv = document.createElement("div");
            downloadDiv.id = "KeepVid-Button";
            downloadDiv.style.width = 74 + 'px';
            downloadDiv.style.height = 26 + 'px';
            downloadDiv.style.backgroundImage = "url(data:image/png;base64,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)";
            downloadDiv.style.cursor = "pointer";
            downloadDiv.style.right = "190px";
            downloadDiv.style.position = "absolute";
            downloadDiv.onclick = function () {
                var realLink = "http://keepvid.com/?url=" + location.href + "&from=plugin#downloader";
                myWindow1 = window.open(realLink, '_blank', '');
                myWindow1.focus();
            };
            var insertDivArr = document.getElementsByClassName("listenEngagement__footer sc-clearfix");
			if(insertDivArr.length>0){
				var existEl = insertDivArr[0].firstChild;
				insertDivArr[0].insertBefore(downloadDiv, existEl);
			}
        },

		CheckAllWebsiteLink:function(){            
			var desktopType = document.getElementsByTagName('body')[0].getAttribute('desktopType');
			if(desktopType!=undefined && desktopType!=null && desktopType!=''){
				return;
			}
            //console.log('asdasdas');
			var currentLinkUrl;
			var pattern = new RegExp('watch\?v=.*','gi');  //匹配单个script标签内容的写法
			var aLinklist = document.getElementsByTagName('a');
			var downloadButton;
            var currentLength = aLinklist.length;
            console.log(aLinklist.length);
            var needAddList = new Array();
            var addLinkList = new Array();
            var needAddIndex = 0;
			if(aLinklist== undefined || aLinklist == null || aLinklist.lengtj==0) return;
			for(var index = 0;index< currentLength; index++){
                currentLinkUrl ='';
                console.log(index+'    '+aLinklist.length+'    '+currentLength);
				if(aLinklist[index] == null || aLinklist[index]== undefined) continue;
				currentLinkUrl = aLinklist[index].getAttribute('href');
                //console.log('加载放出来的'+currentLinkUrl);
				if(currentLinkUrl==null ||currentLinkUrl==undefined) continue;
                if(currentLinkUrl.indexOf('savefrom.net')>=0){
                    aLinklist[index].parentNode.removeChild(aLinklist[index]);
                    continue;
                }
				if(currentLinkUrl.indexOf('youtube.com')>= 0 && currentLinkUrl.indexOf('watch?v=')>= 0){
                    //console.log('加载放出来的'+currentLinkUrl);
					currentLinkUrl = currentLinkUrl.substr(currentLinkUrl.indexOf('watch?v='));
                    needAddList[needAddIndex] = aLinklist[index];
                    addLinkList[needAddIndex]= 'https://www.youtube.com/'+ currentLinkUrl;
					//downloadButton = keepvid.CreateLinkDownloadButton(currentLinkUrl);
					//aLinklist[index].parentNode.appendChild(downloadButton);
				}
			}
            var decodeUrlstr;
            var Id;
            for(var i =0 ;i< needAddList.length;i++){
                decodeUrlstr = decodeURIComponent(addLinkList[i]);
                //console.log('解码:'+decodeUrlstr);
                if(decodeUrlstr.indexOf('url=')>=0){
                    decodeUrlstr = decodeUrlstr.substr(decodeUrlstr.indexOf('url=')+4);
                    //console.log('裁剪'+decodeUrlstr);
                    decodeUrlstr = "http://keepvid.com/?url=" + decodeUrlstr;
                }
                else{
                    decodeUrlstr = "http://keepvid.com/?url=" + decodeUrlstr;
                }
                //console.log('这是看看'+decodeUrlstr);
                downloadButton = keepvid.CreateLinkDownloadButton(decodeUrlstr);
                needAddList[i].parentNode.appendChild(downloadButton);
            }
		},

		CreateLinkDownloadButton:function(currentLinkUrl){
			var downloadspan = document.createElement("span");
			downloadspan.setAttribute("style", "padding: 0; margin: 0; margin-left: 5px;");
			downloadspan.style.cursor = "pointer";
			var btnDownload = document.createElement("a");
			btnDownload.setAttribute('href', currentLinkUrl);
			btnDownload.setAttribute('target', '_blank');
			btnDownload.setAttribute('style','background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3ppVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTMyIDc5LjE1OTI4NCwgMjAxNi8wNC8xOS0xMzoxMzo0MCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDoxMjNhM2U5ZC0xNzRlLTQ0MjktODVjMS05MTUwYzcyNjk2OWIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QTdGREVDRkVBQTJGMTFFNkI4N0NCRTM4OTEwNjEzNzUiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QTdGREVDRkRBQTJGMTFFNkI4N0NCRTM4OTEwNjEzNzUiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUuNSAoTWFjaW50b3NoKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjUzNGUwYTVkLWFkZDQtNGNkNy1hODAyLTlkNGMyNWQzMWJmZCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoxMjNhM2U5ZC0xNzRlLTQ0MjktODVjMS05MTUwYzcyNjk2OWIiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz73UvLHAAABDUlEQVR42mKROMzBAATKQNwBxC5ALMCAH3wA4j1AXAHEd1kYGJmVgIzTQCzIQBwAWRACxI5AbMbCyMjSQYJmZCAMxG1AA5jdcKl4avkWTEsfF8alxBXoBVZ+gnYxsuKSEQJ5gbB+PGpYGJgIG4BPDdAFrES4gJV4Ax4ZX8NQ9NjkNpwtd1YL1XEg/yFjnYtWOG2TP6fHgK6eCRzCSPjzv58MOpfsMTWfN2ZAVwvCTIzAAELHX/7/YNC94gzXrHDRnAGbOhAGReMnoBo+dBu//PvBoHjJmlA0vgclJFDGCGIgD+wFJeUqIMOJiFyILVdWAQOR5SYQWwLxZiD+ygByLn4MUrMRiC2A+DZAgAEACaouk2+RDtUAAAAASUVORK5CYII="); background-repeat: no-repeat; width: 16px; height: 16px; display: inline-block; border: none; text-decoration: none; padding: 0px; position: relative;');
            downloadspan.appendChild(btnDownload); 
			return downloadspan;
		},
		
        kvh_ap: function(obj) {

            //Create the XMLHttpRequest, cross-browser

            //Build object for GM_xmlhttpRequest()
            var gm_xhr = new Object();
            gm_xhr.url = obj.params.u;

            //Set method
            (obj.method!=undefined) ? gm_xhr.method=obj.method : gm_xhr.method="GET";
            if(obj.params.locationonly=="yes") gm_xhr.method="HEAD";

            //Set request headers
            gm_xhr.headers = new Object();
            if(obj.params.ua!=undefined) gm_xhr.headers["User-Agent"]=obj.params.ua;
            if(obj.params.postdata!=undefined) gm_xhr.headers["Content-Type"]="application/x-www-form-urlencoded";
            if(obj.params.referer!=undefined) gm_xhr.headers["Referer"]=obj.params.referer;

            //Set the Request body with postdata if it exists
            if(obj.params.postdata!=undefined){
                gm_xhr.method="POST";
                gm_xhr.data = obj.params.postdata;
            }

            //Set kvh_data textarea with the response when done
            if(obj.params.locationonly=="yes"){
                gm_xhr.onload = function(response) {
                    var loc="";
                    try{
                        loc = response.finalUrl;
                        if(loc=="") loc=response.responseHeaders.match(/Location: ([^\r\n]+)/i)[1];
                    }catch(ex){

                    }
                    document.getElementById("kvh_data").innerHTML=loc;
                }
            }else{
                gm_xhr.onload = function(response) {
                    document.getElementById("kvh_data").innerHTML=response.responseText;
                }
            }
            //Finally run GM_xmlhttpRequest()
            GM_xmlhttpRequest(gm_xhr);
        },

        main: function() {//找到关注对象,注册mouseover和mouseout事件,写入buttondiv,默认不显示
            if (location.href.indexOf("keepvid.") >= 0) {
                if(!document.location.href.match(/&mode=mp3/i)){
                    //Inject a variable telling the site that this Userscript is running
                    var el = document.createElement('script');
                    el.innerHTML='var kvh_ext = true;';
                    var head = document.head || document.getElementsByTagName('head')[0];
                    head.insertBefore(el, head.lastChild);

                    //Listen on the kvh_obj textarea for a new request to make
                    setInterval(function(){
                        try{
                            if(document.getElementById("kvh_obj").innerHTML.toString()!="~kv"){ //Check if the textarea contains a new request made by js on the site
                                //Define and clean up kvh_obj
                                var kvh_obj = document.getElementById("kvh_obj").innerHTML;
                                kvh_obj = kvh_obj.replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&amp;/g,"&");

                                //Parse the JSON paramters (all relevent to the cross-domain request to be made)
                                //Execute the request
                                keepvid.kvh_ap(JSON.parse(kvh_obj));

                                //Empty the textarea to make it re-useable
                                document.getElementById("kvh_obj").innerHTML="~kv";
                            }
                        }catch(ex){

                        }
                    },1);
                }
            } else if (location.href.indexOf("youtube") >= 0) {
                setInterval(keepvid.youtubeButton, 1000);
            } else if (location.href.indexOf("soundcloud") >= 0) {
                setInterval(keepvid.soundcloudButton, 1000);
            } else {
                //document.addEventListener('onload',keepvid.CheckAllWebsiteLink,false);
                document.addEventListener("mousemove", keepvid.handleDocumentMouseOverEvent, false);
                document.addEventListener("mouseover", keepvid.handleDocumentMouseOverEvent, false);//有些mousemove事件没响应,必须mouseover
                videoTags = document.getElementsByTagName("video");
                for (var i = 0; i < videoTags.length; i++) {
                    var downloadDiv = keepvid.attachButtonDiv(videoTags[i], AttachStyleEnum.AttachOuterTopRight, "", location.href);
                    keepvid.bindEvent(videoTags[i], downloadDiv);
                }
                embedTags = document.getElementsByTagName("embed");
                for (var i = 0; i < embedTags.length; i++) {
                    var downloadDiv = keepvid.attachButtonDiv(embedTags[i], AttachStyleEnum.AttachOuterTopRight, "", location.href);
                    keepvid.bindEvent(embedTags[i], downloadDiv);
                }
                objectTags = document.getElementsByTagName("object");
                for (var i = 0; i < objectTags.length; i++) {
                    var downloadDiv = keepvid.attachButtonDiv(objectTags[i], AttachStyleEnum.AttachOuterTopRight, "", location.href);
                    keepvid.bindEvent(objectTags[i], downloadDiv);
                }
                //iFrameTags = document.getElementsByTagName("iframe");
                //for (var i = 0; i < iFrameTags.length; i++) {
                //    var downloadDiv = keepvid.attachButtonDiv(iFrameTags[i], AttachStyleEnum.AttachOuterTopRight, "", location.href);
                //    keepvid.bindEvent(iFrameTags[i], downloadDiv);
                //}
            }
        }
    };
}
keepvid.main();