dailymotionFlvGetter

By kasei-san Last update May 21, 2009 — Installed 621 times. Daily Installs: 7, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 6, 0, 0, 0, 0, 2, 1, 4, 4, 0, 0, 0, 3, 1, 0, 0, 1, 3

There are 3 previous versions of this script.

// ==UserScript==
// @name           dailymotionFlvGetter
// @namespace      http://d.hatena.ne.jp/kasei_san/
// @include        http://www.dailymotion.com/*
// ==/UserScript==
//
/*
   LICENSE : NYSL ( http://www.kmonos.net/nysl/NYSL.TXT )
*/


(function() {
	//-------------------------------------------------------------------------
	// AutoPagerizeでループする部分(検索結果とか)の処理
	//-------------------------------------------------------------------------
	// AutoPagerize対応
	if( window.AutoPagerize ) {
		// AutoPagerizeにて読み込み完了時に、引数のメソッドが呼ばれる
		window.AutoPagerize.addFilter( 
			function( doms ) {
				for( var i=0; i<doms.length; i++ ) {
					loop( doms[i] );
				}
			}
		 )
	}
	
	// 初回処理
	loop( document );

	function loop( dom ) {
		// プレビューのdom
		makeGetFlvLink(dom, "dmpi_video_preview");
		// 次へ or 前へのdom
		makeGetFlvLink(dom, "dmpi_video_prevnext");
	}

	// 動画のサムネイルの上にget Flvのリンク生成
	function makeGetFlvLink( dom, class ) {

		dmpi_video_previews = $C(class, dom);
		for( var i=0,l=dmpi_video_previews.length; i<l; i++ ) {
			var a = $T("a", dmpi_video_previews[i]);
			if( a.length <= 0 ) continue;
			var url = a[0].href;

			var div = document.createElement("div");
			var a  = document.createElement("a");
			a.innerHTML	= "[get FLV]";
			a.href		= "javascript:void(0);"
			a.id		= url;

			a.addEventListener(
					"click"
				,	function(e) {
						this.innerHTML = "";
						var img = document.createElement("img");
						img.src = lodingImg;
						this.appendChild( img );
						var opt = {
									method 	: 'GET'
								,	url		: this.id
								,	onerror	: function(res) { 
										log( "GM_xmlhttpRequest Err!" );
										this.innerHTML	= "[get FLV]";
									}
								,	onload	: function(res) {
										if ( res.status != 200 ) {
											log( "Status Code is " + res.status );
										}
											
										var dom = convertToHTMLDocument(res.responseText);
										var link = $T("link", dom);
										for( var i=0,l=link.length; i<l; i++ ) {
											if( link[i].rel == "video_src" ) {
												var url = link[i].href;
												downloadFlv($(opt.url), url);
												return;
											}
										}
										this.innerHTML	= "[get FLV]";
									}
							}

						window.setTimeout(
							function() {
									GM_xmlhttpRequest(opt)
								,	0
							}
						);
				}
				,	true
			);
			div.appendChild( a );

			if( class == "dmpi_video_prevnext" ) {
				div.setAttribute("style", "height:1.2em;");
				a.setAttribute("style", "height:1.2em;border:0;");

				var a2 = $T("a", dmpi_video_previews[i])[0];
				a2.parentNode.insertBefore( div, a2 );
			}else{
				div.appendChild( a );
				dmpi_video_previews[i].parentNode.insertBefore( div, dmpi_video_previews[i] );
			}
		}
	}


	// 対象のurlからflvのダウンロードを実施
	function downloadFlv( dom, url )
	{
		// プレイヤーのURLからdailymotionの動画のページのURLを取得
		if( !url.match( /http:\/\/www.dailymotion.com\/swf\/([^\?]+)\?/ ) ) {
			return;
		}
		var movieId = RegExp.$1;
		var nextUrl = "http://www.dailymotion.com/video/" + movieId;

		// 動画ページからFLVのURLを取得
		var opt = {
				method 	: 'GET'
			,	url		: nextUrl
			,	onerror	: function(res) { 
					log( "GM_xmlhttpRequest Err!" );
				}
			,	onload	: function(res) {
				
					if ( res.status != 200 ) {
						log( "Status Code is " + res.status );
					}
					
					if( !res.responseText.match( /addVariable\("video", "([^\"]+)"/mg )) {
						return;
					}
					
					var video = decodeURIComponent( RegExp.$1 );
					if( !video.match( /^(.+)@@spark/ ) ) {
						return;
					}

					var url = "http://www.dailymotion.com" + RegExp.$1;
					// どっちが良い?
					// location.replace(url);
					window.open(url);
				}
		}
		dom.innerHTML = "[get flv]";

		window.setTimeout(
				function() {
						GM_xmlhttpRequest(opt)
				}
			,	0
		);
	}

	//-------------------------------------------------------------------------
	// プレイヤーがあったら、それのダウンロードリンクも生成
	//-------------------------------------------------------------------------
	// プレイヤーのオブジェクトを取得
	var videoPlayer = getVideoPlayerObject();
	if( videoPlayer )
	{
		var video = decodeURIComponent( videoPlayer.getVariable("video") );
		if( video.match( /^(.+)@@spark/ ) )
		{
			var url = "http://www.dailymotion.com" + RegExp.$1;
			
			// ダウンロードリンクをタイトル部分につける
			var a  = document.createElement("a");
			a.innerHTML	= "[get FLV]";
			a.href		= url;

			$T( "h1", document )[0].appendChild( a );
		}
	}

	// プレイヤーのオブジェクトを取得
	function getVideoPlayerObject()
	{
		var dom = $C( "dm_widget_videoplayer", document )
		if( !dom || dom.length == 0 )
		{
			return null;
		}
		var dm_widget_videoplayer = dom[0];
		var div = $T( "div", dm_widget_videoplayer )[0];
		var id  = div.getAttribute( "id" );
		if( id.match( /video_player_(\w+)$/ ) )
		{
			var videoPlayerId = RegExp.$1;
			return unsafeWindow["so" + videoPlayerId];
		}
		return null;
	}

	//-------------------------------------------------------------------------
	// 動画ページのタブ押下時の処理
	//-------------------------------------------------------------------------
	// FLV取得済みかフラグ
	var gotFlvFlg = {};

	if(location.href.match("/playlist/")) {
		checkUpRelated_list_box("list_playlist");
		if($("list_related")) {
			$("related").addEventListener(
					"click"
				,	function(e) {
						checkUpRelated_list_box("list_related");
					}
				,	true
			);
		}

	}else{
		checkUpRelated_list_box("list_related");
		if($("list_playlist")) {
			$("list_playlist").addEventListener(
					"click"
				,	function(e) {
						checkUpRelated_list_box("list_playlist");
					}
				,	true
			);
		}
	}
	
	// member タブをクリックしたら、中身のflvリンクを取りに行く
	if($("link_member")) {
		$("link_member").addEventListener(
				"click"
			,	function(e) {
					checkUpRelated_list_box("list_member");
				}
			,	true
		);
	}

	// playlistsも同じく
	if($("link_playlists")) {
		$("link_playlists").addEventListener(
				"click"
			,	function(e) {
					checkUpRelated_list_box("list_playlists");
				}
			,	true
		);
	}

	// list_boxの中身がlodingでなかったら、flvのリンクを取りに行く
	function checkUpRelated_list_box(listId) {
		if( gotFlvFlg[listId] ) {
			return;
		}
		gotFlvFlg[listId] = false;

		var div = $(listId);
		if(!div) {
			gotFlvFlg[listId] = true;
			return;
		}
		var lodingDiv = ($T("div", div)[0]);
		if( !lodingDiv ) {
			gotFlvFlg[listId] = true;
			return;
		}
		
		// ロード中ならば、n秒後に試行
		if(lodingDiv.className.match("loading_text")) {
			// log(listId + " : loading...");
			window.setTimeout(
					function() {
							checkUpRelated_list_box(listId)
					}
				,	1000
			);
			return;
		}
		// log(listId + " : loaded");
		// flvリンク取得
		makeGetFlvLink(
				div
			,	( listId == "list_playlists" ) ? "dmpi_playlist_preview" : "dmpi_video_preview"
		);
		gotFlvFlg[listId] = true;
	}

	//-------------------------------------------------------------------------
	// common
	//-------------------------------------------------------------------------
	function convertToHTMLDocument(html) {
		var xsl = (new DOMParser()).parseFromString(
		'<?xml version="1.0"?>\
			<stylesheet version="1.0" xmlns="http://www.w3.org/1999/XSL/Transform">\
			<output method="html"/>\
		 </stylesheet>', "text/xml");

		var xsltp = new XSLTProcessor();
		xsltp.importStylesheet(xsl);

		var doc = xsltp.transformToDocument(document.implementation.createDocument("", "", null));
		doc.appendChild(doc.createElement("html"));

		var range = doc.createRange();
		range.selectNodeContents(doc.documentElement);
		doc.documentElement.appendChild(range.createContextualFragment(html));

		return doc;
	}

	function $(id) {
		return document.getElementById(id);
	}

	function $T(tab, dom) {
		if( !dom || dom == undefined ) {
			$T( tab, document );
		}
		return dom.getElementsByTagName(tab);
	}

	function $C(class, dom) {
		if( !dom || dom == undefined ) {
			$C( class, document );
		}

		var retnode = [];
		var myclass = new RegExp('\\b'+class+'\\b');
		var elem = dom.getElementsByTagName('*');
		for (var i = 0; i < elem.length; i++) {
			var classes = elem[i].className;
			if (myclass.test(classes)) retnode.push(elem[i]);
		}
		return retnode;
	}
	
	function log( str ) {
		if( console ) {
			console.log( str );
		} else {
			alert( str );
		}
	}
	
	var lodingImg = 
		'data:image/gif;base64,'+
		'R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH5BAAKAAAAIf4VTWFkZSBieSBB'+
		'amF4TG9hZC5pbmZvACH/C05FVFNDQVBFMi4wAwEAAAAsAAAAABAAEAAAAzMIutz+MMpJaxNjCDoI'+
		'GZwHTphmCUWxMcK6FJnBti5gxMJx0C1bGDndpgc5GAwHSmvnSAAAIfkEAAoAAAAsAAAAABAAEAAA'+
		'AzQIutz+TowhIBuEDLuw5opEcUJRVGAxGSBgTEVbGqh8HLV13+1hGAeAINcY4oZDGbIlJCoSACH5'+
		'BAAKAAAALAAAAAAQABAAAAM2CLoyIyvKQciQzJRWLwaFYxwO9BlO8UlCYZircBzwCsyzvRzGqCsC'+
		'We0X/AGDww8yqWQan78EACH5BAAKAAAALAAAAAAQABAAAAMzCLpiJSvKMoaR7JxWX4WLpgmFIQwE'+
		'MUSHYRwRqkaCsNEfA2JSXfM9HzA4LBqPyKRyOUwAACH5BAAKAAAALAAAAAAQABAAAAMyCLpyJytK'+
		'52QU8BjzTIEMJnbDYFxiVJSFhLkeaFlCKc/KQBADHuk8H8MmLBqPyKRSkgAAIfkEAAoAAAAsAAAA'+
		'ABAAEAAAAzMIuiDCkDkX43TnvNqeMBnHHOAhLkK2ncpXrKIxDAYLFHNhu7A195UBgTCwCYm7n20p'+
		'SgAAIfkEAAoAAAAsAAAAABAAEAAAAzIIutz+8AkR2ZxVXZoB7tpxcJVgiN1hnN00loVBRsUwFJBg'+
		'm7YBDQTCQBCbMYDC1s6RAAAh+QQACgAAACwAAAAAEAAQAAADMgi63P4wykmrZULUnCnXHggIwyCO'+
		'x3EOBDEwqcqwrlAYwmEYB1bapQIgdWIYgp5bEZAAADs=';


})();