// ==SiteScript==
// @siteName FREUDBOX
// @siteUrl http://www.freudbox.com/
// @author DarkKnight
// @authorUrl http://darkknightlabs.com/
// @scriptUrl http://darkknightlabs.com/site-script/
// @description revised by Mayan, 2013/01/01
// @date 2010/09/05
// @version 0.2.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, "/" );
}
}
function isSiteUrl( url ) {
if ( url.match( /http:\/\/(www\.)?freudbox\.com\/video_\d+_[^\/?]+\.html/ ) ) return true;
return false;
}
function getVideoDetail( url ) {
url = url.replace( /http:\/\/freudbox\.com\//, "http://www.freudbox.com/" );
if ( url.match( /http:\/\/(www\.)?freudbox\.com\/video_(\d+)_[^\/?]+\.html/ ) ) {
var vid = RegExp.$2;
} else {
return null;
}
var craving = new CravingSiteScript();
try {
var text = craving.getResponseText( url );
} catch( e ) {
text = "";
}
if ( text ) {
if ( text.match( /
\s*(.*?)\s*<\/title>/ ) ||
text.match( /\s*(.*?)\s*<\/h2>/ ) ) {
var title = craving.decodeHtml( RegExp.$1 );
}
if ( text.match( /]*?name\s*=\s*("|')flashvars\2[^>]*)>/ )
&& RegExp.$1.match( /\s+value\s*=\s*("|')(.*?)\1/ )
&& ( "&" + RegExp.$2 ).match( /&xmlfile=([^&]+)/ ) ) {
var xmlurl = decodeURIComponent( RegExp.$1 );
}
}
if ( !xmlurl || !xmlurl.match( /^http:\/\/.+/ ) )
xmlurl = "http://www.freudbox.com/videoplayer/vplaylist_fb.php?id=" + vid + "&hq=1";
try {
text = craving.getResponseText( xmlurl );
} catch( e ) {
text = "";
}
if ( !text ) return null;
text = ( new clsFleudDecrypt() ).decrypt( text );
var objReg = /]+)?>\s*(.*?)\s*<\/file\1>/ig;
var arrDat = [];
while( objReg.test( text ) ) {
if ( !RegExp.$3 ) continue;
var obj = {};
obj.quality = RegExp.$2? parseInt( RegExp.$2, 10 ): 0;
obj.realurl = craving.decodeHtml( RegExp.$3 );
arrDat.push( obj );
}
if ( arrDat.length <= 0 ) return null;
arrDat.sort( function(a,b){return b.quality - a.quality;} );
var realUrl = arrDat[0].realurl;
if ( !title ) title = "freudbox_" + vid;
title = title.replace(/[\\\/:*?"<>|]/g, "_");
return { videoTitle0: title, videoUrl0: realUrl };
}
function clsFleudDecrypt() {
this.decrypt = function ( strEnc ){
var SecKey = "RA#6P*Nq";
return charsToStr( calculate( hexToChars( strEnc ), strToChars( SecKey ) ) );
};
function charsToStr( arrByte ){
var arr = [];
for (var i = 0; i < arrByte.length; i++)
arr.push( String.fromCharCode( arrByte[i] ) );
return arr.join( "" );
}
function calculate( arrEnc, arrKey ){
var arrSBox = [];
var arrMyKey = [];
var len = arrKey.length;
for ( var i = 0; i <= 255; i++ ) {
arrMyKey[ i ] = arrKey[ i % len ];
arrSBox[ i ] = i;
}
var temp1 = 0;
for ( var i = 0; i <= 255; i++ ) {
temp1 = ( temp1 + arrSBox[ i ] + arrMyKey[ i ] ) % 256;
var temp2 = arrSBox[ i ];
arrSBox[ i ] = arrSBox[ temp1 ];
arrSBox[ temp1 ] = temp2;
}
var arrRet = [];
var sd1 = 0;
var sd2 = 0;
for ( var i = 0; i < arrEnc.length; i++ ) {
sd1 = ( sd1 + 1 ) % 256;
sd2 = ( sd2 + arrSBox[ sd1 ] ) % 256;
temp1 = arrSBox[ sd1 ];
arrSBox[ sd1 ] = arrSBox[ sd2 ];
arrSBox[ sd2 ] = temp1;
temp2 = ( arrSBox[ sd1 ] + arrSBox[ sd2 ] ) % 256;
var ans = arrEnc[ i ] ^ arrSBox[ temp2 ];
arrRet.push( ans );
}
return arrRet;
}
function hexToChars( str ){
var arr = [];
var headx;
if ( str.substr( 0,2 ) == "0x" ) headx = 2;
else headx = 0;
for ( var i = headx; i < str.length; i = i + 2 )
arr.push( parseInt( str.substr( i, 2 ), 16 ) );
return arr;
}
function strToChars( str ){
var arr = [];
for ( var i = 0; i < str.length; i++ )
arr.push( str.charCodeAt( i ) );
return arr;
}
}