// ==SiteScript==
// @siteName Tu.tv
// @siteUrl http://tu.tv/
// @author mayan
// @authorUrl
// @scriptUrl
// @description
// @date 2013/02/09
// @version 0.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|#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 _TUTV = {};
_TUTV.showDlg = true;
_TUTV.sendUrl = true;
function isSiteUrl( url ) {
if ( url.match( /http:\/\/(www\.)?tu\.tv\/videos\/[^\/?]+/ ) ) return true;
if ( url.match( /http:\/\/(www\.)?tu\.tv\/videos-ext\/.{11}-/ ) ) return true;
if ( url.match( /http:\/\/(www\.)?tu\.tv\/tutvweb\d*\.swf(\?.+)/ )
&& RegExp.$2.match( /[?&]xtp=\d+/ ) ) return true;
if ( url.match( /http:\/\/(www\.)?tu\.tv\/videoFull\/?(\?.+)/ )
&& RegExp.$2.match( /[?&]codVideo=\d+/ ) ) return true;
if ( url.match( /http:\/\/(www\.)?tu\.tv\/iframe\/\d+/ ) ) return true;
return false;
}
function getVideoDetail( url ) {
if ( url.match( /http:\/\/(www\.)?tu\.tv\/videos-ext\/(.{11})-/ ) ) {
var youtubevid = RegExp.$2;
var youtubeurl = "http://www.youtube.com/watch?v=" + youtubevid;
var type = "ext";
} else if ( url.match( /http:\/\/(www\.)?tu\.tv\/videos\/([^\/?]+)/ ) ) {
var urlid = RegExp.$2;
type = "page";
} else if ( url.match( /http:\/\/(www\.)?tu\.tv\/tutvweb\d*\.swf(\?.+)/ )
&& RegExp.$2.match( /[?&]xtp=(\d+)/ ) ) {
var xtp = RegExp.$1;
type = "swf";
} else if ( url.match( /http:\/\/(www\.)?tu\.tv\/videoFull\/?(\?.+)/ )
&& RegExp.$2.match( /[?&]codVideo=(\d+)/ ) ) {
xtp = RegExp.$1;
type = "swf";
} else if ( url.match( /http:\/\/(www\.)?tu\.tv\/iframe\/(\d+)/ ) ) {
xtp = RegExp.$2;
type = "iframe";
} else {
return null;
}
//case "ext":
if ( type == "ext" ) {
var ret = undefined;
if ( _TUTV.showDlg == true ) {
var objMsgBox = new clsMsgBox();
if ( objMsgBox.isOK ) {
ret = objMsgBox.MsgBox(
"埋め込みの動画。\n推定される配信元のURL:\n"
+ youtubeurl + "\n\nこのURLをCraving Explorerへ送りますか?",
"from Site-Script" );
}
}
if ( ret == 7 ) return null;
if ( ret == 6 || _TUTV.sendUrl == true ) {
var objCEAPI = new clsCEAPI();
if ( objCEAPI.isOK == true ) {
objCEAPI.sendUrl( youtubeurl );
}
}
return null;
}//case "ext" end
var craving = new CravingSiteScript();
//case "page"
if ( type == "page" ) {
try {
var text = craving.getResponseText( url );
} catch( e ) {
text = "";
}
if ( !text ) return null;
if ( text.match( /var\s+codVideo\s*=\s*(\d+)\s*;/ ) ) {
xtp = RegExp.$1;
}
if ( !xtp &&
( text.match( /]*?rel\s*=\s*("|')?video_src\2[^>]*)>/ ) ||
text.match( /]*?property\s*=\s*("|')?og:video\2[^>]*)>/ ) )
&& RegExp.$1.match( /(\?|&|%26)codVideo=(\d+)/ ) ) {
xtp = RegExp.$2;
}
if ( !xtp ) return null;
if ( ( text.match( /]*?name\s*=\s*("|')title\2[^>]*)>/ ) ||
text.match( /]*?property\s*=\s*("|')og:title\2[^>]*)>/ ) )
&& RegExp.$1.match( /\s+content\s*=\s*("|')(.*?)\1/ ) ) {
var title = craving.decodeHtml( RegExp.$2 );
}
if ( !title ) title = urlid;
}
if ( !xtp ) return null;
var phpurl = "http://tu.tv/flvurl.php"
+ "?codVideo=" + xtp + "&v=&fm=1";
try {
text = craving.getResponseText( phpurl );
} catch( e ) {
text = "";
}
if ( !text ) return null;
if ( text.match( /&kpt=([^&]+)/ ) ) {
try {
var realUrl = base64Decode( RegExp.$1 );
} catch( e ) {
realUrl = "";
}
}
if ( !realUrl ) return null;
if ( !title ) title = "tutv_" + xtp;
title = title.replace(/[\\\/:*?"<>|]/g, "_");
return { videoTitle0: title, videoUrl0: realUrl };
}
function clsMsgBox(){
//WScript.Shell Popup
this.isOK = false;
this._objShell = null;
this._initialize = function (){
try{
this._objShell = new ActiveXObject( "WScript.Shell" );
this.isOK = true;
} catch( e ) {
this.isOK = false;
}
}
this._initialize();
this.MsgBox = function ( msg, title ){
if ( this.isOK )
return this._objShell.Popup( msg, 0, title, 4+32 );
}
}
function clsCEAPI(){
this.isOK = false;
this._objCE = null;
this._initialize = function (){
try {
this._objCE = new ActiveXObject( "CravingExplorer.Api" );
this.isOK = true;
} catch( e ) {
this.isOK = false;
}
}
this._initialize();
this.sendUrl = function ( strUrl ){
if ( this.isOK == false ) return false;
return this._objCE.addDownloadItem( strUrl, "flv", true );
}
}
/************************************************************
* Dark Knight さんのサイトスクリプト
* nantokadoga.site.js (var 0.7) より
* base64 decode
************************************************************/
function base64Decode( str ) {
var base64Table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
var result = '';
var p = -8;
var a = 0;
var c;
for ( var i = 0; i < str.length; i++ ) {
if ( ( c = base64Table.indexOf( str.charAt( i ) ) ) < 0 ) {
continue;
}
a = ( a << 6 ) | ( c & 63 );
if ( ( p += 6 ) >= 0 ) {
var d = ( a >> p ) & 255;
if ( c != 64 ) {
result += String.fromCharCode( d );
}
a &= 63;
p -= 8;
}
}
return result;
}