Native video player

By dmig Last update Oct 3, 2008 — Installed 1,461 times. Daily Installs: 7, 9, 6, 7, 1, 5, 2, 1, 10, 3, 8, 3, 5, 8, 4, 3, 7, 3, 4, 3, 2, 5, 8, 3, 2, 1, 4, 1, 7, 2, 2, 6
// ==UserScript==
// @name          Native video player
// @namespace     http://dmitriy.geels.googlepages.com/
// @description   Watch flash video embeds with MPlayer/Xine/VLC
// @include       *beerbottle.ru/*
// @include       *blogs.mail.ru/*
// @include       *doseng.org/*
// @include       *li.ru/*
// @include       *life.ru/*
// @include       *lj-toys.com/*
// @include       *lj-toys.ru/*
// @include       *maniacworld.com/*
// @include       *news2.ru/story/*
// @include       *nnm.ru/*
// @include       *rutube.ru/*
// @include       *video.google.com/videoplay*
// @include       *voffka.com/*
// @include       *yaplakal.com/*
// ==/UserScript==

var mimetype = 'video/flv';
// embed height adjust value for totem plugin
var controls_height = 27;

var players = document.getElementsByTagName('embed');
GM_log(players.length);

if(players.length > 0) {
	var fmt = '';
	var playerQueue = {};
	var format = GM_getValue('mplayer_format', 'default');
	switch (format) {
	  case '6':
		if (video_info.fmt_map) {
		  fmt = '&fmt=6';
		  break;
		}
	  case '18':
		fmt = '&fmt=18';
		break;
	}
	GM_registerMenuCommand('YouTube: ~200kpbs mono', function() {
	  GM_setValue('mplayer_format', 'default');
	  location.reload();
	});

	GM_registerMenuCommand('YouTube: ~512kbps stereo', function() {
	  GM_setValue('mplayer_format', '18');
	  location.reload();
	});
/*
	GM_registerMenuCommand('YouTube: ~900 kbps mono', function() {
	  GM_setValue('mplayer_format', '6');
	  location.reload();
	});
*/
	for(i=players.length-1; i >= 0; i--) {
		var player = players[i];
		var src = player.src;
			GM_log(src);
		if(!src) continue;

		if(src.indexOf('rutube.ru') != -1) {
			var url = false;
			//we're on rutube
			if(document.location.hostname.indexOf('rutube.ru') != -1) {
				var tmp = player.getAttribute('flashvars');
				if(tmp) tmp = tmp.match(/file=([\w\.%]+)\&/);
				if(tmp[1]) url = unescape(tmp[1]);
			//or elsewhere
			} else {
				var tmp = src.match(/video\.rutube\.ru\/(\w+)/);
				if(tmp[1])
					url = 'http://bl.rutube.ru/' + tmp[1] + '.iflv';
			}
			if(url)
				replaceObject(player, url);
		} else if(src.indexOf('img.mail.ru/r/video/player_full_size.swf') != -1) {
			var tmp = src.match(/par=(.+)$/);
			if(!tmp[1]) continue;

			var url = tmp[1].replace(/^(http:\/\/video\.mail\.ru\/.+)\/\$(\d+)\$\d+\$\d+$/, "$1/v-$2.flv");
			replaceObject(player, url);
		} else if(document.location.hostname.indexOf('google.com') != -1) {
			var url = src.match(/.+videoUrl=([^&]+)&.+$/);
			GM_log(url);
			if(!url[1]) continue;
			url = unescape(url[1]);

			replaceObject(player, url);
		} else if(document.location.hostname.indexOf('maniacworld.com') != -1) {
			var tmp = player.getAttribute('flashvars');
			tmp = tmp.match(/file=([^&]+)(?:&|$)/);
			if(!tmp[1]) continue;

			var off = document.location.href.lastIndexOf('/');
			var url = document.location.href.substr(0, off+1) + tmp[1];
			replaceObject(player, url);
		} else if(src.indexOf('yapfiles.ru') != -1) {
			var tmp = src.match(/file=([^&]+)(?:&|$)/);
			if(!tmp[1]) continue;

			var url = tmp[1];
			replaceObject(player, url);
		} else if(src.indexOf('blogger.com') != -1) {
			var tmp = src.match(/videoUrl=([\w\.%\-_]+)&/);
			if(!tmp[1]) continue;

			var url = unescape(tmp[1]);
			replaceObject(player, url);
		} else if(src.indexOf('youtube') != -1) {
			var key = src.match(/youtube\.\w+\/v\/([\w\-]+)(?:&|$)/);
			if(!key[1]) continue;
			key = key[1];

			playerQueue[key] = player;
			var tmp = {
					'method': 'GET',
					'url': src,
					'onload': function(responseDetails) {
						var url = false;
						if(responseDetails.status == 200) {
							url = responseDetails.finalUrl;
						} else if (responseDetails.status == 302 || responseDetails.status == 303) {
							url = responseDetails.responseHeaders.match(/Location: ([^\n]*)\n/);
							if(url[1]) url = url[1];
							else url = false;
						}
						if(!url) return;

						var tmp = url.match(/youtube\..+video_id=([\w\-]+)&.+t=([\w\-]+)&?.*$/);
						if(tmp[1] && tmp[2]) {
							url = 'http://youtube.com/get_video?video_id=' + tmp[1] + '&t=' + tmp[2] + fmt;
							replaceObject(playerQueue[tmp[1]], url);
							delete playerQueue[tmp[1]];
						}
					}
				};
			GM_xmlhttpRequest(tmp);
		} else if(src.indexOf('myvi.ru') != -1) {
			var key = src.match(/myvi\.ru\/\w+\/\w+\/\w+\/([\w\-]{22})[\w\-]+$/);
			if(!key[1]) continue;
			key = key[1];

			playerQueue[key] = player;
			var tmp = {
					'method': 'GET',
					'url': src,
					'onload': function(responseDetails) {
						var url = false;
						if(responseDetails.status == 200) {
							url = responseDetails.finalUrl;
						} else if (responseDetails.status == 302 || responseDetails.status == 303) {
							url = responseDetails.responseHeaders.match(/Location: ([^\n]*)\n/);
							if(url[1]) url = url[1];
							else url = false;
						}
						if(!url) return;

						var tmp = url.match(/myvi\.ru.+\?(c=[\w\-]+)(?:&.+)?&v=(\d+)(?:&.+)?&m=([\w\-\.\/%]+)(?:$|\/)/);
						if(tmp[1] && tmp[2] && tmp[3]) {
							url = unescape(tmp[3]) + tmp[2] + '.flv?' + tmp[1];
							var key = tmp[1].substr(2, 22);
							replaceObject(playerQueue[key], url);
							delete playerQueue[key];
						}
					}
				};
			GM_xmlhttpRequest(tmp);
		} else if(src.indexOf('life.ru') != -1) {
			var tmp = player.getAttribute('flashvars');
			if(!tmp) continue;
			tmp = tmp.match(/cfgurl=(.+)$/);
			if(!tmp[1]) continue;
			src = 'http://life.ru' + tmp[1];
			var key = src.match(/media\/video\/\w+\/(\w{32})\..+$/);
			if(!key[1]) continue;
			key = key[1];

			playerQueue[key] = player;
			var tmp = {
					'method': 'GET',
					'url': src,
					'onload': function(responseDetails) {
						var url = false;
						if(responseDetails.status == 200) {
							url = responseDetails.finalUrl;
						} else if (responseDetails.status == 302 || responseDetails.status == 303) {
							url = responseDetails.responseHeaders.match(/Location: ([^\n]*)\n/);
							if(url[1]) url = url[1];
							else url = false;
						}
						if(!url) return;

						var key = url.match(/media\/video\/\w+\/(\w{32})\..+$/);
						if(key[1]) {
							key = key[1];
							var tmp = responseDetails.responseText.match(/video=['"](\/media\/video\/\w+\/\w{32}\.flv)['"]/);
							if(tmp && tmp[1]) {
								url = 'http://life.ru' + tmp[1];
								replaceObject(playerQueue[key], url);
							}
							delete playerQueue[key];
						}
					}
				};
			GM_xmlhttpRequest(tmp);
		}
	}
}

function replaceObject(embed, src) {
	var width = embed.width;
	var height = parseInt(embed.height) + controls_height;
	var parent = embed.parentNode;
	if(parent && parent.tagName == 'OBJECT') {
		embed = parent;
		parent = parent.parentNode;
	}
	if(!parent) return false;

	var new_embed = document.createElement('object');
	new_embed.setAttribute('width', width);
	new_embed.setAttribute('height', height);
	new_embed.setAttribute('loop', 'no');
	new_embed.setAttribute('autoplay', 'no');
	new_embed.setAttribute('type', mimetype);
	new_embed.setAttribute('data', src);

	parent.replaceChild(new_embed, embed);
	return true;
}