Lazy Embedded Video

Lazy load embedded videos from Youtube/Dailymotion/Vimeo/Rutube/Twitch/Ustream

目前为 2016-05-12 提交的版本。查看 最新版本

// ==UserScript==
// @name        Lazy Embedded Video
// @namespace   [email protected]
// @description Lazy load embedded videos from Youtube/Dailymotion/Vimeo/Rutube/Twitch/Ustream
// @version     2.1
// @include     *
// @resource    playIcon data:image/png;base64,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
// @grant       GM_getResourceURL
// ==/UserScript==

(function() {
	try {
		if(/youtube|dailymotion|vimeo|rutube|twitch|ustream/i.test(top.location.hostname))
			return;
	} catch(e) {}
    var testCSP = function() {
        if(!document.getElementById("zeusCSP")) {
            var script  = document.createElement("SCRIPT");
            script.id   = "zeusCSP";
            script.text = "CSP_AllowInlineScript = true;";
            document.head.appendChild(script);
        }
        return unsafeWindow.CSP_AllowInlineScript;
    };
	
    var html, a;
	var createHtml = function(url, iframe, api, background_img) {
		/(.*\/\/(?:[^.\/]+\.)?([^.\/]+)\.[^.\/]+)\//i.test(url);
		var provider_url = RegExp.$1, provider_name = RegExp.$2, data_convert = "", extra_script = "", button_hsb = [];
		if(api.includes("yahooapis"))
			data_convert += "data = data.query.results.json;";
		switch(provider_name) {
		case "youtube" :
			button_hsb.push(  0, 100, 100);
			data_convert += "delete data.thumbnail_url;";
			extra_script += "var img    = new Image();"+
							"img.onload = function() {"+
								"if(this.naturalWidth > 480)"+
									"document.body.style.backgroundImage = 'url('+this.src+')';"+
								"else if(this.src.includes('maxres'))"+
									"this.src = this.src.replace('maxres', 'sd');"+
							"};"+
							"img.src    = '"+background_img.match(/\/(.+)\//)[0]+"maxresdefault.jpg';";
			break;
		case "dailymotion" :
			button_hsb.push( 60,  30, 300);
			data_convert += "var img    = new Image();"+
							"img.onload = function() { document.body.style.backgroundImage = 'url('+this.src+')'; };"+
							"img.src    = data.thumbnail_url.replace(/\\/x240[^.]+/i, '');"+
							"delete data.thumbnail_url;";
			break;
        case "vimeo" :
			button_hsb.push(220,  50, 220);
			data_convert += "data.thumbnail_url = data.thumbnail_url.replace(/_\\d+/i, '');";
            break;
        case "rutube" :
			button_hsb.push(  0,   0, 250);
			data_convert += "data.thumbnail_url = data.thumbnail_url.replace(/\\?.+/i, '');";
            break;
		case "twitch" :
			button_hsb.push(270,  50, 100);
			if(background_img) { // channel live
				data_convert += "data.title         = data.status || 'Untitled Broadcast';"+
								"data.author_url    = '"+provider_url+"/'+data.name+'/profile';"+
								"data.author_name   = data.display_name;"+
								"data.duration      = data.game && 'playing <a target=_blank href=\""+provider_url+"/directory/game/'+data.game+'\">'+data.game+'</b>';"+
					            "offline_image      = data.video_banner;";
				extra_script += "function jsonpCallback2(data) {"+
									"if(data.streams.length != 0) return;"+
									"document.body.style.backgroundImage             = 'url('+offline_image+')';"+
									"document.getElementById('duration').textContent = 'offline';"+
								"}"+
					        "</script>"+
					        "<script defer src='https://api.twitch.tv/kraken/streams?channel="+url.match(/[^\/]+$/)[0]+"&callback=jsonpCallback2'>";
			} else { // video recorded
				data_convert += "data.thumbnail_url = data.preview.replace(/\\d+x\\d+/i, '0x0');"+
								"data.author_url    = '"+provider_url+"/'+data.channel.name+'/profile';"+
								"data.author_name   = data.channel.display_name;"+
								"data.duration      = data.length;";
			}
			break;
		case "ustream" :
			button_hsb.push( 40,  50, 230);
			if(background_img) // channel live
				data_convert += "delete data.thumbnail_url;";
			break;
		}
		if(!html) html = [
			"<!doctype html>"+
			"<html>"+
				"<head>"+
					"<title>Lazy Embedded Video</title>"+
					"<script defer src='", api, "&callback=jsonpCallback'></script>"+
					"<script>"+
						"function jsonpCallback(data) {",
							data_convert,
							"if(data.thumbnail_url) document.body.style.backgroundImage           = 'url('+data.thumbnail_url+')';"+
							"if(data.url)           document.getElementById('title').href         = data.url;"+
							"if(data.title)         document.getElementById('title').textContent  = "+
							                       "document.getElementById('title').title        = data.title;"+
							"if(data.author_url)    document.getElementById('author').href        = data.author_url;"+
							"if(data.author_name)   document.getElementById('author').textContent = data.author_name;"+
							"if(data.duration) {"+
								"if(Number(data.duration))"+
									 "document.getElementById('duration').textContent = new Date(data.duration*1000).toISOString().substr(11,8);"+
								"else document.getElementById('duration').innerHTML   = data.duration;"+
							"}"+
						"}",
						extra_script,
					"</script>"+
					"<style>"+
						"html { height: 100%; }"+
						"body {"+
							"margin: 0;"+
							"height: 100%;"+
							"background: black ", background_img, " center/100% no-repeat;"+
							"color: white;"+
							"font: 14px sans-serif;"+
						"}"+
						"a {"+
							"color: inherit;"+
							"font-weight: bold;"+
							"text-decoration: none;"+
						"}"+
						"a:hover { text-decoration: underline; }"+
						"ul {"+
							"margin: 0;"+
							"padding: 0;"+
							"list-style: none;"+
						"}"+
						"#infobar {"+
							"position: absolute;"+
							"top: 0px;"+
							"width: 100%;"+
							"padding: 8px 16px;"+
							"box-sizing: border-box;"+
							"background: rgba(0,0,0,0.5);"+
							"word-wrap: break-word;"+
						"}"+
						"#infobar_right {"+
							"float: right;"+
							"margin-left: 16px;"+
							"text-align: right;"+
							"text-transform: capitalize;"+
						"}"+
						"#button {"+
							"height: 100%;"+
							"cursor: pointer;"+
							"background-position: 0px 50%;"+
						"}"+
						"#button:hover {"+
							"background-position: -70px 50%;"+
							"filter: hue-rotate(", button_hsb[0], "deg) saturate(", button_hsb[1], "%) brightness(", button_hsb[2], "%);"+
							"-webkit-filter: hue-rotate(", button_hsb[0], "deg) saturate(", button_hsb[1], "%) brightness(", button_hsb[2], "%);"+
						"}"+
						"#button > div {"+
							"width: 70px;"+
							"height: 100%;"+
							"margin: auto;"+
							"background: url("+GM_getResourceURL("playIcon")+") no-repeat;"+
							"background-position: inherit;"+
						"}"+
						"#titleBlock {"+
   			    			"overflow: hidden;"+
   			    			"max-height: 34px;"+
						"}"+
					"</style>"+
				"</head>"+
				"<body>"+
					"<div id=button onclick='location.replace(\"", iframe, "\");'><div></div></div>"+
					"<div id=infobar>"+
						"<ul id=infobar_right>"+
							"<li><a id=author target=_blank></a></li>"+
							"<li><a id=provider target=_blank href='", provider_url, "'>", provider_name, "</a></li>"+
						"</ul>"+
						"<ul>"+
							"<li id=titleBlock><a id=title target=_blank href='", url, "'>", url, "</a></li>"+
							"<li id=duration></li>"+
						"</ul>"+
					"</div>"+
				"</body>"+
			"</html>"
		];
		html[ 1] = api;
		html[ 3] = data_convert;
		html[ 5] = extra_script;
		html[ 7] = background_img;
		html[ 9] = button_hsb[0];
		html[11] = button_hsb[1];
		html[13] = button_hsb[2];
		html[15] = button_hsb[0];
		html[17] = button_hsb[1];
		html[19] = button_hsb[2];
		html[21] = iframe;
		html[23] = provider_url;
		html[25] = provider_name;
		html[27] = url;
		html[29] = url;
	};
	
	var createOembed  = function(api, url) { return api+encodeURIComponent(url); };
	var createNOembed = function(api, url) { return createOembed("//noembed.com/embed?url=", location.protocol+url); };
	var createYOembed = function(api, url) { return createOembed("//query.yahooapis.com/v1/public/yql?format=json&q=",
											 'SELECT * FROM json WHERE url="'+createOembed(location.protocol+api,url)+'"'); };
	
	var createLazyVideo = function(elem) {
		if(elem.tagName == "IFRAME" && elem.srcdoc) return true;
        var id, args, url = elem.src || elem.data || elem.dataset.src;
        if(!url) return true;
        if(!a) a = document.createElement("A");
        a.href = url;
		/([^.]+)\.[^.]+$/i.test(a.hostname);
        switch(RegExp.$1) {
        case "youtube" :
            if(/\/(?:v|embed)\/([^&]*)/i.test(a.pathname))
				id = RegExp.$1 || (/[?&]v=([^&]+)/i.test(a.search) && RegExp.$1);
            if(!id || !testCSP()) return !id;
            args = "?autoplay=1";
            if(/[?&](list=[^&]+)/i.test(a.search))  args += "&"+RegExp.$1;
            if(/[?&](start=[^&]+)/i.test(a.search)) args += "&"+RegExp.$1;
			createHtml(url =
				"//www.youtube.com/watch"+args+"&v="+id,
				"//www.youtube.com/embed/"+id+args,
				createNOembed("//www.youtube.com/oembed?format=json&url=", url),
				"url(//i.ytimg.com/vi/"+id+"/hqdefault.jpg)"
			);
            break;
        case "dailymotion" :
            if(/\/(?:swf|embed)\/video\/([^&_]+)/i.test(a.pathname)) id = RegExp.$1;
            if(!id || !testCSP()) return !id;
            args = "?autoplay=1";
            if(/[?&](mute=[^&]+)/i.test(a.search))  args += "&"+RegExp.$1;
            if(/[?&](start=[^&]+)/i.test(a.search)) args += "&"+RegExp.$1;
			createHtml(url =
				"//www.dailymotion.com/video/"+id+args,
				"//www.dailymotion.com/embed/video/"+id+args,
				createOembed("//www.dailymotion.com/services/oembed?format=json&url=", location.protocol+url),
				"url(//www.dailymotion.com/thumbnail/video/"+id+")"
			);
            break;
        case "vimeo" :
            if(/\/(?:moogaloop\.swf|video\/)([^&]*)/i.test(a.pathname))
				id = RegExp.$1 || (/[?&]clip_id=([^&]+)/i.test(a.search) && RegExp.$1);
            if(!id || !testCSP()) return !id;
            args = "?autoplay=1";
            if(/[?&](loop=[^&]+)/i.test(a.search)) args += "&"+RegExp.$1;
            if(/(\#t=[\dhms]+)/i.test(a.hash))     args += RegExp.$1;
			createHtml(url =
				"//vimeo.com/"+id+args,
				"//player.vimeo.com/video/"+id+args,
				createOembed("//vimeo.com/api/oembed.json?url=", url)
			);
            break;
        case "rutube" :
            if(/\/play\/embed\/([^&.\/]+)/i.test(a.pathname)) id = RegExp.$1;
            if(!id || !testCSP()) return !id;
            args = "?autoStart=1";
            if(/[?&](bmstart=[^&]+)/i.test(a.search)) args += "&"+RegExp.$1;
			createHtml(url =
				"//rutube.ru/"+(isNaN(id) ? "video/"+id+"/" : "tracks/"+id+".html/")+args,
				"//rutube.ru/play/embed/"+id+args,
				createOembed("//rutube.ru/api/oembed/?format=jsonp&url=", url)
			);
            break;
        case "twitch" :
            if(/[?&](channel|video)=([^&]+)/i.test(a.search)) {args = RegExp.$1; id = RegExp.$2;}
			else if(/\/(.+)\/embed/i.test(a.pathname))        {args = "channel"; id = RegExp.$1;}
            if(!id || !testCSP()) return !id;
			createHtml(url =
				"//www.twitch.tv/"+(args=="video" ? id.replace("v","c/v/") : id),
				"//player.twitch.tv/?autoplay=true&"+args+"="+id,
				"https://api.twitch.tv/kraken/"+args+"s/"+id+"?",
				args=="channel" ? "url(//static-cdn.jtvnw.net/previews-ttv/live_user_"+id+"-0x0.jpg)" : null
			);
            break;
        case "ustream" :
            if(/(?:\/embed)?\/(channel\/|recorded\/)?([^&]+)/i.test(a.pathname)) {args = RegExp.$1 || "channel/"; id = RegExp.$2;}
            if(!id || !testCSP()) return !id;
			createHtml(url =
				"//www.ustream.tv/"+args+id,
				"//www.ustream.tv/embed/"+(args=="channel/" ? "" : args)+id+"?html5ui=1&autoplay=1",
				createYOembed("//www.ustream.tv/oembed?format=json&url=", url),
				args=="channel/" && !isNaN(id) ? "url(//static-cdn1.ustream.tv/i/channel/live/1_"+id+",640x360,b:0.jpg)" : null
			);
            break;
        default :
            return true;
        }
		if(elem.tagName != "IFRAME") {
			var iframe = document.createElement("IFRAME");
			iframe.id            = elem.id;
			iframe.className     = elem.className;
			iframe.style.cssText = elem.style.cssText;
			if(!iframe.style.width  && elem.width ) iframe.style.width  = elem.width+"px";
			if(!iframe.style.height && elem.height) iframe.style.height = elem.height+"px";
			if(elem.parentNode.tagName == "OBJECT") {
				elem = elem.parentNode;
				iframe.style.cssText = elem.style.cssText + iframe.style.cssText;
				if(!iframe.style.width  && elem.width ) iframe.style.width  = elem.width+"px";
				if(!iframe.style.height && elem.height) iframe.style.height = elem.height+"px";
			}
			if(!iframe.style.borderWidth)       iframe.style.borderWidth   = (elem.border||0)+"px";
			switch(elem.align) {
			case "left" : case "right" :
				if(!iframe.style.float)         iframe.style.float         = elem.align; break;
			case "top" : case "middle" : case "bottom" :
				if(!iframe.style.verticalAlign) iframe.style.verticalAlign = elem.align; break;
			}
			elem.parentNode.replaceChild(iframe, elem);
			elem = iframe;
		}
		elem.allowFullscreen = true;
		elem.srcdoc = html.join("");
        return true;
	};
	
    // convert NodeList to Array because for some reason sometimes I wasn't able to read src when iterating directly through NodeList
    var nodes = ["IFRAME", "EMBED", "OBJECT"].reduce(function(sum, value) {
        return sum.concat([].slice.call(document.getElementsByTagName(value)));
    }, frameElement ? [frameElement] : []);
	for(var	i = 0; i < nodes.length && createLazyVideo(nodes[i]); i++) {}
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址