// ==SiteScript==
// @siteName Showtime
// @siteUrl http://www.sho.com/
// @author mayan
// @authorUrl
// @scriptUrl
// @description
// @date 2011/06/04
// @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 _Sho = { };
_Sho.Err = new Array();
function isSiteUrl( url ) {
if ( url.match( /http:\/\/(www\.)?sho\.com\/site\/video\/brightcove\/series\/home\.do/ ) ) return true;
if ( url.match( /http:\/\/(www\.)?sho\.com\/site\/video\/brightcove\/series\/title\.do\?.+/ ) ) return true;
if ( url.match( /http:\/\/(www\.)?sho\.com\/site\/video\/brightcove\/movies\/home\.do(\?.+)?/ ) ) return true;
if ( url.match( /http:\/\/sports\.sho\.com\/#\/([^\/]+\/)+?videos\/\d+/ ) ) return true;
return false;
}
function getVideoDetail( url ) {
var craving = new CravingSiteScript();
url = url.replace( /http:\/\/sho\.com\//, "http://www.sho.com/" );
var bctid = "";
if ( url.match( /http:\/\/www\.sho\.com\/site\/video\/brightcove\/series\/home\.do/ ) ){
var type = "sr";
}
else if ( url.match( /http:\/\/www\.sho\.com\/site\/video\/brightcove\/series\/title\.do(\?.+)/ ) ){
type = "sr";
if ( RegExp.$1 && RegExp.$1.match( /[?&]bctid=(\d+)/ ) ) bctid = RegExp.$1;
}
else if ( url.match( /http:\/\/www\.sho\.com\/site\/video\/brightcove\/movies\/home\.do(\?.+)?/ ) ){
type = "sr";
if ( RegExp.$1 && RegExp.$1.match( /[?&]bctid=(\d+)/ ) ) bctid = RegExp.$1;
}
else if ( url.match( /http:\/\/sports\.sho\.com\/#(\/([^\/]+\/)+?videos\/\d+)/ ) ){
type = "sp";
var sp_path = RegExp.$1;
}
else {
_Sho.Err.push( "URLが不適合" );
type = "etc";
// return null;
if ( url.match( /[?&]bctid=(\d+)/ ) ) bctid = RegExp.$1;
if ( url.match( /#fullPlayer:(\d+)/ )
|| url.match( /#player:(\d+)/ ) ){
url = url.substring( 0, RegExp.index );
if ( !bctid ) bctid = RegExp.$1;
}
}
var objBinary = new clsGetBinary();
if ( !objBinary.isOK ){
_Sho.Err.push( "Binaryオブジェクトの作成に失敗" );
return null;
}
switch ( type ) {
case "sr" :
case "etc" :
try {
var text = craving.getResponseText( url );
} catch( e ) {
_Sho.Err.push( e.description );
text = "";
}
if ( !text ){
_Sho.Err.push( "ページの取得に失敗" );
}
if ( text.match( /]*?>(.*?)<\/h1>/ ) )
var title = craving.decodeHtml( RegExp.$1 );
else if ( text.match( /
(.+?)<\/title>/ ) )
title = craving.decodeHtml( RegExp.$1 ) + " - videoID=" + videoID;
else title = "showtime_" + videoID;
title = title.replace(/[\\\/:*?"<>|]/g, "_");
var strExperienceId = "12786658001";//fixed
getSendData( objBinary, videoID, strExperienceId, url );
var amfurl = "http://c.brightcove.com/services/messagebroker/amf?playerId=" + strExperienceId;
break;
case "sp" :
var spurl = "http://sports.sho.com" + sp_path;
try {
text = craving.getResponseText( spurl );
} catch( e ) {
_Sho.Err.push( "spurlのオープンに失敗" );
return null;
}
if ( !text ){
_Sho.Err.push( "spurlページの取得に失敗" );
return null;
}
if ( text.match( /data-brightcove-id\s*=\s*("|')(\d+?)\1/ ) ){
videoID = RegExp.$2;
} else {
_Sho.Err.push( "sp:videoIDの取得に失敗" );
return null;
}
if ( text.match( /data-title\s*=\s*("|')(.*?)\1/ ) )
title = RegExp.$2;
if ( !title ) title = "showtime_" + videoID;
if ( text.match( /data-created\s*=\s*("|')(.*?)\1/ ) )
title = title + " - " + RegExp.$2;
title = title.replace(/[\\\/:*?"<>|]/g, "_");
playerID = "672912987001";
publisherID = "63128";
var playerKey = "AQ~~,AAAAAAAA9pg~,GnOHJwU2r3u0yJcQz5IrrM_qW5873ah_";
getSendData_sp( objBinary, videoID );
var amfurl = "http://c.brightcove.com/services/messagebroker/amf"
+ "?playerKey=" + playerKey;
break;
default :
_Sho.Err.push( "想定外のエラー" );
return null;
}
var objHttp = craving._getXmlHttpRequest();
try {
objHttp.Open( "POST", amfurl, false );
objHttp.setRequestHeader( "Content-Type", "application/x-amf" );
objHttp.Send( objBinary.senddata );
} catch( e ) {
_Sho.Err.push( e.description );
_Sho.Err.push( "amfurl のオープンに失敗" );
return null;
}
var objByte = new clsGetByteCode( objHttp.responseBody );
if ( !objByte.isOK ){
_Sho.Err.push( "Byteオブジェクトの取得に失敗" );
return null;
}
var text = objByte.percentAllEncode();
if ( !text ){
_Sho.Err.push( "Byteデータの取得に失敗" );
return null;
}
var objReg = /%06((%[0-9A-F]{2}){1,2})%72%74%6D%70/g ;
var arrUrl = new Array();
while ( objReg.exec( text ) != null ){
var pos = RegExp.lastIndex;
var len = parseUS29( RegExp.$1 );
if ( len <= 4 ) continue;
var realUrl = text.substr( pos - 12, len * 3 );
realUrl = realUrl.replace( /%([0-9A-F]{2})/g,
function(a,b){ return String.fromCharCode( parseInt( b, 16 ) ); } );
arrUrl.push( realUrl );
}
if ( arrUrl.length <= 0 ){
_Sho.Err.push( "realUrl の取得に失敗" );
return null;
}
//return { videoTitle0: title, videoUrl0: arrUrl[0] };
//return objRet for rtmpdump
var objRet = { };
objRet.title = title;
objRet.arrUrl = arrUrl;
objRet.url = url;
objRet.videoID = videoID;
objRet.playerID = playerID;
objRet.publisherID = publisherID;
return objRet;
}
function parseUS29( str ){
//unsupport <8192, simplified ver
if ( str.match( /^%([0-9A-F]{2})$/ ) ){
var ret = parseInt( RegExp.$1, 16 );
ret = ret >>> 1;
}
else if ( str.match( /%([0-9A-F]{2})%([0-9A-F]{2})$/ ) ){
var upp = parseInt( RegExp.$1, 16 );
upp = ( upp & 127 ) << 6;
var lwr = parseInt( RegExp.$2, 16 );
lwr = ( lwr & 126 ) >>> 1;
ret = upp + lwr;
}
else return -1;
return ret;
}
function getSwfUrl(){
var defaulturl = "http://admin.brightcove.com/viewer/us1.25.02.02.2011-04-06164328/federatedVideo/BrightcovePlayer.swf";
var url = "http://services.brightcove.com/services/viewer/federated_f9/4373610001";
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, strContentId, strExperienceId, strUrl ){
var arrData1 = [
0x00, 0x03, 0x00, 0x00, 0x00, 0x01, //header,amf3
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
];
// + body length
var arrData2 = [
0x0a, 0x00, 0x00, 0x00, 0x02, //array
0x02, 0x00, 0x28, //string
0x30, 0x62, 0x36, 0x35, 0x66, 0x36, 0x61, 0x31,
0x63, 0x63, 0x65, 0x37, 0x33, 0x64, 0x62, 0x37,
0x32, 0x34, 0x61, 0x31, 0x38, 0x34, 0x32, 0x31,
0x37, 0x30, 0x62, 0x36, 0x38, 0x37, 0x36, 0x62,
0x63, 0x66, 0x34, 0x61, 0x32, 0x63, 0x34, 0x65,
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, //objectname
0x13,
0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x4b, 0x65,
0x79, //playerkey
0x19,
0x64, 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x79,
0x54, 0x79, 0x70, 0x65, //deliveryType
0x21,
0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4f,
0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, //contentOverrides
0x07,
0x55, 0x52, 0x4c, //URL
0x19,
0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x65, 0x6e,
0x63, 0x65, 0x49, 0x64, //experienceId
0x11,
0x54, 0x54, 0x4c, 0x54, 0x6f, 0x6b, 0x65, 0x6e, //TTLToken
0x06, 0x01, //playerKey String
0x05, //deliveryType, Number
0x7f, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00,
0x09, 0x03, 0x01, //contentoverride
0x0a, 0x81, 0x03, //array, object
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, //objectname
0x13,
0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x49,
0x64, //contentId
0x0d,
0x74, 0x61, 0x72, 0x67, 0x65, 0x74, //targetRegIds
0x19,
0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52,
0x65, 0x66, 0x49, 0x64, //contentRefId
0x1b,
0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x64,
0x52, 0x65, 0x66, 0x49, 0x64, //featuredRefId
0x1b,
0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52,
0x65, 0x66, 0x49, 0x64, 0x73, //contentRefIds
0x15,
0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x64,
0x49, 0x64, //featuredId
0x15,
0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x49,
0x64, 0x73, //contentIds
0x17,
0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54,
0x79, 0x70, 0x65, //contentType
0x05
];
// + contentId Number
var arrData3 = [
0x06, 0x17,
0x76, 0x69, 0x64, 0x65, 0x6f, 0x50, 0x6c, 0x61,
0x79, 0x65, 0x72, //target String videoPlayer
0x01, //contentRefId Null
0x01, //featuredRefId Null
0x01, //contentRefIds Null
0x05, //featuredId Number NaN
0x7f, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00,
0x01, //contentIds Null
0x04, 0x00 //contentType Integer 0
];
// + URL, String
var arrData4 = [ 0x05 ];
// + experienceId Number
var arrData5 = [
0x06, 0x01 //TTLToken String
];
var arrUrlValue = makeStringArr( strUrl );
var contentLength = 366 + arrUrlValue.length;
var objStream = new ActiveXObject( "ADODB.Stream" );
objStream.type = 1;
objStream.Open();
objStream.Position = 0;
for ( var i = 0; i < arrData1.length; i++ )
objStream.Write( objBny.fromByteCode( arrData1[i] ) );
var arrTmp = LenToByteCode( contentLength, 4 );
for ( var i = 0; i < arrTmp.length; i++ )
objStream.Write( objBny.fromByteCode( arrTmp[i] ) );
for ( var i = 0; i < arrData2.length; i++ )
objStream.Write( objBny.fromByteCode( arrData2[i] ) );
arrTmp = toDoubleByte( strContentId );
for ( var i = 0; i < arrTmp.length; i++ )
objStream.Write( objBny.fromByteCode( arrTmp[i] ) );
for ( var i = 0; i < arrData3.length; i++ )
objStream.Write( objBny.fromByteCode( arrData3[i] ) );
for ( var i = 0; i < arrUrlValue.length; i++ )
objStream.Write( objBny.fromByteCode( arrUrlValue[i] ) );
for ( var i = 0; i < arrData4.length; i++ )
objStream.Write( objBny.fromByteCode( arrData4[i] ) );
arrTmp = toDoubleByte( strExperienceId );
for ( var i = 0; i < arrTmp.length; i++ )
objStream.Write( objBny.fromByteCode( arrTmp[i] ) );
for ( var i = 0; i < arrData5.length; i++ )
objStream.Write( objBny.fromByteCode( arrData5[i] ) );
objStream.Position = 0;
objBny.senddata = objStream.Read();
objStream.Close();
}
function getSendData_sp( objBny, strContentId ){
var arrData1 = [
0x00, 0x03, 0x00, 0x00, 0x00, 0x01, //header, amf3
0x00, 0x3D, //target
0x63, 0x6F, 0x6D, 0x2E, 0x62, 0x72, 0x69, 0x67,
0x68, 0x74, 0x63, 0x6F, 0x76, 0x65, 0x2E, 0x70,
0x6C, 0x61, 0x79, 0x65, 0x72, 0x2E, 0x72, 0x75,
0x6E, 0x74, 0x69, 0x6D, 0x65, 0x2E, 0x50, 0x6C,
0x61, 0x79, 0x65, 0x72, 0x4D, 0x65, 0x64, 0x69,
0x61, 0x46, 0x61, 0x63, 0x61, 0x64, 0x65, 0x2E,
0x66, 0x69, 0x6E, 0x64, 0x4D, 0x65, 0x64, 0x69,
0x61, 0x42, 0x79, 0x49, 0x64,
0x00, 0x02, //response
0x2F, 0x31,
0x00, 0x00, 0x00, 0x4B, //body length
0x0A, 0x00, 0x00, 0x00, 0x04, //array
0x02, 0x00, 0x28, //[0] String 86c40f99a70d332ba7d2032be4db420ad963f138
0x38, 0x36, 0x63, 0x34, 0x30, 0x66, 0x39, 0x39,
0x61, 0x37, 0x30, 0x64, 0x33, 0x33, 0x32, 0x62,
0x61, 0x37, 0x64, 0x32, 0x30, 0x33, 0x32, 0x62,
0x65, 0x34, 0x64, 0x62, 0x34, 0x32, 0x30, 0x61,
0x64, 0x39, 0x36, 0x33, 0x66, 0x31, 0x33, 0x38,
0x00, //Number 672912987001, pleyerId
0x42, 0x63, 0x95, 0x97, 0xAA, 0x6F, 0x20, 0x00,
0x00
];
// + contentId, Number
var arrData2 = [
0x00, //Number 63128, publisherId
0x40, 0xEE, 0xD3, 0x00, 0x00, 0x00, 0x00, 0x00
];
var objStream = new ActiveXObject( "ADODB.Stream" );
objStream.type = 1;
objStream.Open();
objStream.Position = 0;
for ( var i = 0; i < arrData1.length; i++ )
objStream.Write( objBny.fromByteCode( arrData1[i] ) );
var arrTmp = toDoubleByte( strContentId );
for ( var i = 0; i < arrTmp.length; i++ )
objStream.Write( objBny.fromByteCode( arrTmp[i] ) );
for ( var i = 0; i < arrData2.length; i++ )
objStream.Write( objBny.fromByteCode( arrData2[i] ) );
objStream.Position = 0;
objBny.senddata = objStream.Read();
objStream.Close();
}
function LenToByteCode( intLen, intByteLen ){
var arr = new Array();
var tmp = intLen;
for ( var i = 0; i < intByteLen; i++ ){
arr.push( tmp & 255 );
tmp = tmp >> 8 ;
}
return arr.reverse();
}
function makeStringArr( str ){
//unsupport, str.len>2^13
var arr = new Array();
var len = str.length;
if ( len < 0 || 8192 < len ) return arr;
arr.push( 0x06 );
if ( len < 64 ){
arr.push( len * 2 + 1 );
} else {
arr.push( ( len >>> 6 ) + 128 );
arr.push( ( ( len & 63 ) << 1 ) + 1 );
}
for ( var i = 0; i < len; i++ ){
arr.push( str.charCodeAt( i ) );
}
return arr;
}
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 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;
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( "" );
}
}
/* 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 ( _Sho.Err.length > 0 )
var strErr = "Warning: \n" + _Sho.Err.join( "\n" );
else strErr = "";
if ( !objRet ){
WScript.Echo( "取得失敗\n\n" + strErr );
} else {
var swfurl = getSwfUrl();
var flashversion = getFlashVer();
var pageurl = objRet.url;
var param = "?videoId=" + ( objRet.videoID ? objRet.videoID : "" )
+ "&lineUpId="
+ "&pubId=" + ( objRet.publisherID ? objRet.publisherID : "" )
+ "&playerId=" + ( objRet.playerID ? objRet.playerID : "" )
+ "&affiliateId=";
var strDply = "title:\n" + objRet.title + "\n\n"
+ ( strErr ? ( strErr + "\n\n" ) : "" )
+ "[ default ]\n" + objRet.arrUrl[ 0 ];
for ( var i = 1; i < objRet.arrUrl.length; i++ )
strDply += "\n[ " + i + " ]\n" + objRet.arrUrl[ i ];
var max = 0;
for ( var i = 1; i < objRet.arrUrl.length; i++ )
if ( objRet.arrUrl[ max ] < objRet.arrUrl[ i ] ) max = i;
var strCmdLineDef = makeCmdLine( objRet.arrUrl[ 0 ], param,
swfurl, pageurl, flashversion );
if ( max == 0 ){
var strCmdLine = "\n\nRTMPDump CmdLine:\n"
+ "[ default ]\n" + strCmdLineDef;
} else {
var strCmdLineMax = makeCmdLine( objRet.arrUrl[ max ], param,
swfurl, pageurl, flashversion );
var strCmdLine = "\n\nRTMPDump CmdLine:\n"
+ "[ default ]\n" + strCmdLineDef + "\n"
+ "[ " + max + " ](高画質かもしれない)\n" + strCmdLineMax;
}
WScript.Echo( strDply + strCmdLine );
}
function makeCmdLine( url, param, swfurl, pageurl, flashversion ){
if ( !url.match( /(rtmp[ets]*?):\/\/([^\/]+)\/([^&]+?)\/?&([^&]+)/ ) ){
return "";
}
var proto = RegExp.$1;
var serv = RegExp.$2;
var app = RegExp.$3;
var ply = RegExp.$4;
var outname = ply.substr( ply.lastIndexOf( "/" ) + 1 );
return "rtmpdump"
+ " -r \"" + proto + "://" + serv + "/" + app + param + "\""
+ " -a \"" + app + param + "\""
+ " -W \"" + swfurl + "\""
+ ( flashversion ? " -f \"" + flashversion + "\"" : "" )
+ " -y \"" + ply + param + "\""
+ ( pageurl ? " -p \"" + pageurl + "\"" : "" )
+ " -o \"" + outname + "\"";
}
/* WSH 動作用コード、ここまで */