Skip to content

Instantly share code, notes, and snippets.

@ckorn
Last active August 29, 2015 14:04
Show Gist options
  • Select an option

  • Save ckorn/e710ae7df5ca1318d9a8 to your computer and use it in GitHub Desktop.

Select an option

Save ckorn/e710ae7df5ca1318d9a8 to your computer and use it in GitHub Desktop.
sourceforge redirector
#!/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