// ==SiteScript==
// @siteName MTV IGGY
// @siteUrl http://www.mtviggy.com/
// @author mayan
// @authorUrl
// @scriptUrl
// @description RTMPDump CmdLine
// @date 2011/06/26
// @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|#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 _MTVIGGY = { };
_MTVIGGY.Err = new Array();
function isSiteUrl( url ) {
if ( url.match( /http:\/\/(www\.)?mtviggy\.com\/videos?\/[^\/]+/ ) ) return true;
if ( url.match( /http:\/\/(www\.)?mtviggy\.com\/content\/\d+/ ) ) return true;
return false;
}
function getVideoDetail( url ) {
url = url.replace( /http:\/\/mtviggy\.com\//, "http://www.mtviggy.com/" );
if ( url.match( /http:\/\/www\.mtviggy\.com\/videos?\/([^\/]+)/ ) ) {
var bk_title = RegExp.$1.replace( /-/g, " " );
} else if ( url.match( /http:\/\/www\.mtviggy\.com\/content\/(\d+)/ ) ) {
bk_title = "MtvIggy_" + RegExp.$1;
} else {
_MTVIGGY.Err.push( "URLが不適合" );
//return null;
bk_title = "MtvIggy_" + ( new Date() ).getTime();
}
var craving = new CravingSiteScript();
try {
var text = craving.getResponseText( url );
} catch( e ) {
_MTVIGGY.Err.push( e.description );
_MTVIGGY.Err.push( "url=" + url );
text = "";
}
if ( !text ) {
_MTVIGGY.Err.push( "ページの取得に失敗" );
return null;
}
if ( text.match( /]*?src\s*=\s*("|')(.*?)\1/ ) ) {
movie = RegExp.$2;
}
if ( !movie ) {
_MTVIGGY.Err.push( "movieurlの取得に失敗" );
return null;
}
if ( movie.match( /mgid:uma:video:mtviggy\.com:\d+/ ) )
var uri = RegExp.lastMatch;
if ( movie.match( /^\// ) && url.match( /http:\/\/[^\/]+/ ) )
movie = RegExp.lastMatch + movie;
try {
var objHttp = new ActiveXObject( "WinHttp.WinHttpRequest.5.1" );
objHttp.Option( 6 ) = false;
objHttp.Open( "GET", movie, false );
objHttp.Send();
var redurl = objHttp.getResponseHeader( "Location" );
} catch( e ) {
_MTVIGGY.Err.push( e.description );
_MTVIGGY.Err.push( "movie=" + movie );
redurl = "";
}
if ( !redurl ) {
_MTVIGGY.Err.push( "redurlの取得に失敗" );
//return null;
}
if ( redurl.match( /^http:\/\/[^?]+?\.swf/ ) ) {
var swfurl = RegExp.lastMatch;
} else {
_MTVIGGY.Err.push( "swfurlの取得に失敗" );
swfurl = "http://media.mtvnservices.com/player/prime/mediaplayerprime.1.8.1.swf";
}
if ( redurl.match( /[?]uri=([^?]+)/ ) ) uri = RegExp.$1;
if ( !uri ) {
_MTVIGGY.Err.push( "uriの取得に失敗" );
return null;
}
if ( redurl.match( /[?]CONFIG_URL=([^?]+)/ ) ) {
var configurl = decodeURIComponent( RegExp.$1 );
} else {
_MTVIGGY.Err.push( "configurlの取得に失敗" );
configurl = "http://media.mtvnservices.com/pmt/e1/players/mgid:uma:video:mtviggy.com:/config.xml?uri=" + uri;
}
try {
text = craving.getResponseText( configurl );
} catch( e ) {
_MTVIGGY.Err.push( e.description );
_MTVIGGY.Err.push( "configurl=" + configurl );
text = "";
}
if ( text.match( /(.+?)<\/feed>/ ) ) {
var feed = RegExp.$1;
feed = feed.replace( /{uri}/, encodeURIComponent( uri ) );
} else {
_MTVIGGY.Err.push( "feedurlの取得に失敗" );
feed = "http://www.mtviggy.com/feed-xml/?uri=" + encodeURIComponent( uri );
}
try {
text = craving.getResponseText( feed );
} catch( e ) {
_MTVIGGY.Err.push( e.description );
_MTVIGGY.Err.push( "feedurl=" + feed );
text = "";
}
if ( text.match( /]*?url\s*=\s*("|')(.*?)\1/ ) ) {
var contenturl = RegExp.$2;
} else {
_MTVIGGY.Err.push( "contenturlの取得に失敗" );
contenturl = "http://www.mtv.com/mtvworld/player/embed/site/includes/mediaGen.jhtml?uri=" + encodeURIComponent( uri );
}
if ( text.match( /(.+?)<\/media:title>/ ) ) {
var title = RegExp.$1.replace( /^\s*\s*$/, "" )
title = craving.decodeHtml( title ).replace( /(\d+);/g, function( a, b ){
return String.fromCharCode( parseInt( b ) ); } );
}
if ( !title ) title = bk_title;
title = title.replace(/[\\\/:*?"<>|]/g, "_");
try {
text = craving.getResponseText( contenturl );
} catch( e ) {
_MTVIGGY.Err.push( e.description );
_MTVIGGY.Err.push( "contenturl=" + contenturl );
text = "";
}
if ( !text ) {
_MTVIGGY.Err.push( "contentの取得に失敗" );
return null;
}
var objReg = /]*?)?>([\s\S]+?)<\/rendition>/mg ;
var arrData = new Array();
while( objReg.exec( text ) != null ) {
var prm = RegExp.$1;
var cnt = RegExp.$2;
var obj = { };
if ( cnt.match( /(.+?)<\/src>/ ) ) obj.url = RegExp.$1;
else continue;
obj.bitrate = ( prm.match( / bitrate\s*=\s*("|')(\d+)\1/ ) ? parseInt( RegExp.$2 ) : 0 );
obj.duration = ( prm.match( / duration\s*=\s*("|')(\d+)\1/ ) ? parseInt( RegExp.$2 ) : 0 );
obj.width = ( prm.match( / width\s*=\s*("|')(\d+)\1/ ) ? parseInt( RegExp.$2 ) : 0 );
obj.height = ( prm.match( / height\s*=\s*("|')(\d+)\1/ ) ? parseInt( RegExp.$2 ) : 0 );
obj.type = ( prm.match( / type\s*=\s*("|')(.+?)\1/ ) ? RegExp.$2 : "" );
arrData.push( obj );
}
if ( arrData.length <= 0 ) {
_MTVIGGY.Err.push( "Dataの取得に失敗" );
return null;
}
//for CE
/*
arrData.sort( function(a,b){ return b.bitrate - a.bitrate; } );
var rtmpdump = mkCmdLine( objData[0].url, swfurl, getFlashVer() );
return { videoTitle0: title, videoUrl0: rtmpdump };
*/
//for WSH
var objRet = { };
objRet.videoTitle0 = title;
objRet.videoUrl0 = "dummy";
objRet.swfurl = swfurl;
objRet.arrdata = arrData;
objRet.flashver = getFlashVer();
return objRet;
}
function getFlashVer(){
try {
var obj = new ActiveXObject( "ShockwaveFlash.ShockwaveFlash" );
var ver = obj.GetVariable( "$version" );
} catch( e ) {
return "";
}
if ( !ver ) return "";
return ver;
}
/* Craving Explorer の SiteScript ここで終わり */
/* WSH 動作用コード、ここから */
function mkCmdLine( strUrl, strSwfUrl, strFlashVer ) {
if ( !strUrl.match( /(rtmp[ets]*):\/\/([^\/]+)\/([^\/]+)\/(.+)/ ) ) return "";
var protocol = RegExp.$1;
var domain = RegExp.$2;
var app = RegExp.$3;
var ply = RegExp.$4;
var arr = ply.split( /[?]/ );
var outfile = arr[ 0 ].substr( arr[ 0 ].lastIndexOf( "/" ) + 1 );
if ( !outfile ) outfile = "mtvjpn_" + ( new Date() ).getTime();
outfile = outfile.replace(/[\\\/:*?"<>|]/g, "_");
var posD = arr[ 0 ].indexOf( ":" );
var posP = arr[ 0 ].lastIndexOf( "." );
if ( posP >= 0 ) var ext = arr[ 0 ].substr( posP + 1 );
if ( ext == "flv" ) {
arr[ 0 ] = arr[ 0 ].substr( 0, posP );
} else if ( posD < 0 ) {
if ( ext == "mp3" ) {
arr[ 0 ] = arr[ 0 ].substr( 0, posP );
} else if ( ext == "mp4" ) {
arr[ 0 ] = "mp4:" + arr[ 0 ];
}
}
ply = arr.join( "" );
var rtmpdump = "rtmpdump"
+ " -r \"" + protocol + "://" + domain + "/" + app + "\""
+ " -a \"" + app + "\""
+ ( strSwfUrl ? ( " -W \"" + strSwfUrl + "\"" ) : "" )
+ ( strFlashVer ? ( " -f \"" + strFlashVer + "\"" ) : "" )
+ " -y \"" + ply + "\""
+ " -o \"" + outfile + "\"";
return rtmpdump;
}
function clsInputBox(){
//VBScript InputBox
this.isOK = false;
this._objSC = null;
this._initialize = function (){
try {
this._objSC = new ActiveXObject( "ScriptControl" );
this.isOK = true;
} catch(e) {
this.isOK = false;
return;
}
this._objSC.Language = "VBScript";
this._objSC.AddCode( "Function VB_IB(p, t, d) : VB_IB = InputBox(p, t, d) : End Function" );
}
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 );
var strErr = _MTVIGGY.Err.join( "\n" );
if ( !objRet ){
WScript.Echo( "取得失敗\n\nErrMsg:\n" + strErr );
WScript.Quit();
}
var arrData = new Array();
if ( objRet.arrdata )
for ( var i = 0; i < objRet.arrdata.length; i++ )
arrData.push( "[ " + ( i + 1 ) + " ] "
+ "bitrate:" + objRet.arrdata[ i ].bitrate
+ " width:" + objRet.arrdata[ i ].width
+ " height:" + objRet.arrdata[ i ].height + "\n"
+ objRet.arrdata[ i ].url + "\n"
+ "cmdLine :\n" + mkCmdLine( objRet.arrdata[ i ].url, objRet.swfurl, objRet.flashver )
);
WScript.Echo(
"title:\n" + objRet.videoTitle0 + "\n\n"
+ ( strErr? ( "Warning:\n" + strErr + "\n\n" ) : "" )
+ arrData.join( "\n\n" )
);
/* WSH 動作用コード、ここまで */