// ==SiteScript==
// @siteName CNN
// @siteUrl http://www.cnn.co.jp/video/video.html
// @author mayan
// @authorUrl
// @scriptUrl
// @description
// @date 2013/04/04
// @version 0.1.2
// ==/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 _CNN = { };
_CNN.showDlg = false;
_CNN.addDate = true;
function isSiteUrl( url ) {
//if ( url.match( /http:\/\/(www\.)?cnn\.co\.jp\// ) ) return true;
if ( url.match( /http:\/\/(www\.)?cnn\.co\.jp\/video\/\d+\.html/ ) ) return true;
if ( url.match( /http:\/\/(\w+\.)?cnn\.com\/video\/[?#]\/[^?#&]+/ ) ) return true;
return false;
}
function getVideoDetail( url ) {
var craving = new CravingSiteScript();
if ( url.match( /http:\/\/(www\.)?cnn\.co\.jp\// ) ){
url = url.replace( /http:\/\/cnn\.co\.jp\//, "http://www.cnn.co.jp/" );
var text = craving.getResponseText( url );
if ( !text ) return null;
if ( text.match( /]*?name\s*=\s*("|')movie\1[^>]*?>/ )
&& RegExp.lastMatch.match( / value\s*=\s*("|')(.*?)\1/ )
&& RegExp.$2.match( /[?&]videoId=([^&]+)/ ) )
var videoId = RegExp.$1;
if ( text.match( /
([\s\S]*?)<\/h1>/m ) )
var title = craving.decodeHtml( RegExp.$1 )
.replace( /^\s+/, "" )
.replace( /\s+$/, "" )
.replace( /\s+/, " " );
} else if ( url.match( /http:\/\/(\w+\.)?cnn\.com\/video\/[?#]\/video\/([^?#&]+)/ ) ){
videoId = RegExp.$2;
}
if ( !videoId ) return null;
var media_src = "http://ht.cdn.turner.com/cnn/big/";
var data_src = "http://edition.cnn.com/video/data/3.0/video/";
var xmlurl = data_src + videoId + "/index.xml";
text = craving.getResponseText( xmlurl );
if ( !text ) return null;
if ( !text.match( /([\s\S]+?)<\/files>/m ) ) return null;
var files = RegExp.$1;
var objReg = /]*)>(.*?)<\/file>/g ;
var arrUrl = new Array();
while ( objReg.exec( files ) != null ){
var obj = { };
if ( !RegExp.$2 ) continue;
obj.file = RegExp.$2;
if ( RegExp.$1.match( / bitrate\s*=\s*("|')(.*?)\1/ ) )
var bitrate = RegExp.$2;
obj.bitrate = ( bitrate ? bitrate : "unknoun" );
if ( obj.bitrate.match( /^\s*(\d+)x\d+(_(\d+)k)?(_mp4)?/ ) ) {
obj.pr_width = RegExp.$1? parseInt( RegExp.$1 ): 0;
obj.pr_bitrate = RegExp.$3? parseInt( RegExp.$3 ): 0;
obj.pr_akamai = RegExp.$4? true: false;
} else {
obj.pr_width = 0;
obj.pr_bitrate = 0;
obj.pr_akamai = false;
}
arrUrl.push( obj );
}
if ( arrUrl.length <= 0 ) return null;
arrUrl.sort( function(a,b){
var a1,b1;
if ( (a1=(a.pr_akamai?1:0)) != (b1=(b.pr_akamai?1:0)) ) return b1 - a1;
if ( a.pr_width != b.pr_width ) return b.pr_width - a.pr_width;
if ( a.pr_bitrate != b.pr_bitrate ) return b.pr_bitrate - a.pr_bitrate;
return 0;
} );
if ( !title ){
if ( text.match( /(.*?)<\/headline>/ ) )
title = craving.decodeHtml( RegExp.$1 );
if ( !title ) title = videoId.replace( /\//g, "-" ).replace( /\./g, "_" );
}
if ( _CNN.addDate && text.match( / timestamp\s*=\s*("|')(.*?)\1/ ) ){
var ts = RegExp.$2;
if ( ts.match( /\w+ (\w+ \d+) \d+:\d+:\d+ EDT (\d+)/ ) )
ts = RegExp.$1 + " " + RegExp.$2;
title = title + " - " + ts;
}
title = title.replace(/[\\\/:*?"<>|]/g, "_");
//case showDlg false
if ( _CNN.showDlg == false ) {
var realUrl = media_src + arrUrl[ 0 ].file;
return { videoTitle0: title, videoUrl0: realUrl };
}
//case showDlg true
var objIBox = new clsInputBox();
if ( objIBox.isOK == false ) {
realUrl = media_src + arrUrl[ 0 ].file;
return { videoTitle0: title, videoUrl0: realUrl };
}
var arrMsg = [ ];
var add = 1;
for ( var i = 0; i < arrUrl.length; i++ )
arrMsg.push( ( i + add ) + " : " + arrUrl[ i ].bitrate + "\n " + arrUrl[ i ].file.substr( 0, 36 ) + "\n\n" );
arrMsg.push( "\n番号を入力。複数入力の場合は、カンマで区切ります。" );
var ret = objIBox.InputBox( arrMsg.join( "" ), "from SiteScript", "" );
if ( !ret ) return null;
var arrParse = parseRet( ret, 0, arrUrl.length, add );
if ( !arrParse ) return null;
var tail = ( arrParse.length >= 2 )? true : false;
var objRtn = { };
for ( var i = 0; i < arrParse.length; i++ ){
realUrl = media_src + ( arrUrl[ arrParse[ i ] ] ).file;
rettitle = title + ( tail ? ( " - " + ( arrUrl[ arrParse[ i ] ] ).bitrate ) : "" );
rettitle = rettitle.replace(/[\\\/:*?"<>|]/g, "_");
objRtn[ "videoTitle" + i ] = rettitle;
objRtn[ "videoUrl" + i ] = realUrl;
}
return objRtn;
}
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;
}
}
this._initialize();
this.InputBox = function (msg, title, def){
if ( this.isOK ){
return this._objSC.Run( "VB_IB", msg, title, def);
}
}
}
function parseRet( strRet, min, max, add ){
//return : array
if ( !strRet ) return null;
var arrS = strRet.split( "," );
var arrR = new Array();
jump:
for ( var i = 0; i < arrS.length; i++ ){
if ( arrS[ i ].match( /\d+/ ) ) var num = parseInt( RegExp.lastMatch ) - add;
else continue;
if ( min > num || max <= num ) continue;
for ( var j = 0; j < arrR.length; j++ )
if ( arrR[ j ] == num ) continue jump;
arrR.push( num );
}
if ( arrR.length <= 0 ) return null;
return arrR;
}