ocarina/plugins/web_server.py
Bryan Schumaker 63ec0030e7 Web server improvements
The web server can now handle album art, ogg and mp3 files, and do it
all from functions within the class instead of external functions.
2010-11-17 23:33:37 -05:00

131 lines
2.9 KiB
Python

# Bryan Schumaker (11/13/2010)
import ocarina
import imp
from libsaria.sources import library
from libsaria import threads
from libsaria import lastfm
path = ocarina.libsaria.path
exists = path.exists
join = path.join
sep = path.sep
basename = path.basename
splitext = path.splitext
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
html = join(path.cwd(), "html")
server = None
types = {".html":"text/html", ".js":"text/javascript",
".ico":"image/vnd.microsoft.icon",
".py":"text/html", ".jpg":"image/jpeg",
".mp3":"audio/mpeg",
".ogg":"audio/ogg"}
def format_text(text):
text = text.replace("%20", " ")
text = text.replace("%2F", "/")
text = text.replace("%27", "'")
text = text.replace("%2C", ",")
return text
def format_path(path):
if path == "" or path == "/":
path = html + "/index.html"
return path, None
split = path.split("?", 1)
if len(split) == 1:
return html + path, None
path = split[0]
args = split[1].split("&")
kwargs = {}
for arg in args:
split = arg.split("=", 1)
kwargs[split[0]] = format_text(split[1])
return html + path, kwargs
class HTTPRequest(BaseHTTPRequestHandler):
def do_GET(self):
try:
fpath, args = format_path(self.path)
print fpath
base, ext = splitext(fpath)
if ext == ".py":
self.py_file(args, fpath, base)
elif ext == ".jpg":
self.jpg_file(fpath)
elif ext == ".mp3" or ext == ".ogg":
self.audio_file()
else:
self.other_file(fpath, ext)
except IOError:
self.send_error(404, 'File Not Found: %s' % self.path)
def do_POST(self):
print self.path
print "Received a post request!"
def res_ok(self, ext):
self.send_response(200)
self.send_header('Content-type', '%s' % types[ext])
self.end_headers()
def py_file(self, kw, path, base):
if not exists(path):
raise IOError
file = basename(base)
mod = imp.load_source(file, path)
self.res_ok(".py")
mod.to_html(self.wfile, kw)
def jpg_file(self, ipath):
split = self.path.strip("/").split("/")
if split[0] == "artwork":
artist = format_text(split[1])
album = splitext(split[2])[0]
album = format_text(album)
ipath = lastfm.get_artwork_tags(artist, album)
base, ext = splitext(ipath)
self.other_file(ipath, ext)
def audio_file(self):
sid, ext = splitext(self.path.strip("/"))
fpath = library.get_attrs(long(sid), "filepath")[0]
self.other_file(fpath, ext)
def other_file(self, path, ext):
if not exists(path):
raise IOError
try:
print "Opening: %s" % path
f = open(path)
self.res_ok(ext)
self.wfile.write(f.read())
f.close()
except Exception,e:
print "Error!! message: %s" % e
def start_server():
global server
server = HTTPServer(('', 4242), HTTPRequest)
server.serve_forever()
def start():
threads.background(start_server)
def stop():
server.shutdown()
def check_version():
if ocarina.__major__ != 4:
return False
if ocarina.__minor__ >= 1:
return True
return False