2014年4月11日金曜日

Craving Explorer Dailymotionのスクリプトを追加する

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 */


----------------------------------------------------------------------------------