Created
December 16, 2010 17:43
-
-
Save gelendir/743715 to your computer and use it in GitHub Desktop.
Query XDCC Parser server for packs
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python2 | |
""" | |
XDCC package list retriever | |
Ugly quick hack by Gregory Eric Sanderson Turcot Temlett MacDonnell Forbes | |
Sends a search request to a XDCC Parser server (http://xdccparser.is-fabulo.us) and returns a list of packs. | |
Requires python2.6 and python-spidermonkey (http://github.com/davisp/python-spidermonkey) | |
""" | |
import sys, urllib, spidermonkey, json | |
#Minified version of JSON-js, An open source JSON encoder/decoder (http://github.com/douglascrockford/JSON-js) | |
JSON_INCLUDE = r""" | |
if(!this.JSON){this.JSON={};} | |
(function(){"use strict";function f(n){return n<10?'0'+n:n;} | |
if(typeof Date.prototype.toJSON!=='function'){Date.prototype.toJSON=function(key){return isFinite(this.valueOf())?this.getUTCFullYear()+'-'+ | |
f(this.getUTCMonth()+1)+'-'+ | |
f(this.getUTCDate())+'T'+ | |
f(this.getUTCHours())+':'+ | |
f(this.getUTCMinutes())+':'+ | |
f(this.getUTCSeconds())+'Z':null;};String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(key){return this.valueOf();};} | |
var cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,escapable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,gap,indent,meta={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'},rep;function quote(string){escapable.lastIndex=0;return escapable.test(string)?'"'+string.replace(escapable,function(a){var c=meta[a];return typeof c==='string'?c:'\\u'+('0000'+a.charCodeAt(0).toString(16)).slice(-4);})+'"':'"'+string+'"';} | |
function str(key,holder){var i,k,v,length,mind=gap,partial,value=holder[key];if(value&&typeof value==='object'&&typeof value.toJSON==='function'){value=value.toJSON(key);} | |
if(typeof rep==='function'){value=rep.call(holder,key,value);} | |
switch(typeof value){case'string':return quote(value);case'number':return isFinite(value)?String(value):'null';case'boolean':case'null':return String(value);case'object':if(!value){return'null';} | |
gap+=indent;partial=[];if(Object.prototype.toString.apply(value)==='[object Array]'){length=value.length;for(i=0;i<length;i+=1){partial[i]=str(i,value)||'null';} | |
v=partial.length===0?'[]':gap?'[\n'+gap+ | |
partial.join(',\n'+gap)+'\n'+ | |
mind+']':'['+partial.join(',')+']';gap=mind;return v;} | |
if(rep&&typeof rep==='object'){length=rep.length;for(i=0;i<length;i+=1){k=rep[i];if(typeof k==='string'){v=str(k,value);if(v){partial.push(quote(k)+(gap?': ':':')+v);}}}}else{for(k in value){if(Object.hasOwnProperty.call(value,k)){v=str(k,value);if(v){partial.push(quote(k)+(gap?': ':':')+v);}}}} | |
v=partial.length===0?'{}':gap?'{\n'+gap+partial.join(',\n'+gap)+'\n'+ | |
mind+'}':'{'+partial.join(',')+'}';gap=mind;return v;}} | |
if(typeof JSON.stringify!=='function'){JSON.stringify=function(value,replacer,space){var i;gap='';indent='';if(typeof space==='number'){for(i=0;i<space;i+=1){indent+=' ';}}else if(typeof space==='string'){indent=space;} | |
rep=replacer;if(replacer&&typeof replacer!=='function'&&(typeof replacer!=='object'||typeof replacer.length!=='number')){throw new Error('JSON.stringify');} | |
return str('',{'':value});};} | |
if(typeof JSON.parse!=='function'){JSON.parse=function(text,reviver){var j;function walk(holder,key){var k,v,value=holder[key];if(value&&typeof value==='object'){for(k in value){if(Object.hasOwnProperty.call(value,k)){v=walk(value,k);if(v!==undefined){value[k]=v;}else{delete value[k];}}}} | |
return reviver.call(holder,key,value);} | |
text=String(text);cx.lastIndex=0;if(cx.test(text)){text=text.replace(cx,function(a){return'\\u'+ | |
('0000'+a.charCodeAt(0).toString(16)).slice(-4);});} | |
if(/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,'@').replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,']').replace(/(?:^|:|,)(?:\s*\[)+/g,''))){j=eval('('+text+')');return typeof reviver==='function'?walk({'':j},''):j;} | |
throw new SyntaxError('JSON.parse');};}}()); | |
""" | |
LIST_INIT = "var packlist = Array();packlist.packs = Array();" | |
rt = spidermonkey.Runtime() | |
cx = rt.new_context() | |
cx.execute(JSON_INCLUDE) | |
def get_packs(server, search): | |
print server | |
print search | |
res = urllib.urlopen( "%s/search.php?%s" % ( server.rstrip('/'), urllib.urlencode({'t' : search}) ) ) | |
cx.execute(LIST_INIT) | |
cx.execute(res.read()) | |
text = cx.execute("JSON.stringify(packlist.packs);") | |
packs = json.loads(text) | |
return packs | |
if __name__ == '__main__': | |
usage = "Usage : %s SERVER SEARCH" % sys.argv[0] | |
if len(sys.argv) <= 1: | |
print usage | |
sys.exit() | |
packs = get_packs( sys.argv[1], ' '.join( sys.argv[2:] ) ) | |
for pack in packs: | |
print "bot : %s name : %s number : %s size : %s" % ( | |
pack['bot'], pack['name'], pack['number'], pack['size'] | |
) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment