Extend mediasrv to also serve media files in addons directory

RequestsHandler now rewrites "/_addons" references to addons folder.
This commit is contained in:
Glutanimate 2019-02-26 13:07:06 +01:00
parent fed15f5b90
commit 1fb6123f5a
2 changed files with 18 additions and 1 deletions

View File

@ -1350,7 +1350,8 @@ Please ensure a profile is open and Anki is not busy, then try again."""),
########################################################################## ##########################################################################
def setupMediaServer(self): def setupMediaServer(self):
self.mediaServer = aqt.mediasrv.MediaServer() self.mediaServer = aqt.mediasrv.MediaServer(
addonFolder=self.pm.addonFolder())
self.mediaServer.start() self.mediaServer.start()
def baseHTML(self): def baseHTML(self):

View File

@ -47,7 +47,12 @@ class MediaServer(threading.Thread):
_port = None _port = None
_ready = threading.Event() _ready = threading.Event()
def __init__(self, addonFolder=None, *args, **kwargs):
super().__init__(*args, **kwargs)
self._addonFolder = addonFolder
def run(self): def run(self):
RequestHandler = createRequestHandler(self._addonFolder)
self.server = ThreadedHTTPServer(("127.0.0.1", 0), RequestHandler) self.server = ThreadedHTTPServer(("127.0.0.1", 0), RequestHandler)
self._ready.set() self._ready.set()
self.server.serve_forever() self.server.serve_forever()
@ -59,9 +64,15 @@ class MediaServer(threading.Thread):
def shutdown(self): def shutdown(self):
self.server.shutdown() self.server.shutdown()
def createRequestHandler(addonFolder):
"""RequestHandler factory"""
return type("RequestHandler", (RequestHandler, ),
{"_addonFolder": addonFolder})
class RequestHandler(http.server.SimpleHTTPRequestHandler): class RequestHandler(http.server.SimpleHTTPRequestHandler):
timeout = 1 timeout = 1
_addonFolder = None
def do_GET(self): def do_GET(self):
f = self.send_head() f = self.send_head()
@ -121,11 +132,16 @@ class RequestHandler(http.server.SimpleHTTPRequestHandler):
format%args)) format%args))
# catch /_anki references and rewrite them to web export folder # catch /_anki references and rewrite them to web export folder
# catch /_addons references and rewrite them to addons folder
def _redirectWebExports(self, path): def _redirectWebExports(self, path):
targetPath = os.path.join(os.getcwd(), "_anki", "") targetPath = os.path.join(os.getcwd(), "_anki", "")
if path.startswith(targetPath): if path.startswith(targetPath):
newPath = os.path.join(_exportFolder, path[len(targetPath):]) newPath = os.path.join(_exportFolder, path[len(targetPath):])
return newPath return newPath
targetPath = os.path.join(os.getcwd(), "_addons", "")
if self._addonFolder and path.startswith(targetPath):
newPath = os.path.join(self._addonFolder, path[len(targetPath):])
return newPath
return path return path
# work around Windows machines with incorrect mime type # work around Windows machines with incorrect mime type