63ec0030e7
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.
131 lines
2.9 KiB
Python
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
|
|
|