// ==SiteScript==
// @siteName PornSharing
// @siteUrl http://pornsharing.com/
// @author mayan
// @authorUrl
// @scriptUrl
// @description
// @date 2014/11/29
// @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, "/" );
}
}
function isSiteUrl( url ) {
if ( url.match( /http:\/\/(?:www\.)?pornsharing\.com\/[^\/?]+_v\d+/ ) ) return true;
return false;
}
function getVideoDetail( url ) {
url = url.replace( /^http:\/\/www\./, "http://" );
if ( url.match( /http:\/\/pornsharing\.com\/([^\/?]+)_v(\d+)/ ) ) {
var bk_title = RegExp.$1;
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*<\/h1\s*>/im ) ) {
var title = craving.decodeHtml( RegExp.$1 );
}
if ( !title &&
text.match( /]*)?>\s*(.*?)\s*<\/title\s*>/im ) ) {
title = craving.decodeHtml( RegExp.$1 );
}
//playlistUrl,省略
}
if ( !title ) title = bk_title;
if ( !title ) title = "pornsharing_" + ( vid || new Date().getTime() );
title = title.replace(/[\\\/:*?"<>|]/g, "_");
var lsturl = "http://pornsharing.com/videoplayer/nvplaylist_ps_beta.php"
+ "?id=" + vid + "&hq=1&autoplay=0";
try {
text = craving.getResponseText( lsturl );
var objJ = ( new Function( "var a=" + decrypt_rc( text ) + ";return a;" ) )();
} catch ( e ) {
objJ = null;
}
if ( !objJ || typeof objJ != "object" ) return null;
if ( !objJ.videos || typeof objJ.videos != "object" ) return null;
var arrDat = [];
for ( var fn in objJ.videos ) {
var obj = {};
obj.fn = fn;
obj.file = objJ.videos[ fn ].fileUrl;
if ( !obj.file || typeof obj.file != "string" ) continue;
obj.num = ( obj.fn.match( /_?(\d+)p/i ) )? parseInt( RegExp.$1, 10 ): 0;
arrDat.push( obj );
}
if ( arrDat.length <= 0 ) return null;
arrDat.reverse();
arrDat.sort( function(a,b){return b.num - a.num;} );
var realUrl = craving.decodeHtml( arrDat[0].file );
if ( !realUrl ) return null;
return { videoTitle0: title, videoUrl0: realUrl };
}
function decrypt_rc( strHex ) {
var seed = "TubeContext@Player";
var objPRNG = new clsPRNG( strtoarr( seed ) );
var arrHex = hextoarr( strHex );
var len = arrHex.length;
for ( var i = 0; i < len; i++ ) {
arrHex[i] = arrHex[i] ^ objPRNG.random();
}
return arrtostr( arrHex );
function strtoarr( str ) {
var arr = [];
if ( typeof str != "string" ) return arr;
var len = str.length;
for ( var i = 0; i < len; i++ ) {
arr.push( str.charCodeAt( i ) );
}
return arr;
}
function arrtostr( arr ) {
var arrstr = [];
if ( !(arr instanceof Array) ) return "";
var len = arr.length;
for ( var i = 0; i < len; i++ ) {
arrstr.push( String.fromCharCode( arr[i] ) );
}
return arrstr.join( "" );
}
function hextoarr( hex ) {
var arr = [];
if ( typeof hex != "string" ) return arr;
if ( !hex.match( /^\s*([0-9A-Fa-f]+)\s*$/ ) ) return arr;
var len = hex.length;
for ( var i = 0; i < len - 1; i = i + 2 ) {
arr.push( parseInt( hex.substr( i, 2 ), 16 ) );
}
return arr;
}
function clsPRNG( arrSeed ) {
var arrB = [];
for ( var i = 0; i < 256; i++ ) arrB[i] = i;
var blen = arrB.length;
arrB.swap = function(a,b) {
var tmp = this[a];
this[a] = this[b];
this[b] = tmp;
};
if ( !arrSeed || !(arrSeed instanceof Array) || !arrSeed.length ) arrSeed = [0];
var slen = arrSeed.length;
var index = 0;
for ( var i = 0; i < 256; i++ ) {
index = ( index + arrB[i] + arrSeed[ (i % slen) ] ) % 256;
arrB.swap( i, index );
}
var count = 0;
index = 0;
this.random = function () {
count = ( count + 1 ) % 256;
index = ( index + arrB[ count ] ) % 256;
arrB.swap( count, index );
return arrB[ ( ( arrB[count] + arrB[index] ) % 256 ) ];
};
}
}