Last active
August 29, 2015 14:04
-
-
Save ckorn/e710ae7df5ca1318d9a8 to your computer and use it in GitHub Desktop.
sourceforge redirector
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/python | |
| from xml.dom import minidom | |
| import requests | |
| import os | |
| import sys | |
| from SocketServer import ThreadingMixIn | |
| from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler | |
| import pickle | |
| import time | |
| cache_dir = './cache' | |
| cache_time = 3600 | |
| def readLink(url): | |
| ret = None | |
| tryCount = 3 | |
| count = 0 | |
| tryNext = True | |
| while tryNext: | |
| count = count + 1 | |
| try: | |
| r = requests.get(url, timeout=3) | |
| #print r.headers['content-type'], r.encoding, type(r.text) | |
| try: | |
| ret = r.text | |
| except AttributeError: | |
| ret = r.content | |
| ret = ret.encode('utf-8') | |
| tryNext = False | |
| except requests.exceptions.Timeout: | |
| if count == tryCount: | |
| raise | |
| return ret | |
| def getFiles(name): | |
| ret = [] | |
| try: | |
| c="https://sourceforge.net/projects/%s/rss"%(name) | |
| xml=readLink(c) | |
| xmldoc = minidom.parseString(xml) | |
| files=xmldoc.getElementsByTagName('channel')[0].getElementsByTagName('item') | |
| for item in files: | |
| f = os.path.basename(item.getElementsByTagName('title')[0].childNodes[0].wholeText) | |
| ret.append(f) | |
| except: | |
| pass | |
| return ret | |
| class sfHandler(BaseHTTPRequestHandler): | |
| def do_GET(self): | |
| global cache_dir, cache_time | |
| project = self.path.strip('/') | |
| if project == "": | |
| self.send_response(302) | |
| self.send_header('Location', 'http://manpages.debian.net/cgi-bin/man.cgi?query=uscan') | |
| self.end_headers() | |
| # filename? | |
| elif "/" in project: | |
| parts = project.split('/') | |
| if len(parts) == 2: | |
| self.send_response(302) | |
| self.send_header('Location', 'http://sourceforge.net/projects/%s/files/%s/download'%(parts[0], parts[1])) | |
| self.end_headers() | |
| else: | |
| self.send_response(200) | |
| self.send_header("Content-type", "text/html") | |
| self.end_headers() | |
| db_file = os.path.join(cache_dir, "%(project)s.db"%locals()) | |
| if (os.path.exists(db_file)) and ( time.time() - os.stat(db_file).st_mtime < cache_time ): | |
| db = open(db_file, 'r' ) | |
| files = pickle.load(db) | |
| db.close() | |
| else: | |
| files = getFiles(project) | |
| db = open(db_file,'w') | |
| pickle.dump(files,db) | |
| db.close() | |
| html=""" | |
| <html> | |
| <head></head> | |
| <body> | |
| """ | |
| self.wfile.write(html) | |
| for f in files: | |
| self.wfile.write("<a href='%(f)s'>%(f)s</a><br/>\n"%locals()) | |
| self.wfile.write('</body></html>') | |
| class ThreadingHTTPServer(ThreadingMixIn, HTTPServer): | |
| pass | |
| def main(): | |
| global cache_dir | |
| if not os.path.isdir(cache_dir): | |
| os.mkdir(cache_dir) | |
| server = ThreadingHTTPServer( | |
| ("0.0.0.0", int(sys.argv[1])), sfHandler ) | |
| server.serve_forever() | |
| if __name__ == '__main__': | |
| try: | |
| main() | |
| except KeyboardInterrupt: | |
| print "Interrupted" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment