// ==SiteScript== // @siteName Hentai Trinity // @siteUrl http://hentaitrinity.com/ // @author mayan // @authorUrl // @scriptUrl // @description // @date 2010/10/17 // @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\.)?hentaitrinity\.com\/[^\/?]+\/\d+/ ) ) return true; return false; } function getVideoDetail( url ) { //url = url.replace( /http:\/\/www\.hentaitrinity\.com\//, "http://hentaitrinity.com/" ); if ( url.match( /http:\/\/(?:www\.)?hentaitrinity\.com\/([^\/?]+)\/(\d+)/ ) ) { var ttl = RegExp.$1; var epi = RegExp.$2; } else { return null; } var craving = new CravingSiteScript(); var pageurl = "http://hentaitrinity.com/" + ttl + "/" + epi + "/"; var pageurl2 = pageurl + "2/"; var referer = "Referer: http://hentaitrinity.com/"; var objRet2 = getVideoDetail_sub( pageurl2, craving ); if ( objRet2.videoUrl.match( /^http/ ) ) { var objRet = {}; objRet.videoUrl0 = objRet2.videoUrl; if ( objRet2.videoTitle ) objRet.videoTitle0 = objRet2.videoTitle; else objRet.videoTitle0 = ttl + "_" + epi; objRet.videoTitle0 = objRet.videoTitle0.replace(/[\\\/:*?"<>|]/g, "_"); objRet.httpHeader0 = referer; return objRet; } var objRet1 = getVideoDetail_sub( pageurl, craving ); if ( objRet1.videoUrl.match( /^http/ ) ) { objRet = {}; objRet.videoUrl0 = objRet1.videoUrl; if ( objRet1.videoTitle ) objRet.videoTitle0 = objRet1.videoTitle; else if ( objRet2.videoTitle ) objRet.videoTitle0 = objRet2.videoTitle; else objRet.videoTitle0 = ttl + "_" + epi; objRet.videoTitle0 = objRet.videoTitle0.replace(/[\\\/:*?"<>|]/g, "_"); objRet.httpHeader0 = referer; return objRet; } var objReg = /^rtmp[ets]*:\/\/[^\/?&]+\/vod\/mp4:([^?&]+)/; if ( objReg.test( objRet1.videoUrl ) || objReg.test( objRet2.videoUrl ) ) { var file = RegExp.$1; } else { return null; } var realUrl = "http://cravingupload.com/html/" + file; var title = objRet2.videoTitle || objRet1.videoTitle; if ( !title ) title = ttl + "_" + epi; title = title.replace(/[\\\/:*?"<>|]/g, "_"); return { videoTitle0: title, videoUrl0: realUrl, httpHeader0: referer }; } function getVideoDetail_sub( pageurl, craving ) { var objRet = {}; objRet.videoTitle = ""; objRet.videoUrl = ""; try { var text = craving.getResponseText( pageurl ); } catch( e ) { text = ""; } if ( !text ) return objRet; if ( text.match( /jwplayer\([^)]*\)\.setup\((.*?)\)\s*;/ ) && RegExp.$1.match( /[{,]\s*('|")?file\1\s*:\s*('|")(.*?)\2\s*[},]/ ) ) { objRet.videoUrl = RegExp.$3; } if ( text.match( /