// ==SiteScript==
// @siteName Dodo動画
// @siteUrl http://dodo.jp.net/
// @author mayan
// @authorUrl
// @scriptUrl
// @description
// @date 2014/02/08
// @version 0.1
// ==/SiteScript==
function CravingSiteScript() {
this._initialize();
}
CravingSiteScript.prototype = {
_xhr: null,
_initialize: function() {},
_getXmlHttpRequest: function() {
if ( this._xhr != null ) {
return this._xhr;
}
var xhr = null;
var these = [
function() { return new XMLHttpRequest(); }
, function() { return new ActiveXObject( "Msxml2.XMLHTTP" ); }
, function() { return new ActiveXObject( "Microsoft.XMLHTTP" ); }
, function() { return new ActiveXObject( "Msxml2.XMLHTTP.4.0" ); }
];
for ( var i = 0, length = these.length; i < length; i++ ) {
var func = these[ i ];
try {
xhr = func();
break;
}
catch( e ) {}
}
this._xhr = xhr;
return this._xhr;
},
_load: function( url, data, method ) {
var req = this._getXmlHttpRequest();
var mtd = ( method == null ) ? "GET" : "POST";
req.open( mtd, url, false );
if ( mtd == "POST" ) {
req.setRequestHeader( "Content-Type", "application/x-www-form-urlencoded" );
}
req.send( data );
return req.responseText;
},
getResponseText: function( url, data, method ) {
return this._load( url, data, method );
},
getResponseJSON: function( url, data, method ) {
var text = this._load( url, data, method );
return eval( "("+text+")" );
},
/// Math
random: function( limit ) {
return Math.floor( Math.random() * limit );
},
/// String
decodeHtml: function( str ) {
return str.replace( /&(quot|#0*34);/ig, "\"" )
.replace( /&(amp|#0*38);/ig, "&" )
.replace( /&(apos|#0*39);/ig, "'" )
.replace( /&(lt|#0*60);/ig, "<" )
.replace( /&(gt|#0*62);/ig, ">" )
.replace( /&(nbsp|#0*160);/ig, " " )
.replace( /&(frasl|#8260);/ig, "/" );
}
}
var _DoDo = {};
_DoDo.showMsg = true;
function isSiteUrl( url ) {
if ( url.match( /http:\/\/dodo\.jp\.net\/archives\/\d+\.html/ ) ) return true;
return false;
}
function getVideoDetail( url ) {
if ( url.match( /http:\/\/dodo\.jp\.net\/archives\/(\d+)\.html/ ) ) {
var vid = RegExp.$1;
} else {
return null;
}
var craving = new CravingSiteScript();
try {
var text = craving.getResponseText( url );
} catch( e ) {
text = "";
}
if ( !text ) return null;
if ( text.match( /var\s+artc\s*=\s*(\{[\s\S]*?\})\s*;/m ) ) {
try {
var artc = ( new Function( "var a=" + RegExp.$1 + ";return a;" ) )();
} catch( e ) {
artc = null;
}
}
if ( !artc || typeof artc != "object" ) return null;
var site = artc.site? artc.site: "";
var surl = artc.url? artc.url: "";
var name = artc.name? artc.name: "";
if ( !site || !surl ) return null;
if ( text.match( /
]*?id\s*=\s*("|')?main-col\1[^>]*>\s*
]*)?>\s*(.*?)\s*<\/h1\s*>/im ) ) {
var title = craving.decodeHtml( RegExp.$2 );
}
if ( !title &&
text.match( /]*)?>\s*(.*?)\s*<\/title\s*>/im ) ) {
title = craving.decodeHtml( RegExp.$1 ).replace( /\s*|[^|]*$/,"" );
}
if ( !title ) title = "dodojpnet_" + vid;
title = title.replace(/[\\\/:*?"<>|]/g, "_");
if ( site == "outer" ) {
if ( _DoDo.showMsg ) {
var objBx = new clsMsgBox();
if ( objBx.isOK ) {
objBx.MsgBox( "外部ページへのリンクです。"
+ "\nname=" + name
+ "\nurl=" + surl
, "form dodojpnet.site.js", 0
);
}
}
return null;
}
var srcurl = "http://" + site + surl;
if ( srcurl.match( /:\/\/(?:[^\/?]+\.)?xvideos\.(?:com|jp)(?::\d+)?\// ) ) {
var type = "xvideos";
var script = "xvideos.site.js";
} else if ( srcurl.match( /:\/\/(?:[^\/?]+\.)?tube8\.com(?::\d+)?\// ) ) {
type = "tube8";
script = "Tube8.site.js";
} else {
type = "unknown";
}
var errMsg = "";
switch ( type ) {
case "xvideos":
case "tube8":
var objInc = new clsIncludeSiteScript();
if ( !objInc || !objInc.isOK ) {
errMsg = "objInc作成失敗。";
break;
}
var objScript = objInc.includeSiteScript( script );
if ( !objScript ) {
errMsg = "src=" + srcurl + "\nスクリプト " + script + " の読み込みに失敗";
break;
}
if ( !objScript.isSiteUrl( srcurl ) ) {
errMsg = "src=" + srcurl + "\nスクリプト " + script + " でURL不適合";
break;
}
var ret = objScript.getVideoDetail( srcurl );
if ( !ret ) {
errMsg = "src=" + srcurl + "\nスクリプト " + script + " で取得失敗";
break;
}
ret = objInc.replaceTitle( ret, title );
return ret;
break;
case "unknown":
if ( _DoDo.showMsg ) {
var objBx = new clsMsgBox();
if ( objBx.isOK ) {
var rtn = objBx.MsgBox( "このスクリプトで未対応です。"
+ "\nsrc=" + srcurl
+ "\n\nCraving Explorer へ送ってみますか?"
+ "\n(タイトルは動画配信元から取得したものになります)"
, "form dodojpnet.site.js", 3
);
if ( rtn == 6 ) sendCE( srcurl );
}
}
break;
default:
}
if ( _DoDo.showMsg && errMsg ) {
var objBx = new clsMsgBox();
if ( objBx.isOK ) {
objBx.MsgBox( "取得失敗。\n" + errMsg
, "form dodojpnet.site.js", 0
);
}
}
return null;
}
function clsIncludeSiteScript() {
var code1 = "(function(){\n\n";
var code2 = "\n\nreturn {'isSiteUrl':isSiteUrl,'getVideoDetail':getVideoDetail};})()";
var cePath = "\\CravingExplorer\\site-script\\";
this.isOK = false;
//initialize
try {
var appPath = ( new ActiveXObject( "WScript.Shell" ) ).SpecialFolders( "AppData" );
this.isOK = true;
} catch( e ) {
appPath = "";
this.isOK = false;
}
function evalScript( strFullPath, strCharset ) {
try {
var objStream = new ActiveXObject( "ADODB.Stream" );
objStream.Charset = strCharset;
objStream.Open();
objStream.LoadFromFile( strFullPath );
var obj = eval( "(" + code1 + objStream.ReadText() + code2 + ")" );
objStream.Close();
} catch( e ) {
obj = null;
}
if ( !obj || typeof obj != "object" ) return null;
if ( typeof obj.isSiteUrl != "function" ) return null;
if ( typeof obj.getVideoDetail != "function" ) return null;
return obj;
}
this.includeSiteScript = function ( strFileName ) {
if ( !this.isOK ) return null;
var strFullPath = appPath + cePath + strFileName;
var objS = evalScript( strFullPath, "unicode" );
if ( !objS ) objS = evalScript( strFullPath, "utf-8" );
return objS;
};
this.replaceTitle = function ( objRtn, title ) {
var count = 0;
var safe = 300;
while ( count < safe ) {
if ( objRtn[ "videoTitle" + count ] == undefined ) break;
count++;
}
if ( count <= 1 ) {
objRtn.videoTitle0 = title;
} else {
for ( var i = 0; i < count; i++ ) {
objRtn[ "videoTitle" + i ] = title + "_" + ( (i<9)?("0"+(i+1)):(""+(i+1)) );
}
}
return objRtn;
};
}
function sendCE( strUrl ) {
try {
var objCE = new ActiveXObject( "CravingExplorer.Api" );
var ret = objCE.addDownloadItem( strUrl, 'flv', true );
} catch( e ) {
}
return ret;
}
/* msgbox */
function clsMsgBox(){
//WScript.Shell Popup
this.isOK = false;
this._objShell = null;
this._initialize = function (){
try{
this._objShell = new ActiveXObject( "WScript.Shell" );
this.isOK = true;
} catch( e ) {
this.isOK = false;
}
}
this._initialize();
this.MsgBox = function ( msg, title, btn ){
if ( btn == undefined ) btn = 1;
//btn=1の時ret: OK:1, キャンセル:2
if ( this.isOK )
return this._objShell.Popup( msg, 0, title, btn+64 );
}
}
/* msgbox */