// ==SiteScript==
// @siteName リアルガイド
// @siteUrl http://guide.jp.real.com/
// @author mayan
// @authorUrl
// @scriptUrl
// @description for RTMPDump
// @date 2011/12/05
// @version 0.1.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|#34);/ig, "\"" )
.replace( /&(amp|#38);/ig, "&" )
.replace( /&(apos|#39);/ig, "'" )
.replace( /&(lt|#60);/ig, "<" )
.replace( /&(gt|#62);/ig, ">" )
.replace( /&(nbsp|#160);/ig, " " )
.replace( /&(frasl|#8260);/ig, "/" );
}
}
var _RlGde = { };
_RlGde.Err = new Array();
function isSiteUrl( url ) {
if ( url.match( /http:\/\/guide\.jp\.real\.com\/[^\/]+\/synopsis_\d+\.htm/ ) ) return true;
/*
if ( url.match( /http:\/\/guide\.jp\.real\.com\/[^\/]+\/synopsis_embed_\d+\.htm/ ) ) return true;
if ( url.match( /http:\/\/guide\.jp\.real\.com\/[^\/]+\/slideshow\.htm\(?.+)/ )
&& RegExp.$1.match( /[?&]id=\d+/ ) ) return true;
*/
return false;
}
function getVideoDetail( url ) {
if ( url.match( /http:\/\/guide\.jp\.real\.com\/([^\/]+)\/synopsis_(embed_)?(\d+)\.htm/ ) ){
var channel = RegExp.$1
var vid = RegExp.$3;
}
else if ( url.match( /http:\/\/guide\.jp\.real\.com\/([^\/]+)\/slideshow\.htm(\?.+)/ ) ){
channel = RegExp.$1;
if ( RegExp.$2.match( /[?&]id=(\d+)/ ) ) vid = RegExp.$1;
}
else {
_RlGde.Err.push( "URLが不適合" );
return null;
}
if ( !vid ) {
_RlGde.Err.push( "vidの取得に失敗" );
return null;
}
var craving = new CravingSiteScript();
try {
var text = craving.getResponseText( url );
} catch( e ) {
_RlGde.Err.push( e.description );
text = "";
}
if ( !text ) {
_RlGde.Err.push( "ページの取得に失敗");
//return null;
}
if ( text.match( /
]*>\s*(.*?)\s*<\/h2>/m ) )
var title = craving.decodeHtml( RegExp.$1 );
if ( !title ) title = "RG_" + channel + "_" + vid;
title = title.replace(/[\\\/:*?"<>|]/g, "_");
if ( text.match( /Real\.Guide\.Channel\.Module\.Flvplayer\.embed\(\s*('|").*?\1\s*,\s*('|")(.*?)\2/ ) )
var realUrl = RegExp.$3;
if ( !realUrl ) {
_RlGde.Err.push( "realUrlの取得に失敗" );
//return null;
}
//return { videoTitle0: title, videoUrl0: realUrl };
//for wsh display
var objRet = { };
objRet.title = title;
objRet.realUrl = realUrl;
objRet.vid = vid;
objRet.channel = channel;
return objRet;
}
/* Craving Explorer の SiteScript ここで終わり */
/* WSH 動作用コード、ここから */
function clsInputBox(){
//VBScript InputBox
this.isOK = false;
this._objSC = null;
this._initialize = function (){
try {
this._objSC = new ActiveXObject( "ScriptControl" );
this._objSC.Language = "VBScript";
this._objSC.AddCode( "Function VB_IB(p, t, d) : VB_IB = InputBox(p, t, d) : End Function" );
this.isOK = true;
} catch(e) {
this.isOK = false;
return;
}
}
this._initialize();
this.InputBox = function (msg, title, def){
if ( this.isOK ){
return this._objSC.Run( "VB_IB", msg, title, def);
}
}
}
var objIBox = new clsInputBox();
if ( !objIBox ){
WScript.Echo( "InputBox 作成に失敗。終了します。" );
WScript.Quit();
}
var strUrl = objIBox.InputBox( "URL を入力してください。",
"from SiteScript", "http://" );
if ( !strUrl ) WScript.Quit();
if ( !isSiteUrl( strUrl ) ){
WScript.Echo( strUrl + "\nは、このスクリプトでは正しく扱えないかもしれません。" );
//WScript.Quit();
}
var objRet = getVideoDetail( strUrl );
if ( _RlGde.Err.length > 0 )
var strErr = "ErrorMsg:\n" + _RlGde.Err.join( "\n" ) + "\n\n";
else strErr = "";
if ( !objRet ){
WScript.Echo( strErr + "取得失敗" );
WScript.Quit();
}
var strCmdLine = "";
var strSlide = "";
var strEmbed = "";
if ( objRet.realUrl ){
if ( objRet.realUrl.match( /^rtmp/ ) )
strCmdLine = mkCmdLine( objRet );
} else {
var arrSlide = getSlide( objRet.vid, objRet.channel );
if ( arrSlide.length > 0 ) strSlide = arrSlide.join( "\n" );
strEmbed = getEmbed( objRet.vid, objRet.channel );
if ( strEmbed.match( /^rtmp/ ) ) {
var objRetEb = {};
objRetEb.realUrl = strEmbed;
objRetEb.channel = objRet.channel;
objRetEb.vid = objRet.vid;
var strCmdLineEb = mkCmdLine( objRetEb );
}
}
WScript.Echo(
( strErr ? strErr : "" )
+ "title:\n" + objRet.title + "\n\n"
+ "realUrl:\n" + ( objRet.realUrl ? objRet.realUrl : "取得失敗" ) + "\n\n"
+ ( strCmdLine ? ( "RTMPDumpCmdLine:\n" + strCmdLine + "\n\n" ) : "" )
+ ( strSlide ? ( "SlidePhotoUrl:\n" + strSlide + "\n\n" ) : "" )
+ ( strEmbed ? ( "埋め込み:\n" + strEmbed + "\n\n" ) : "" )
+ ( strCmdLineEb ? ( "RTMPDumpCmdLine:\n" + strCmdLineEb + "\n\n" ) : "" )
);
function mkCmdLine( objRet ){
if ( !objRet.realUrl ) return "";
var swfurl = "http://image.jp.real.com/partner/swf/real_flvplayer.swf";
var outfile = objRet.channel + "_" + objRet.vid + ".flv";
var cmdline = "rtmpdump"
+ " -r \"" + objRet.realUrl + "\""
+ " -W \"" + swfurl + "\""
+ " -o \"" + outfile + "\"";
return cmdline;
}
function getSlide( vid, channel ){
var arrRet = [ ];
var base = "http://guide.jp.real.com";
var xmlurl = "http://guide.jp.real.com/" + channel + "/photos_" + vid + ".xml";
var text = "";
try {
var objHttp = new ActiveXObject( "WinHttp.WinHttpRequest.5.1" );
objHttp.Option( 6 ) = false;
objHttp.Open( "GET", xmlurl, false );
objHttp.Send();
text = objHttp.responseText;
} catch( e ) {
text = "";
}
if ( !text ) return arrRet;
var objReg = /(.+?)<\/file>/g ;
while ( objReg.exec( text ) != null )
arrRet.push( base + RegExp.$1 );
return arrRet;
}
function getEmbed( vid, channel ){
var base = "http://guide.jp.real.com";
var xmlurl = "http://guide.jp.real.com/" + channel + "/synopsis_embed_" + vid + ".htm";
var text = "";
try {
var objHttp = new ActiveXObject( "WinHttp.WinHttpRequest.5.1" );
objHttp.Option( 6 ) = false;
objHttp.Open( "GET", xmlurl, false );
objHttp.Send();
text = objHttp.responseText;
} catch( e ) {
text = "";
}
if ( !text ) return "";
if ( text.match( /Real\.Guide\.Channel\.Module\.Flvplayer\.embed\(\s*('|").*?\1\s*,\s*('|")(.*?)\2/ )
&& RegExp.$3 )
return RegExp.$3;
if ( text.match( /]*?name\s*=\s*("|')src\2[^>]*)>/ )
&& RegExp.$1.match( / value\s*=\s*("|')(.*?)\1/ ) )
var rmurl = RegExp.$2;
if ( !rmurl ) return "";
try {
objHttp.Option( 6 ) = true;
objHttp.Open( "GET", rmurl, false );
objHttp.Send();
text = objHttp.responseText;
} catch( e ) {
text = "";
}
if ( !text ) return "";
text = text.replace( /^\s+/, "" ).replace( /\s+$/, "" ).replace( /\.$/, "" );
return text;
}
/* WSH 動作用コード、ここまで */