Greasy Fork is available in English.

Dailymotion Raw Html5 Player

Replaces dailymotion's flash player with html5

נכון ליום 11-05-2016. ראה הגרסה האחרונה.

// ==UserScript==
// @name        Dailymotion Raw Html5 Player
// @namespace   zeusex81@gmail.com
// @description Replaces dailymotion's flash player with html5
// @version     2.0
// @include     http://www.dailymotion.com/*
// @include     https://www.dailymotion.com/*
// @grant       GM_addStyle
// @grant       GM_getValue
// @grant       GM_setValue
// ==/UserScript==
(function() {
	var player = document.getElementById("player");
	if(!player) return;
	for(var	i = 0, nodes = [].slice.call(document.getElementsByTagName("SCRIPT")); i < nodes.length; i++) {
		if(!/"metadata":(.+)}/.test(nodes[i].innerHTML))
			continue;
		var settings   = JSON.parse(GM_getValue("zeusDRHP", '["auto","auto","auto"]')),
			metadata   = JSON.parse(RegExp.$1),
		    qualities  = metadata.qualities,
			attributes = " controls preload=none poster='"+metadata.poster_url+"'",
			options    = "",
			url        = "",
			height     = parseInt(settings[0]) || screen.height;
		for(var k in qualities) {
			if(isNaN(k)) continue;
			for(i = 0; i < qualities[k].length; i++)
				options += "<option value='"+qualities[k][i].url+"'>"+k+"p</option>";
			if(!url || height >= parseInt(k))
				url = qualities[k][0].url;
		}
		if(!url) return;
		if(/[?&]start=([^&]+)/i.test(location.search))
			url += "#t="+RegExp.$1;
		if(settings[1] != "no" && (settings[1] == "yes" || 
		(/[?&]mute=([^&]+)/i.test(location.search) && !/^(false|0)$/i.test(RegExp.$1))))
			attributes += " muted";
		GM_addStyle(
			'#zeusPlayer {'+
			    'width: 100%;'+
			    'height: 100%;'+
			    'background-color: black;'+
			'}'+
			'#zeusInfobar {'+
			    'position: absolute;'+
			    'top: 0px;'+
			    'width: 100%;'+
			    'background-color: rgba(0,0,0,0.5);'+
			    'padding: 8px 16px;'+
			    'box-sizing: border-box;'+
			    'font: 14px sans-serif;'+
			    'word-wrap: break-word;'+
			    'color: white;'+
			    'visibility: hidden;'+
			'}'+
			'#zeusInfobar ul {'+
			    'list-style: none;'+
			'}'+
			'#zeusInfobar ul:first-child {'+
			    'float: right;'+
			    'margin-left: 16px;'+
			    'text-align: right;'+
			'}'+
			'#zeusInfobar select {'+
			    'border: 0px;'+
			    'background-color: transparent;'+
			    'color: inherit;'+
			'}'+
			'#zeusInfobar a {'+
			    'text-decoration: none;'+
			    'font-weight: bold;'+
			    'color: inherit;'+
			'}'+
			'#zeusInfobar a:hover {'+
			    'text-decoration: underline;'+
			'}'+
			'#zeusTitle {'+
   			    'overflow: hidden;'+
   			    'max-height: 34px;'+
			'}'+
			'#zeusDownloadButton, #zeusSettingsButton {'+
			    'display: inline-block;'+
			    'width: 14px;'+
			    'height: 14px;'+
			    'margin: 0px 4px;'+
			    'vertical-align: -4px;'+
			    'background-image: url(//i.imgur.com/wEwSssj.png);'+
			'}'+
			'#zeusSettingsButton {'+
			    'background-image: url(//i.imgur.com/B9zFVMK.png);'+
			    'cursor: pointer;'+
			'}'+
			'#zeusSettings {'+
			    'display: none;'+
			    'margin: 0px 4px;'+
			    'vertical-align: text-top;'+
			    'text-align: left;'+
			'}'+
			'#zeusSettings select {'+
			    'width: 100%;'+
			'}'
		);
		player.innerHTML = ""; // fix some weird bug causing invisible play in background
		player.parentNode.outerHTML =
			'<video id=zeusPlayer src="'+url+'"'+attributes+'></video>'+
			'<div id=zeusInfobar>'+
				'<ul>'+
			        '<li><a target=_blank href="'+metadata.owner.url+'">'+metadata.owner.screenname+'</a></li>'+
			        '<li>'+
			            '<table id=zeusSettings>'+
        			        '<tr>'+
		        	            '<td>Default quality:</td>'+
			                    '<td><select name=0>'+
			                        '<option>auto</option><option>240p</option><option>380p</option><option>480p</option>'+
			                        '<option>720p</option><option>1080p</option><option>1440p</option><option>2160p</option>'+
			                    '</select></td>'+
			                '</tr>'+
			                '<tr>'+
			                    '<td>Default mute:</td>'+
			                    '<td><select name=1>'+
			                        '<option>auto</option><option>yes</option><option>no</option>'+
			                    '</select></td>'+
			                '</tr>'+
			                '<tr>'+
			                    '<td>Default autoplay:</td>'+
			                    '<td><select name=2>'+
			                        '<option>auto</option><option>yes</option><option>no</option>'+
			                    '</select></td>'+
			                '</tr>'+
			            '</table>'+
			            '<a id=zeusSettingsButton title=Settings></a>'+
			            '<a id=zeusDownloadButton target=_blank title=Download href="'+url+'"></a>'+
			            '<select id=zeusQualities title=Quality>'+options+'</select>'+
			        '</li>'+
				'</ul>'+
				'<ul>'+
			        '<li id=zeusTitle><a target=_blank href="'+metadata.url+'">'+metadata.title+'</a></li>'+
			        '<li>'+new Date(metadata.duration*1000).toISOString().substr(11,8)+'</li>'+
				'</ul>'+
			'</div>';
		document.getElementById("zeusTitle").firstChild.title  = 
		document.getElementById("zeusDownloadButton").download = metadata.title; // didn't use attributes so I don't have to escape special chars
		player    = document.getElementById("zeusPlayer");
		metadata  = document.getElementById("zeusInfobar");
		options   = document.getElementById("zeusSettings");
		qualities = document.getElementById("zeusQualities");
		for(i = 0; i < qualities.options.length; i++)
			qualities.options[i].selected = url.startsWith(qualities.options[i].value);
		attributes = url = height = nodes = i = k = null;
		qualities.onchange = function() {
			var paused = player.paused;
			qualities.previousSibling.href = this.value;
			player.src = this.value+"#t="+player.currentTime;
			player.load();
			if(paused) player.pause();
			else       player.play();
		};
		qualities.onclick = function() {
			if(this.active) {
                this.blur();
            } else {
                this.style.backgroundColor = "black";
                this.active = true;
            }
		};
		qualities.onblur = function() {
            this.style.backgroundColor = "";
			this.active = false;
			player.onmousemove();
		};
		document.getElementById("zeusSettingsButton").onclick = function() {
			options.style.display = options.style.display ? "" : "inline-block";
			options.active = !options.active;
		};
		for(i = 0, nodes = options.getElementsByTagName("SELECT"); i < nodes.length; i++) {
			for(k = 0; k < nodes[i].options.length; k++)
				nodes[i].options[k].selected = settings[i] == nodes[i].options[k].text;
			nodes[i].onclick  = qualities.onclick;
			nodes[i].onblur   = qualities.onblur;
			nodes[i].onchange = nodes[0].onchange || function() {
				settings[parseInt(this.name)] = this.value;
				GM_setValue("zeusDRHP", JSON.stringify(settings));
			};
		}
		nodes = i = k = null;
		player.onpause =
		player.onended =
		metadata.onmouseenter = function() {
			if(metadata.timeout) clearTimeout(metadata.timeout);
			metadata.style.visibility = "visible";
		};
		player.onplay =
		player.onmousemove =
		metadata.onmouseleave = function() {
			metadata.onmouseenter();
			if(qualities.active || options.active || player.paused) return;
			metadata.timeout = setTimeout(player.onmouseleave, 2000);
		};
		player.onmouseleave = function() {
			if(qualities.active || options.active || player.paused) return;
			metadata.style.visibility = "";
		};
		if(settings[2] != "no" && (settings[2] == "yes" || !location.pathname.startsWith("/embed") ||
		(/[?&]autoPlay=([^&#]+)/i.test(location.search) && !/^(false|0)$/i.test(RegExp.$1))))
			player.play(); // can't use autoplay attribute because of play in background bug
		break;
	}
})();