Dailymotion.site.js を
Program File (X86) → CravingExplorer → site-script に コピーする
----------------------------------------------------------------------------------
// ==SiteScript==
// @siteName Dailymotion
// @siteUrl http://www.dailymotion.com/jp
// @author tuck / k38 / mayan
// @authorUrl http://www.crav-ing.com/
// @scriptUrl http://archive.crav-ing.com/site-script/
// @version 1.0.0.9
// @description revised by mayan, 2013/07/15
// ==/SiteScript==
function decodeHtml( str ) {
return str.replace( /&(quot|#34);/ig, "\"" )
.replace( /&(amp|#38);/ig, "&" )
.replace( /&(apos|#39);/ig, "'" )
.replace( /&(lt|#60);/ig, "<" )
.replace( /&(gt|#62);/ig, ">" )
.replace( /&(nbsp|#160);/ig, " " )
.replace( /&(#91);/ig, "[" )
.replace( /&(#93);/ig, "]" )
.replace( /&(frasl|#8260);/ig, "/" )
.replace( /&#(\d+);/ig, function(a,b){return String.fromCharCode(parseInt(b,10));} );
}
function isSiteUrl( url ) {
if ( url.match( /http:\/\/www.dailymotion.com\/.*\/video\// ) ) {
return true;
}
if ( url.match( /http:\/\/www.dailymotion.com\/video\// ) ) {
return true;
}
return false;
}
function getVideoDetail( url ) {
var ChkAuto = false;
var ChkRedirect = false;
try {
http = new ActiveXObject( "Msxml2.XMLHTTP" );
}
catch ( e ) {
http = null;
}
if ( http == null ) {
return null;
}
try {
http.open( 'GET', url, false );
http.send();
}
catch ( e ) {}
if ( http.responseText == null ) {
return null;
}
http.responseText.match( /<meta property="og:title" content="([^"]*)"[^>]*>/ );
var title = RegExp.$1;
var realUrl;
var retUrl;
http.responseText.match( /"sequence"\s*:\s*"([^"]*)"/ );
var text = decodeURIComponent( RegExp.$1 );
if ( text.match( /"hd1080URL":"(.*?)"/ ) ) {
realUrl = RegExp.$1;
}
else if ( text.match( /"hd720URL":"(.*?)"/ ) ) {
realUrl = RegExp.$1;
}
else if ( text.match( /"hqURL":"(.*?)"/ ) ) {
realUrl = RegExp.$1;
}
else if ( text.match( /"sdURL":"(.*?)"/ ) ) {
realUrl = RegExp.$1;
}
else if ( text.match( /"ldURL":"(.*?)"/ ) ) {
realUrl = RegExp.$1;
}
if ( realUrl ) {
retUrl = realUrl.replace( /\\\//g, "/" );
if ( ChkRedirect ) retUrl = chkRedirect( retUrl, http );
return { videoTitle0: decodeHtml( title ), videoUrl0: retUrl };
}
//video_url
if ( text.match( /"video_url":"(.*?)"/ ) ) {
var video_url = decodeURIComponent( RegExp.$1 );
}
//embed
var objE = getVideoDetail_embed( url, http );
realUrl = objE.stream_h264_hd1080_url
|| objE.stream_h264_hd_url
|| objE.stream_h264_hq_url
|| objE.stream_h264_url
|| video_url
|| objE.stream_h264_ld_url;
if ( realUrl ) {
retUrl = realUrl;
if ( ChkRedirect ) retUrl = chkRedirect( retUrl, http );
return { videoTitle0: decodeHtml( title ), videoUrl0: retUrl };
}
//autoURL
if ( ChkAuto ) {
if ( text.match( /"autoURL":"([^"]+)"/ ) ) {
var autoURL = RegExp.$1.replace( /\\\//g, "/" );
var ret = chkManifest( autoURL, http );
if ( ret != null ) {
return { videoTitle0: decodeHtml( title ), videoUrl0: ret.tempurl };
}
}
}
return null;
}
function chkRedirect( retUrl, http ) {
var chkUrl = retUrl
+ ( ( retUrl.indexOf( "?" ) >= 0 )? "&": "?" )
+ "redirect=0";
try {
http.open( "GET", chkUrl, false );
http.send();
var rdtUrl = http.responseText;
} catch( e ) {
rdtUrl = "";
}
if ( !rdtUrl ) return retUrl;
rdtUrl = decodeURI( rdtUrl.replace( /^\s+/, "" ).replace( /\s+$/, "" ) );
if ( !rdtUrl.match( /^https?:\/\/([^\/]+\.)?dmcdn\.net(:\d+)?\// ) &&
!rdtUrl.match( /^https?:\/\/(proxy|drm|stream|usp)-(\d+|ec)\.([^\/]+\.)?(dailymotion\.com|dmcloud\.net)(:\d+)?\// )
) {
return retUrl;
}
rdtUrl = rdtUrl.split( "#" )[0].replace( /([?&])redirect=0/, "$1redirect=1" )
+ ( ( rdtUrl.indexOf( "?" ) >= 0 )? "&": "?" )
+ "v=2.7.6"
+ "&fp=" + getFlashVer().replace( " ", "%20" )
+ "&r=" + getCacheBustString()
+ "&g=" + getCacheBustString( 12 );
return rdtUrl;
}
function getCacheBustString( intLn ) {
if ( intLn == undefined ) intLn = 5;
var str = "";
for ( var i = 0; i < intLn; i++ )
str = str + ( String.fromCharCode( 65 + Math.round(Math.random() * 25) ) );
return str;
}
function getFlashVer(){
try {
var obj = new ActiveXObject( "ShockwaveFlash.ShockwaveFlash" );
var ver = obj.GetVariable( "$version" );
} catch( e ) {
return "";
}
if ( !ver ) return "";
return ver;
}
/* embed route */
function getVideoDetail_embed( url, http ) {
var arrFn = [ "stream_h264_hd1080_url", "stream_h264_hd_url", "stream_h264_hq_url",
"stream_h264_url", "stream_h264_ld_url",
"stream_hls_url" ];
var title = "title";
var objRet = { title:"" };
for ( var i = 0; i < arrFn.length; i++ ) objRet[ arrFn[i] ] = "";
objRet.isOK = false;
if ( url.match( /http:\/\/(?:www\.)?dailymotion\.com\/(?:[^\/?&#]*\/)*video\/([0-9A-Za-z]+)/ ) ) {
var vid = RegExp.$1;
} else {
return objRet;
}
var embedurl = "http://www.dailymotion.com/embed/video/" + vid;
try {
http.open( "GET", embedurl, false );
http.send();
var text = http.responseText;
} catch( e ) {
//_DM.err.push( e.description );
text = "";
}
if ( !text ) {
//_DM.err.push( "embedコンテンツの取得に失敗。squrl=" + embedurl );
return objRet;
}
objRet.isOK = true;
var objFv = new clsFv( text );
for ( var i = 0; i < arrFn.length; i++ ) {
objRet[ arrFn[i] ] = removeBS( objFv.getFv( arrFn[i] ) );
}
objRet[ title ] = decodeUc( objFv.getFv( title ) );
if ( !objRet[ "title" ] &&
text.match( /<title(?:\s+[^>]*)?>\s*(.*?)\s*<\/title\s*>/i ) ) {
objRet[ "title" ] = decodeHtml( RegExp.$1 );
}
return objRet;
}
function clsFv( strSequence ) {
this.sequence = strSequence;
this.getFv = function ( strFn ) {
var strReg0 = "[{,]\\s*(\"|')?" + strFn + "\\1\\s*:\\s*";
var strReg1 = '"([^"]+)"\\s*[},]';
var strReg2 = "'([^']+)'\\s*[},]";
var objReg1 = new RegExp( strReg0 + strReg1 );
var objReg2 = new RegExp( strReg0 + strReg2 );
if ( objReg1.test( this.sequence ) ||
objReg2.test( this.sequence ) ) {
return RegExp.$2;
} else {
return "";
}
};
}
function removeBS( str ) {
return str.replace( /\\\//g, "/" );
}
function decodeUc( str ) {
return str.replace( /\\u([0-9A-Fa-f]{4})/g, function(a,b){return String.fromCharCode(parseInt(b,16));} )
.replace( /\+/g, " " );
}
/* embed route end */
/* check manifest */
function chkManifest( strAutoUrl, http ) {
var Extension = ".mp4";
if ( !strAutoUrl.match( /^http:\/\/[^\/]+\/.*?\.mnft/ ) ) return null;
try {
http.open( "GET", strAutoUrl, false );
http.send();
var objJ = eval( "(" + http.responseText + ")" );
} catch( e ) {
objJ = null;
}
if ( !objJ || typeof( objJ ) != "object" ||
!objJ.alternates || !( objJ.alternates instanceof Array ) ) return null;
var arrDat = [];
for ( var i = 0; i < objJ.alternates.length; i++ ) {
var objAlt = objJ.alternates[i];
if ( !objAlt || typeof( objAlt ) != "object" ) continue;
if ( !objAlt.template || typeof( objAlt.template ) != "string" ||
!objAlt.template.match( /^http:\/\/[^\/]+\/.*?\.mnft/ ) ) continue;
var objTmp = {};
objTmp.tempurl = objAlt.template.replace( ".mnft", Extension ).split( "#" )[0];
objTmp.name = ( typeof( objAlt.name ) == "string" )? objAlt.name: "";
objTmp.bitrate = ( typeof( objAlt.bitrate ) == "number" )? objAlt.bitrate: 0;
objTmp.codecs = ( typeof( objAlt.codecs ) == "string" )? objAlt.codecs: "";
objTmp.width = ( typeof( objAlt.width ) == "number" )? objAlt.width: 0;
objTmp.height = ( typeof( objAlt.height ) == "number" )? objAlt.height: 0;
arrDat.push( objTmp );
}
if ( arrDat.length <= 0 ) return null;
arrDat.reverse();
arrDat.sort( function(a,b){
if ( a.bitrate != b.bitrate ) return b.bitrate - a.bitrate;
if ( a.width != b.width ) return b.width - a.width;
if ( a.height != b.height ) return b.height - a.height;
return 0;
} );
var objRet = null;
for ( var i = 0; i < arrDat.length; i++ ) {
if ( chkLink( arrDat[i].tempurl, http ) ) {
objRet = arrDat[i];
break;
}
}
return objRet;
}
function chkLink( url, objHttp ) {
var LowerLimit = 400000;
var status = 0;
var strLength = "";
try {
objHttp.open( "HEAD", url, false );
objHttp.send();
status = objHttp.status;
strLength = objHttp.getResponseHeader( "Content-Length" );
} catch( e ) {}
if ( typeof( strLength ) != "string" ) strLength = "";
try {
var len = parseInt( strLength, 10 );
} catch( e ) {
len = 0;
}
if ( isNaN( len ) ) len = 0;
if ( status != 200 || len < LowerLimit ) return false;
else return true;
}
/* check manifest end */
----------------------------------------------------------------------------------