// ==SiteScript==
// @siteName Myplay direct Videos
// @siteUrl http://www.myplay.com/videos
// @author mayan
// @authorUrl
// @scriptUrl
// @description
// @date 2011/11/23
// @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 _MyPlay = {};
_MyPlay.Err = [];
_MyPlay.showAll = false;
function isSiteUrl( url ) {
if ( url.match( /http:\/\/(www\.)?myplay\.com\/videos\/[^\/]+\/[^\/?]+/ ) ) return true;
return false;
}
function getVideoDetail( url ) {
_MyPlay.Err = [];
if ( url.match( /http:\/\/(www\.)?myplay\.com\/videos\/([^\/]+)\/([^\/?]+)/ ) ) {
var bk_artist = RegExp.$2;
var bk_title = RegExp.$3;
} else {
_MyPlay.Err.push( "URLが不適合" );
//return null;
}
var craving = new CravingSiteScript();
try {
var text = craving.getResponseText( url );
} catch( e ) {
_MyPlay.Err.push( e.description );
text = "";
}
if ( !text ) {
_MyPlay.Err.push( "ページの取得に失敗" );
return null;
}
if ( text.match( /]*?name\s*=\s*("|')@videoPlayer\2[^>]*)>/ )
&& RegExp.$1.match( / value\s*=\s*("|')(\d+)\1/ ) ) {
var videoId = RegExp.$2;
} else {
_MyPlay.Err.push( "videoIdの取得に失敗" );
return null;
}
if ( text.match( /]*?name\s*=\s*("|')publisherID\2[^>]*)>/ )
&& RegExp.$1.match( / value\s*=\s*("|')(\d+)\1/ ) ) {
var publisherId = RegExp.$2;
} else {
_MyPlaye.Err.push( "publisherIdの取得に失敗" );
publisherId = "59121";
}
/*
if ( text.match( /]*?name\s*=\s*("|')playerID\2[^>]*)>/ )
&& RegExp.$1.match( / value\s*=\s*("|')(\d+)\1/ ) ) {
var playerId = RegExp.$2;
} else {
_MyPlaye.Err.push( "playerIdの取得に失敗" );
playerId = "10274538001";
}
*/
var playerId = "10172910001"; //embed player
if ( text.match( /
(.+?)<\/h1>/ ) ) {
var bk_title_page = RegExp.$1;
}
var objBinary = new clsGetBinary();
if ( !objBinary.isOK ) {
_People.Err.push( "binary data の作成に失敗" );
return null;
}
getSendData( objBinary, videoId, playerId );
var amfurl = "http://c.brightcove.com/services/messagebroker/amf?playerId=" + playerId;
var objHttp = craving._getXmlHttpRequest();
try {
objHttp.Open( "POST", amfurl, false );
objHttp.setRequestHeader( "Content-Type", "application/x-amf" );
objHttp.Send( objBinary.senddata );
} catch( e ) {
_MyPlay.Err.push( e.description + "\namfurl=" + amfurl );
return null;
}
var objByte = new clsGetByteCode( objHttp.responseBody );
if ( !objByte.isOK ) {
_MyPlay.Err.push( "objByte作成に失敗" );
return null;
}
var objAMF = new clsAMF();
try {
var objBody = objAMF.decodeAMF( objByte.toByteArray() ).messages[ 0 ].body;
} catch( e ) {
_MyPlay.Err.push( e.description );
objBody = null;
}
if ( !objBody || typeof( objBody ) != "object" ) {
_MyPlay.Err.push( "objBodyの作成失敗" );
return null;
}
try {
var objDTO = objBody.programmedContent.videoPlayer.mediaDTO;
} catch( e ) {
_MyPlay.Err.push( "objDTOの作成に失敗1" );
return null;
}
if ( typeof( objDTO ) != "object" ) {
_MyPlay.Err.push( "objDTOの作成に失敗2" );
return null;
}
if ( objDTO.FLVFullLengthURL ) var FLVFullLengthURL = objDTO.FLVFullLengthURL;
else FLVFullLengthURL = "";
var arrRdt = objDTO.renditions;
if ( typeof( arrRdt ) != "object" || !arrRdt.length ) {
_MyPlay.Err.push( "arrRdt取得に失敗" );
return null;
}
var arrData = [];
for ( var i = 0; i < arrRdt.length; i++ ) {
if ( typeof( arrRdt[ i ] ) != "object" ) continue;
if ( !arrRdt[ i ].defaultURL ) continue;
var obj = {};
obj.URL = arrRdt[ i ].defaultURL;
if ( obj.URL == FLVFullLengthURL ) obj.def = true;
else obj.def = false;
obj.width = ( arrRdt[ i ].frameWidth? arrRdt[ i ].frameWidth: 0 );
obj.height = ( arrRdt[ i ].frameHeight? arrRdt[ i ].frameHeight: 0 );
obj.codec = ( arrRdt[ i ].videoCodec? arrRdt[ i ].videoCodec: "" );
obj.rate = ( arrRdt[ i ].encodingRate? arrRdt[ i ].encodingRate: 0 );
if ( arrRdt[ i ].size && typeof( arrRdt[ i ].size ) == "number" ) {
obj.size = Math.floor( arrRdt[ i ].size );
} else {
obj.size = 0;
}
arrData.push( obj );
}
if ( !FLVFullLengthURL && arrData.lenght <= 0 ) {
_MyPlay.Err.push( "Dataの取得に失敗" );
return null;
}
var title = objDTO.displayName;
if ( !title && bk_title ) {
title = bk_title.replace( /-/g, " " )
+ ( bk_artist? ( " - " + bk_artist.replace( /-/g, " " ) ): "" );
}
if ( !title && bk_title_page ) title = bk_title_page;
if ( !title ) title = "myplay_" + videoId;
title = title.replace(/[\\\/:*?"<>|]/g, "_");
var swfurl = getSwfUrl();
var flashver = getFlashVer();
//for CE
/*
if ( arrData.length > 0 ) {
arrData.sort( function ( a, b ){ return b.size - a.size; } );
var realUrl = arrData [ 0 ].URL;
} else {
realUrl = FLVFullLengthURL;
}
var rtmpdump = ( new clsMkCmdLine( realUrl, videoId, publisherId, playerId, flashver, swfurl, url, bk_title ) ).mkCmdLine();
return { videoTitle0: title, videoUrl0: rtmpdump };
*/
//for WSH
var objRet = {};
objRet.url = url;
objRet.swfurl = swfurl;
objRet.flashver = flashver;
objRet.bk_title = bk_title;
objRet.playerId = playerId;
objRet.publisherId = publisherId;
objRet.videoId = videoId;
objRet.title = title;
objRet.FLVFullLengthURL = FLVFullLengthURL;
objRet.arrData = arrData;
return objRet;
}
function getSwfUrl(){
var defaulturl = "http://admin.brightcove.com/viewer/us20111118.0654/federatedVideo/BrightcovePlayer.swf";
var url = "http://c.brightcove.com/services/viewer/federated_f9";
try {
var objHttp = new ActiveXObject( "WinHttp.WinHttpRequest.5.1" );
objHttp.Open( "HEAD", url, false );
objHttp.Send();
var booturl = objHttp.Option( 1 );
} catch( e ) {
return defaulturl;
}
if ( !booturl ) return defaulturl;
var baseurl = booturl.substr( 0, booturl.lastIndexOf( "/" ) + 1 );
return baseurl + "federatedVideo/BrightcovePlayer.swf";
}
function getFlashVer(){
try {
var obj = new ActiveXObject( "ShockwaveFlash.ShockwaveFlash" );
var ver = obj.GetVariable( "$version" );
} catch( e ) {
return "";
}
if ( !ver ) return "";
return ver;
}
function getSendData( objBny, contentId, experiencId ){
//embed data
var arrHeader = [
0x00, 0x03, 0x00, 0x00, 0x00, 0x01
];
var arrBodyHe = [
0x00, 0x46, //target
0x63, 0x6f, 0x6d, 0x2e, 0x62, 0x72, 0x69, 0x67,
0x68, 0x74, 0x63, 0x6f, 0x76, 0x65, 0x2e, 0x65,
0x78, 0x70, 0x65, 0x72, 0x69, 0x65, 0x6e, 0x63,
0x65, 0x2e, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69,
0x65, 0x6e, 0x63, 0x65, 0x52, 0x75, 0x6e, 0x74,
0x69, 0x6d, 0x65, 0x46, 0x61, 0x63, 0x61, 0x64,
0x65, 0x2e, 0x67, 0x65, 0x74, 0x44, 0x61, 0x74,
0x61, 0x46, 0x6f, 0x72, 0x45, 0x78, 0x70, 0x65,
0x72, 0x69, 0x65, 0x6e, 0x63, 0x65,
0x00, 0x02, //response
0x2f, 0x31
];
var arrBodyCo1 = [
0x00, 0x00, 0x01, 0x75, //body length
0x0a, 0x00, 0x00, 0x00, 0x02, //array,element2
0x02, 0x00, 0x28,
0x64, 0x31, 0x30, 0x61, 0x30, 0x62, 0x33, 0x65,
0x62, 0x66, 0x61, 0x62, 0x36, 0x64, 0x63, 0x61,
0x34, 0x66, 0x61, 0x30, 0x34, 0x39, 0x62, 0x36,
0x64, 0x37, 0x33, 0x36, 0x31, 0x36, 0x65, 0x30,
0x65, 0x62, 0x61, 0x62, 0x38, 0x36, 0x63, 0x32,
0x11, 0x0a, 0x63, 0x63,
0x63, 0x6f, 0x6d, 0x2e, 0x62, 0x72, 0x69, 0x67,
0x68, 0x74, 0x63, 0x6f, 0x76, 0x65, 0x2e, 0x65,
0x78, 0x70, 0x65, 0x72, 0x69, 0x65, 0x6e, 0x63,
0x65, 0x2e, 0x56, 0x69, 0x65, 0x77, 0x65, 0x72,
0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x65, 0x6e,
0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
0x74,
0x19,
0x64, 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x79,
0x54, 0x79, 0x70, 0x65,
0x21,
0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4f,
0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73,
0x13,
0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x4b, 0x65,
0x79,
0x07,
0x55, 0x52, 0x4c,
0x19,
0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x65, 0x6e,
0x63, 0x65, 0x49, 0x64,
0x11,
0x54, 0x54, 0x4c, 0x54, 0x6f, 0x6b, 0x65, 0x6e,
0x05,
0x7f, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00,
0x09, 0x03, 0x01, 0x0a, 0x81, 0x03, 0x53,
0x63, 0x6f, 0x6d, 0x2e, 0x62, 0x72, 0x69, 0x67,
0x68, 0x74, 0x63, 0x6f, 0x76, 0x65, 0x2e, 0x65,
0x78, 0x70, 0x65, 0x72, 0x69, 0x65, 0x6e, 0x63,
0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
0x74, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64,
0x65,
0x13,
0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x49,
0x64,
0x0d,
0x74, 0x61, 0x72, 0x67, 0x65, 0x74,
0x19,
0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52,
0x65, 0x66, 0x49, 0x64,
0x1b,
0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x64,
0x52, 0x65, 0x66, 0x49, 0x64,
0x1b,
0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52,
0x65, 0x66, 0x49, 0x64, 0x73,
0x15,
0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x64,
0x49, 0x64,
0x15,
0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x49,
0x64, 0x73,
0x17,
0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54,
0x79, 0x70, 0x65,
0x05
];
// + num, contentId
//0x42, 0x67, 0x3c, 0x65, 0x3f, 0xda, 0x20, 0x00, //num, contentId
var arrBodyCo2 = [
0x06, 0x17,
0x76, 0x69, 0x64, 0x65, 0x6f, 0x50, 0x6c, 0x61,
0x79, 0x65, 0x72,
0x01,
0x01,
0x01,
0x05,
0x7f, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00,
0x01,
0x04, 0x00,
0x06, 0x01,
0x06, 0x0b,
0x65, 0x6d, 0x62, 0x65, 0x64,
0x05
];
// + num, experienceId
//0x42, 0x02, 0xf2, 0xd2, 0x4d, 0x88, 0x00, 0x00, //num, experienceId
var arrBodyCo3 = [
0x06, 0x01
];
var objStream = new ActiveXObject( "ADODB.Stream" );
objStream.type = 1;
objStream.Open();
objStream.Position = 0;
for ( var i = 0; i < arrHeader.length; i++ )
objStream.Write( objBny.fromByteCode( arrHeader[i] ) );
for ( var i = 0; i < arrBodyHe.length; i++ )
objStream.Write( objBny.fromByteCode( arrBodyHe[i] ) );
for ( var i = 0; i < arrBodyCo1.length; i++ )
objStream.Write( objBny.fromByteCode( arrBodyCo1[i] ) );
var arrTmp = toDoubleByte( contentId );
for ( var i = 0; i < arrTmp.length; i++ )
objStream.Write( objBny.fromByteCode( arrTmp[i] ) );
for ( var i = 0; i < arrBodyCo2.length; i++ )
objStream.Write( objBny.fromByteCode( arrBodyCo2[i] ) );
var arrTmp = toDoubleByte( experiencId );
for ( var i = 0; i < arrTmp.length; i++ )
objStream.Write( objBny.fromByteCode( arrTmp[i] ) );
for ( var i = 0; i < arrBodyCo3.length; i++ )
objStream.Write( objBny.fromByteCode( arrBodyCo3[i] ) );
objStream.Position = 0;
objBny.senddata = objStream.Read();
objStream.Close();
}
function toDoubleByte( strNum ){
//integer only
var intNum = parseInt( strNum );
if ( intNum == 0 ){
var strBi = padozero( "", 64 );
} else {
var sig = ( intNum > 0 ) ? "0" : "1";
intNum = Math.abs( intNum );
var man = intNum.toString(2);
var exp = zeropad( ( man.length - 1 + 1023 ).toString(2), 11 );
man = padzero( man.substring(1), 52 );
strBi = sig + exp + man;
}
var arr = new Array(7);
for ( var i = 0; i < 8; i++ ){
arr[i] = parseInt( strBi.substr( i * 8, 8 ), 2 );
}
return arr;
}
function padzero( strNum, keta ){
for ( var i = strNum.length; i < keta; i++ ) strNum += "0";
return strNum;
}
function zeropad( strNum, keta ){
for ( var i = strNum.length; i < keta; i++ ) strNum = "0" + strNum;
return strNum;
}
function makeNumberArr( strNum ){
var arr = [];
arr.push( 0 );
return arr.concat( toDoubleByte( strNum ) );
}
function clsGetBinary(){
this.isOK = false;
this._objStream = null;
this._binaryNone;
this._initialize = function (){
try {
this._objStream = new ActiveXObject( "ADODB.Stream" );
this.isOK = true;
} catch(e) {
this.isOk = false;
return false;
}
this._objStream.Open();
this._objStream.type = 1;
this._binaryNone = this._objStream.Read( 0 );
this._objStream.Close();
return true;
}
this._initialize();
this.fromByteCode = function ( intByteCode ){
if ( !this.isOK ) return this._binaryNone;
if ( intByteCode < 0 || 255 < intByteCode ) return this._binaryNone;
this._objStream.Open();
this._objStream.type = 2;
this._objStream.Charset = "Unicode";
this._objStream.WriteText( String.fromCharCode( intByteCode ) );
this._objStream.Position = 0;
this._objStream.type = 1;
this._objStream.Position = 2;//big endian
var binary = this._objStream.Read( 1 );
this._objStream.Close();
return binary;
}
}
function clsGetByteCode( binarydata ){
this._binary = binarydata;
this.isOK = false;
this.size = 0;
this._objSC = null;
this._initialize= function (){
try {
this._objSC = new ActiveXObject( "ScriptControl" );
this.isOK = true;
} catch(e) {
this.isOK = falae;
this.size = 0;
return false;
}
this._objSC.Language = "VBScript";
this._objSC.AddCode( "Function VB_getSize( bin ) : VB_getSize = LenB( bin ) : End Function" );
this._objSC.AddCode( "Function VB_getByte( bin, pos ) : VB_getByte = AscB( MidB( bin, pos, 1 ) ) : End Function" );
this.size = this._objSC.Run( "VB_getSize", this._binary );
return true;
}
this._initialize();
this.byteCodeAt = function ( index ){
//arg:index0-, ret: Number
if ( !this.isOK ) return 0;
if ( index < 0 || this.size <= index ) return 0;
return this._objSC.Run( "VB_getByte", this._binary, index + 1 );
}
/*
this.percentEncode = function (){
var arr = [];
for ( var i = 0; i < this.size; i++ ){
if ( this.byteCodeAt( i ) <= 15 )
arr.push( "%0" + this.byteCodeAt(i).toString(16).toUpperCase() );
else if ( this.byteCodeAt( i ) <= 31 )
arr.push( "%" + this.byteCodeAt(i).toString(16).toUpperCase() );
else if ( this.byteCodeAt( i ) <= 127 )
arr.push( String.fromCharCode( this.byteCodeAt(i) ) );
else
arr.push( "%" + this.byteCodeAt(i).toString(16).toUpperCase() );
}
return arr.join( "" );
}
this.percentAllEncode = function (){
var arr = [];
for ( var i = 0; i < this.size; i++ ){
if ( this.byteCodeAt( i ) <= 15 )
arr.push( "%0" + this.byteCodeAt(i).toString(16).toUpperCase() );
else
arr.push( "%" + this.byteCodeAt(i).toString(16).toUpperCase() );
}
return arr.join( "" );
}
*/
this.toByteArray = function (){
var arr = [];
for ( var i = 0; i < this.size; i++ ) arr.push( this.byteCodeAt(i) );
return arr;
}
}
function clsMkCmdLine( rtmpurl, vidId, pubId, plyId, flashver, swfurl, url, vid ) {
this.rtmpurl = rtmpurl? rtmpurl: "";
this.vidId = vidId? vidId: "";
this.pubId = pubId? pubId: "";
this.plyId = plyId? plyId: "";
this.flashver = flashver? flashver: "";
this.swfurl = swfurl? swfurl: "";
this.url = url? url: "";
this.vid = vid? vid: "";
this.mkCmdLine = function ( rtmpurl ) {
if ( !rtmpurl ) rtmpurl = this.rtmpurl;
if ( !rtmpurl ) return "";
var arr = rtmpurl.split( "&" );
var tclurl = arr[ 0 ].replace( /\/$/, "" );
var path = arr[ 1 ]? arr[ 1 ]: "";
var time = arr[ 2 ]? arr[ 2 ]: "";
var hash = arr[ 3 ]? arr[ 3 ]: "";
var tail = "";
for ( var i = 4; i < arr.length; i++ ) tail = tail + "&" + arr[ i ];
if ( tclurl.match( /(rtmp[ets]*):\/\/([^\/]+)(:\d+)?\/(.+)/ ) ) {
var protocol = RegExp.$1;
var domain = RegExp.$2;
var port = RegExp.$3.replace( /^:/, "" );
var app = RegExp.$4.replace( /\/$/, "" );
}
var prm = "?videoId=" + this.vidId + "&lineUpId=&pubId=" + this.pubId
+ "&playerId=" + this.plyId + "&affiliateId=";
var filename = path.substr( path.lastIndexOf( "/" ) + 1 );
if ( path.match( /^mp4:/ ) ) var extention = ".mp4";
else extention = ".flv";
if ( !filename ) filename = "myplay_" + ( this.vid? this.vid: ( new Date() ).getTime() ) + extention;
filename = filename.replace(/[\\\/:*?"<>|]/g, "_");
var rtmpdump = "rtmpdump"
+ " -r \"" + tclurl + prm + "\""
+ ( app? ( " -a \"" + app + prm + "\"" ): "" )
+ ( this.flashver? ( " -f \"" + this.flashver + "\"" ): "" )
+ ( this.swfurl? ( " -W \"" + this.swfurl + "\"" ): "" )
+ ( this.url? ( " -p \"" + this.url + "\"" ): "" )
+ " -C B:0 -C S:\"" + path + "&" + time + "&" + hash + tail + "\""
+ " -y \"" + path + prm + "\""
+ " -o \"" + filename + "\"";
return rtmpdump;
};
}
function clsAMF() {
/* amf.js をクラスで囲う。
function decodeAMF を一部書き換え */
var window = {};
/* amf.js ここから */
/*
amf.js - An AMF library in JavaScript
Copyright (c) 2010, James Ward - www.jamesward.com
All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are
permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this list of
conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, this list
of conditions and the following disclaimer in the documentation and/or other materials
provided with the distribution.
THIS SOFTWARE IS PROVIDED BY JAMES WARD ''AS IS'' AND ANY EXPRESS OR IMPLIED
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JAMES WARD OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
The views and conclusions contained in the software and documentation are those of the
authors and should not be interpreted as representing official policies, either expressed
or implied, of James Ward.
*/
this.decodeAMF = function(data)
{
var bytes = new a3d.ByteArray(data, a3d.Endian.BIG);
//console.log(dumpHex(bytes));
var version = bytes.readUnsignedShort();
bytes.objectEncoding = a3d.ObjectEncoding.AMF0;
var response = new a3d.AMFPacket();
var remainingBytes;
// Headers
var headerCount = bytes.readUnsignedShort();
for (var h = 0; h < headerCount; h++)
{
var headerName = bytes.readUTF();
var mustUnderstand = bytes.readBoolean();
bytes.readInt(); // Consume header length...
// Handle AVM+ type marker
if (version == a3d.ObjectEncoding.AMF3)
{
var typeMarker = bytes.readByte();
if (typeMarker == a3d.Amf0Types.kAvmPlusObjectType)
bytes.objectEncoding = a3d.ObjectEncoding.AMF3;
else
bytes.pos = bytes.pos - 1;
}
var headerValue = bytes.readObject();
/*
// Read off the remaining bytes to account for the reset of
// the by-reference index on each header value
remainingBytes = new a3d.ByteArray();
remainingBytes.objectEncoding = bytes.objectEncoding;
bytes.readBytes(remainingBytes, 0, bytes.length - bytes.pos);
bytes = remainingBytes;
remainingBytes = null;
*/
var header = new a3d.AMFHeader(headerName, mustUnderstand, headerValue);
response.headers.push(header);
// Reset to AMF0 for next header
bytes.objectEncoding = a3d.ObjectEncoding.AMF0;
}
// Message Bodies
var messageCount = bytes.readUnsignedShort();
for (var m = 0; m < messageCount; m++)
{
var targetURI = bytes.readUTF();
var responseURI = bytes.readUTF();
bytes.readInt(); // Consume message body length...
// Handle AVM+ type marker
if (version == a3d.ObjectEncoding.AMF3)
{
var typeMarker = bytes.readByte();
if (typeMarker == a3d.Amf0Types.kAvmPlusObjectType)
bytes.objectEncoding = a3d.ObjectEncoding.AMF3;
else
bytes.pos = bytes.pos - 1;
}
var messageBody = bytes.readObject();
var message = new a3d.AMFMessage(targetURI, responseURI, messageBody);
response.messages.push(message);
bytes.objectEncoding = a3d.ObjectEncoding.AMF0;
}
return response;
}
function dumpHex(bytes)
{
var s = "";
var i = 0;
var chunk = [];
while (i < bytes.length)
{
if (((i % 16) == 0) && (i != 0))
{
s += writeChunk(chunk, 16) + "\n";
chunk = [];
}
chunk.push(bytes.readUnsignedByte());
i++;
}
s += writeChunk(chunk, 16);
bytes.pos = 0;
return s;
}
function writeChunk(chunk, width)
{
var s = "";
for (var i = 0; i < chunk.length; i++)
{
if (((i % 4) == 0) && (i != 0))
{
s += " ";
}
var b = chunk[i];
var ss = b.toString(16) + " ";
if (ss.length == 2)
{
ss = "0" + ss;
}
s += ss;
}
for (var i = 0; i < (width - chunk.length); i++)
{
s += " ";
}
var j = Math.floor((width - chunk.length) / 4);
for (var i = 0; i < j; i++)
{
s += " ";
}
s += " ";
for (var i = 0; i < chunk.length; i++)
{
var b = chunk[i];
if ((b <= 126) && (b > 32))
{
var ss = String.fromCharCode(b);
s += ss;
}
else
{
s += ".";
}
}
return s;
}
/**
* @preserve
* Adamia 3D Engine v0.1
* Copyright (c) 2010 Adam R. Smith
* Licensed under the new BSD License:
* http://www.opensource.org/licenses/bsd-license.php
*
* Project home: http://code.google.com/p/adamia-3d/
*
* Date: 01/12/2010
*/
if (typeof(a3d) == 'undefined')
{
/** @namespace */
a3d = {};
}
// Taken from http://ejohn.org/blog/simple-javascript-inheritance/
// Inspired by base2 and Prototype
(function()
{
var initializing = false, fnTest = /xyz/.test(function()
{
xyz;
}) ? /\b_super\b/ : /.*/;
// The base Class implementation (does nothing)
/** @class */
this.Class = function()
{
};
// Create a new Class that inherits from this class
Class.extend = function(prop)
{
var _super = this.prototype;
// Instantiate a base class (but only create the instance,
// don't run the init constructor)
initializing = true;
var prototype = new this();
initializing = false;
// Copy the properties over onto the new prototype
for (var name in prop)
{
// Check if we're overwriting an existing function
prototype[name] = typeof prop[name] == "function" &&
typeof _super[name] == "function" && fnTest.test(prop[name]) ?
(function(name, fn)
{
return function()
{
var tmp = this._super;
// Add a new ._super() method that is the same method
// but on the super-class
this._super = _super[name];
// The method only need to be bound temporarily, so we
// remove it when we're done executing
var ret = fn.apply(this, arguments);
this._super = tmp;
return ret;
};
})(name, prop[name]) :
prop[name];
}
// The dummy class constructor
function Class()
{
// All construction is actually done in the init method
if (!initializing && this.init)
this.init.apply(this, arguments);
}
// Populate our constructed prototype object
Class.prototype = prototype;
// Enforce the constructor to be what we expect
Class.constructor = Class;
// And make this class extendable
Class.extend = arguments.callee;
return Class;
};
})();
/**
* Enum for big or little endian.
* @enum {number}
*/
a3d.Endian = {
BIG: 0
, LITTLE: 1
};
a3d.ObjectEncoding = {
AMF0: 0
, AMF3: 3
};
a3d.Amf0Types = {
kNumberType: 0
, kBooleanType: 1
, kStringType: 2
, kObjectType: 3
, kMovieClipType: 4
, kNullType: 5
, kUndefinedType: 6
, kReferenceType: 7
, kECMAArrayType: 8
, kObjectEndType: 9
, kStrictArrayType: 10
, kDateType: 11
, kLongStringType: 12
, kUnsupportedType: 13
, kRecordsetType: 14
, kXMLObjectType: 15
, kTypedObjectType: 16
, kAvmPlusObjectType: 17
};
a3d.Amf3Types = {
kUndefinedType: 0
, kNullType: 1
, kFalseType: 2
, kTrueType: 3
, kIntegerType: 4
, kDoubleType: 5
, kStringType: 6
, kXMLType: 7
, kDateType: 8
, kArrayType: 9
, kObjectType: 10
, kAvmPlusXmlType: 11
, kByteArrayType: 12
};
a3d.AMFMessage = Class.extend({
targetURL: ""
, responseURI: ""
, body: {}
, init: function(targetURL, responseURI, body)
{
this.targetURL = targetURL;
this.responseURI = responseURI;
this.body = body;
}
});
a3d.AMFPacket = Class.extend({
version: 0
, headers: []
, messages: []
, init: function(version)
{
this.version = (version !== undefined) ? version : 0;
this.headers = [];
this.messages = [];
}
});
a3d.AMFHeader = Class.extend({
name: ""
, mustUnderstand: false
, data: {}
, init: function(name, mustUnderstand, data)
{
this.name = name;
this.mustUnderstand = (mustUnderstand != undefined) ? mustUnderstand : false;
this.data = data;
}
});
/**
* Attempt to imitate AS3's ByteArray as very high-performance javascript.
* I aliased the functions to have shorter names, like ReadUInt32 as well as ReadUnsignedInt.
* I used some code from http://fhtr.blogspot.com/2009/12/3d-models-and-parsing-binary-data-with.html
* to kick-start it, but I added optimizations and support both big and little endian.
* Note that you cannot change the endianness after construction.
* @extends Class
*/
a3d.ByteArray = Class.extend({
data: []
, length: 0
, pos: 0
, pow: Math.pow
, endian: a3d.Endian.BIG
, TWOeN23: Math.pow(2, -23)
, TWOeN52: Math.pow(2, -52)
, objectEncoding: a3d.ObjectEncoding.AMF0
, stringTable: []
, objectTable: []
, traitTable: []
/** @constructor */
, init: function(data, endian)
{
if (typeof data == "string") {
data = data.split("").map(function(c) {
return c.charCodeAt(0);
});
}
this.data = (data !== undefined) ? data : [];
if (endian !== undefined) this.endian = endian;
this.length = data.length;
this.stringTable = [];
this.objectTable = [];
this.traitTable = [];
// Cache the function pointers based on endianness.
// This avoids doing an if-statement in every function call.
var funcExt = (endian == a3d.Endian.BIG) ? 'BE' : 'LE';
var funcs = ['readInt32', 'readInt16', 'readUInt30','readUInt32', 'readUInt16', 'readFloat32', 'readFloat64'];
for (var func in funcs)
{
this[funcs[func]] = this[funcs[func] + funcExt];
}
// Add redundant members that match actionscript for compatibility
var funcMap = {readUnsignedByte: 'readByte', readUnsignedInt: 'readUInt32',
readFloat: 'readFloat32', readDouble: 'readFloat64', readShort: 'readInt16', readUnsignedShort: 'readUInt16',
readBoolean: 'readBool', readInt: 'readInt32'};
for (var func in funcMap)
{
this[func] = this[funcMap[func]];
}
}
, readByte: function()
{
var cc = this.data[this.pos++];
return (cc & 0xFF);
}
, writeByte: function(byte)
{
this.data.push(byte);
}
, readBool: function()
{
return (this.data[this.pos++] & 0xFF) ? true : false;
}
, readUInt30BE: function()
{
var ch1 = readByte();
var ch2 = readByte();
var ch3 = readByte();
var ch4 = readByte();
if (ch1 >= 64)
return undefined;
return ch4 | (ch3 << 8) | (ch2 << 16) | (ch1 << 24);
}
, readUInt32BE: function()
{
var data = this.data, pos = (this.pos += 4) - 4;
return ((data[pos] & 0xFF) << 24) |
((data[++pos] & 0xFF) << 16) |
((data[++pos] & 0xFF) << 8) |
(data[++pos] & 0xFF);
}
, readInt32BE: function()
{
var data = this.data, pos = (this.pos += 4) - 4;
var x = ((data[pos] & 0xFF) << 24) |
((data[++pos] & 0xFF) << 16) |
((data[++pos] & 0xFF) << 8) |
(data[++pos] & 0xFF);
return (x >= 2147483648) ? x - 4294967296 : x;
}
, readUInt16BE: function()
{
var data = this.data, pos = (this.pos += 2) - 2;
return ((data[pos] & 0xFF) << 8) |
(data[++pos] & 0xFF);
}
, readInt16BE: function()
{
var data = this.data, pos = (this.pos += 2) - 2;
var x = ((data[pos] & 0xFF) << 8) |
(data[++pos] & 0xFF);
return (x >= 32768) ? x - 65536 : x;
}
, readFloat32BE: function()
{
var data = this.data, pos = (this.pos += 4) - 4;
var b1 = data[pos] & 0xFF,
b2 = data[++pos] & 0xFF,
b3 = data[++pos] & 0xFF,
b4 = data[++pos] & 0xFF;
var sign = 1 - ((b1 >> 7) << 1); // sign = bit 0
var exp = (((b1 << 1) & 0xFF) | (b2 >> 7)) - 127; // exponent = bits 1..8
var sig = ((b2 & 0x7F) << 16) | (b3 << 8) | b4; // significand = bits 9..31
if (sig == 0 && exp == -127)
return 0.0;
return sign * (1 + this.TWOeN23 * sig) * this.pow(2, exp);
}
, readFloat64BE: function()
{
var b1 = this.readByte();
var b2 = this.readByte();
var b3 = this.readByte();
var b4 = this.readByte();
var b5 = this.readByte();
var b6 = this.readByte();
var b7 = this.readByte();
var b8 = this.readByte();
var sign = 1 - ((b1 >> 7) << 1); // sign = bit 0
var exp = (((b1 << 4) & 0x7FF) | (b2 >> 4)) - 1023; // exponent = bits 1..11
// This crazy toString() stuff works around the fact that js ints are
// only 32 bits and signed, giving us 31 bits to work with
var sig = (((b2 & 0xF) << 16) | (b3 << 8) | b4).toString(2) +
((b5 >> 7) ? '1' : '0') +
(((b5 & 0x7F) << 24) | (b6 << 16) | (b7 << 8) | b8).toString(2); // significand = bits 12..63
sig = parseInt(sig, 2);
if (sig == 0 && exp == -1023)
return 0.0;
return sign*(1.0 + this.TWOeN52*sig)*this.pow(2, exp);
/*
var sig = (((b2 & 0xF) << 16) | (b3 << 8) | b4).toString(2) +
(((b5 & 0xF) << 16) | (b6 << 8) | b7).toString(2) +
(b8).toString(2);
// should have 52 bits here
console.log(sig.length);
// this doesn't work sig = parseInt(sig, 2);
var newSig = 0;
for (var i = 0; i < sig.length; i++)
{
var binaryPlace = this.pow(2, sig.length - i - 1);
var binaryValue = parseInt(sig.charAt(i));
newSig += binaryPlace * binaryValue;
}
if (newSig == 0 && exp == -1023)
return 0.0;
var mantissa = this.TWOeN52 * newSig;
return sign * (1.0 + mantissa) * this.pow(2, exp);
*/
}
, readUInt29: function()
{
var value;
// Each byte must be treated as unsigned
var b = this.readByte() & 0xFF;
if (b < 128)
return b;
value = (b & 0x7F) << 7;
b = this.readByte() & 0xFF;
if (b < 128)
return (value | b);
value = (value | (b & 0x7F)) << 7;
b = this.readByte() & 0xFF;
if (b < 128)
return (value | b);
value = (value | (b & 0x7F)) << 8;
b = this.readByte() & 0xFF;
return (value | b);
}
, readUInt30LE: function()
{
var ch1 = readByte();
var ch2 = readByte();
var ch3 = readByte();
var ch4 = readByte();
if (ch4 >= 64)
return undefined;
return ch1 | (ch2 << 8) | (ch3 << 16) | (ch4 << 24);
}
, readUInt32LE: function()
{
var data = this.data, pos = (this.pos += 4);
return ((data[--pos] & 0xFF) << 24) |
((data[--pos] & 0xFF) << 16) |
((data[--pos] & 0xFF) << 8) |
(data[--pos] & 0xFF);
}
, readInt32LE: function()
{
var data = this.data, pos = (this.pos += 4);
var x = ((data[--pos] & 0xFF) << 24) |
((data[--pos] & 0xFF) << 16) |
((data[--pos] & 0xFF) << 8) |
(data[--pos] & 0xFF);
return (x >= 2147483648) ? x - 4294967296 : x;
}
, readUInt16LE: function()
{
var data = this.data, pos = (this.pos += 2);
return ((data[--pos] & 0xFF) << 8) |
(data[--pos] & 0xFF);
}
, readInt16LE: function()
{
var data = this.data, pos = (this.pos += 2);
var x = ((data[--pos] & 0xFF) << 8) |
(data[--pos] & 0xFF);
return (x >= 32768) ? x - 65536 : x;
}
, readFloat32LE: function()
{
var data = this.data, pos = (this.pos += 4);
var b1 = data[--pos] & 0xFF,
b2 = data[--pos] & 0xFF,
b3 = data[--pos] & 0xFF,
b4 = data[--pos] & 0xFF;
var sign = 1 - ((b1 >> 7) << 1); // sign = bit 0
var exp = (((b1 << 1) & 0xFF) | (b2 >> 7)) - 127; // exponent = bits 1..8
var sig = ((b2 & 0x7F) << 16) | (b3 << 8) | b4; // significand = bits 9..31
if (sig == 0 && exp == -127)
return 0.0;
return sign * (1 + this.TWOeN23 * sig) * this.pow(2, exp);
}
, readFloat64LE: function()
{
var data = this.data, pos = (this.pos += 8);
var b1 = data[--pos] & 0xFF,
b2 = data[--pos] & 0xFF,
b3 = data[--pos] & 0xFF,
b4 = data[--pos] & 0xFF,
b5 = data[--pos] & 0xFF,
b6 = data[--pos] & 0xFF,
b7 = data[--pos] & 0xFF,
b8 = data[--pos] & 0xFF;
var sign = 1 - ((b1 >> 7) << 1); // sign = bit 0
var exp = (((b1 << 4) & 0x7FF) | (b2 >> 4)) - 1023; // exponent = bits 1..11
// This crazy toString() stuff works around the fact that js ints are
// only 32 bits and signed, giving us 31 bits to work with
var sig = (((b2 & 0xF) << 16) | (b3 << 8) | b4).toString(2) +
((b5 >> 7) ? '1' : '0') +
(((b5 & 0x7F) << 24) | (b6 << 16) | (b7 << 8) | b8).toString(2); // significand = bits 12..63
sig = parseInt(sig, 2);
if (sig == 0 && exp == -1023)
return 0.0;
return sign * (1.0 + this.TWOeN52 * sig) * this.pow(2, exp);
}
, readDate: function()
{
var time_ms = this.readDouble();
var tz_min = this.readUInt16();
return new Date(time_ms + tz_min * 60 * 1000);
}
, readString: function(len)
{
var str = "";
while (len > 0)
{
str += String.fromCharCode(this.readUnsignedByte());
len--;
}
return str;
}
, readUTF: function()
{
return this.readString(this.readUnsignedShort());
}
, readLongUTF: function()
{
return this.readString(this.readUInt30());
}
, stringToXML: function(str)
{
var xmlDoc;
if (window.DOMParser)
{
var parser = new DOMParser();
xmlDoc = parser.parseFromString(str, "text/xml");
}
else // IE
{
xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async = false;
xmlDoc.loadXML(stc);
}
return xmlDoc;
}
, readXML: function()
{
var xml = this.readLongUTF();
return this.stringToXML(xml);
}
, readStringAMF3: function()
{
var ref = this.readUInt29();
if ((ref & 1) == 0) // This is a reference
return this.stringTable[(ref >> 1)];
var len = (ref >> 1);
if (0 == len)
return "";
var str = this.readString(len);
this.stringTable.push(str);
return str;
}
, readTraits: function(ref)
{
var traitInfo = {};
traitInfo.properties = [];
if ((ref & 3) == 1)
return this.traitTable[(ref >> 2)];
traitInfo.externalizable = ((ref & 4) == 4);
traitInfo.dynamic = ((ref & 8) == 8);
traitInfo.count = (ref >> 4);
traitInfo.className = this.readStringAMF3();
this.traitTable.push(traitInfo);
for (var i = 0; i < traitInfo.count; i++)
{
var propName = this.readStringAMF3();
traitInfo.properties.push(propName);
}
return traitInfo;
}
, readExternalizable: function(className)
{
return this.readObject();
}
, readObject: function()
{
if (this.objectEncoding == a3d.ObjectEncoding.AMF0)
{
return this.readAMF0Object();
}
else if (this.objectEncoding == a3d.ObjectEncoding.AMF3)
{
return this.readAMF3Object();
}
}
, readAMF0Object: function()
{
var marker = this.readByte();
if (marker == a3d.Amf0Types.kNumberType)
{
return this.readDouble();
}
else if (marker == a3d.Amf0Types.kBooleanType)
{
return this.readBoolean();
}
else if (marker == a3d.Amf0Types.kStringType)
{
return this.readUTF();
}
else if ((marker == a3d.Amf0Types.kObjectType) || (marker == a3d.Amf0Types.kECMAArrayType))
{
var o = {};
var ismixed = (marker == 0x08);
var size = null;
if (ismixed)
this.readUInt30();
while (true)
{
var c1 = this.readByte();
var c2 = this.readByte();
var name = this.readString((c1 << 8) | c2);
var k = this.readByte();
if (k == 0x09)
break;
this.pos--;
o[name] = this.readObject();
}
return o;
}
else if (marker == a3d.Amf0Types.kStrictArrayType)
{
var size = this.readInt();
var a = [];
for (var i = 0; i < size; ++i)
{
a.push(this.readObject());
}
return a;
}
else if (marker == a3d.Amf0Types.kTypedObjectType)
{
var o = {};
var typeName = this.readUTF();
var propertyName = this.readUTF();
var type = this.readByte();
while (type != kObjectEndType)
{
var value = this.readObject();
o[propertyName] = value;
propertyName = this.readUTF();
type = this.readByte();
}
return o;
}
else if (marker == a3d.Amf0Types.kAvmPlusObjectType)
{
return this.readAMF3Object();
}
else if (marker == a3d.Amf0Types.kNullType)
{
return null;
}
else if (marker == a3d.Amf0Types.kUndefinedType)
{
return undefined;
}
else if (marker == a3d.Amf0Types.kReferenceType)
{
var refNum = this.readUnsignedShort();
var value = this.objectTable[refNum];
return value;
}
else if (marker == a3d.Amf0Types.kDateType)
{
return this.readDate();
}
else if (marker == a3d.Amf0Types.kLongStringType)
{
return this.readLongUTF();
}
else if (marker == a3d.Amf0Types.kXMLObjectType)
{
return this.readXML();
}
}
, readAMF3Object: function()
{
var marker = this.readByte();
if (marker == a3d.Amf3Types.kUndefinedType)
{
return undefined;
}
else if (marker == a3d.Amf3Types.kNullType)
{
return null;
}
else if (marker == a3d.Amf3Types.kFalseType)
{
return false;
}
else if (marker == a3d.Amf3Types.kTrueType)
{
return true;
}
else if (marker == a3d.Amf3Types.kIntegerType)
{
var i = this.readUInt29();
return i;
}
else if (marker == a3d.Amf3Types.kDoubleType)
{
return this.readDouble();
}
else if (marker == a3d.Amf3Types.kStringType)
{
return this.readStringAMF3();
}
else if (marker == a3d.Amf3Types.kXMLType)
{
return this.readXML();
}
else if (marker == a3d.Amf3Types.kDateType)
{
var ref = this.readUInt29();
if ((ref & 1) == 0)
return this.objectTable[(ref >> 1)];
var d = this.readDouble();
var value = new Date(d);
this.objectTable.push(value);
return value;
}
else if (marker == a3d.Amf3Types.kArrayType)
{
var ref = this.readUInt29();
if ((ref & 1) == 0)
return this.objectTable[(ref >> 1)];
var len = (ref >> 1);
var key = this.readStringAMF3();
if (key == "")
{
var a = [];
for (var i = 0; i < len; i++)
{
var value = this.readObject();
a.push(value);
}
return a;
}
// mixed array
var result = {};
while (key != "")
{
result[key] = this.readObject();
key = this.readStringAMF3();
}
for (var i = 0; i < len; i++)
{
result[i] = this.readObject();
}
return result;
}
else if (marker == a3d.Amf3Types.kObjectType)
{
var o = {};
this.objectTable.push(o);
var ref = this.readUInt29();
if ((ref & 1) == 0)
return this.objectTable[(ref >> 1)];
var ti = this.readTraits(ref);
var className = ti.className;
var externalizable = ti.externalizable;
if (externalizable)
{
o = this.readExternalizable(className);
}
else
{
var len = ti.properties.length;
for (var i = 0; i < len; i++)
{
var propName = ti.properties[i];
var value = this.readObject();
o[propName] = value;
}
if (ti.dynamic)
{
for (; ;)
{
var name = this.readStringAMF3();
if (name == null || name.length == 0) break;
var value = this.readObject();
o[name] = value;
}
}
}
return o;
}
else if (marker == a3d.Amf3Types.kAvmPlusXmlType)
{
var ref = this.readUInt29();
if ((ref & 1) == 0)
return this.stringToXML(this.objectTable[(ref >> 1)]);
var len = (ref >> 1);
if (0 == len)
return null;
var str = this.readString(len);
var xml = this.stringToXML(str);
this.objectTable.push(xml);
return xml;
}
else if (marker == a3d.Amf3Types.kByteArrayType)
{
var ref = this.readUInt29();
if ((ref & 1) == 0)
return this.objectTable[(ref >> 1)];
var len = (ref >> 1);
var ba = new a3d.ByteArray();
this.objectTable.push(ba);
for (var i = 0; i < len; i++)
{
ba.writeByte(this.readByte());
}
return ba;
}
}
});
/* amf.js ここまで */
}
/* 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 );
var strErr = _MyPlay.Err.join( "\n" );
if ( !objRet ){
WScript.Echo( "取得失敗" + ( strErr? ( "\n\n" + strErr ): "" ) );
} else {
/*
WScript.Echo( "videoTitle0:\n" + objRet.videoTitle0
+ "\nvideoUrl0:\n" + objRet.videoUrl0
+ "\n\n" + _MyPlay.Err.join( "\n" ) );
*/
var objCmd = new clsMkCmdLine( objRet.FLVFullLengthURL, objRet.videoId, objRet.publisherId,
objRet.playerId, objRet.flashver, objRet.swfurl,
objRet.url, objRet.bk_title );
var arrMsg = [];
arrMsg.push( "title:\n" + objRet.title );
if ( strErr ) arrMsg.push( "waring:\n" + strErr );
if ( _MyPlay.showAll ) {
var flagDef = false;
for ( var i = 0; i < objRet.arrData.length; i++ ) {
if ( objRet.arrData[ i ].def == true ) flagDef = true;
arrMsg.push( mkMsg( objCmd, objRet.arrData[ i ], ( i + 1 ) + ( objRet.arrData[ i ].def? " (default)": "" ) ) );
}
if ( flagDef == false && objRet.FLVFullLengthURL ) {
arrMsg.push( "[ defalut ]:"
//+ "\nurl=" + objRet.FLVFullLengthURL
+ "\nCmdLine:\n" + objCmd.mkCmdLine( objRet.FLVFullLengthURL )
);
}
} else {
flagDef = false;
if ( objRet.arrData.length > 0 ) {
objRet.arrData.sort( function ( a, b ){ return b.size - a.size; } );
arrMsg.push( mkMsg( objCmd, objRet.arrData[ 0 ], "高画質" ) );
if ( objRet.arrData[ 0 ].def == true ) {
flagDef = true;
arrMsg.push( "[ defalut ]:\n[ 高画質 ]と同じです。" );
} else {
for ( var i = 1; i < objRet.arrData.length; i++ ) {
if ( objRet.arrData[ i ].def == true ) {
flagDef = true;
arrMsg.push( mkMsg( objCmd, objRet.arrData[ i ], "default" ) );
break;
}
}
}
}
if ( flagDef == false && objRet.FLVFullLengthURL ) {
arrMsg.push( "[ defalut ]:"
//+ "\nurl=" + objRet.FLVFullLengthURL
+ "\nCmdLine:\n" + objCmd.mkCmdLine( objRet.FLVFullLengthURL )
);
}
}
WScript.Echo( arrMsg.join( "\n\n" ) );
}
function mkMsg( objCmd, obj, bracket ) {
return "[ " + bracket + " ]:"
+ " size=" + parseInt( obj.size )
+ " " + ( obj.width? obj.width: "_" )
+ "*" + ( obj.height? obj.height: "_" )
+ " rate=" + ( obj.rate? obj.rate: "_" )
+ " codec=" + ( obj.codec? obj.codec: "_" )
//+ "\nurl=" + obj.URL
+ "\nCmdLine:\n" + objCmd.mkCmdLine( obj.URL );
}
/* WSH 動作用コード、ここまで */