Integrations¶
Browsepy is a Flask application and python module, so it could be integrated anywhere python’s WSGI protocol is supported. Also, browsepy’s public API could be easily reused.
Browsepy app config (available at browsepy.app.config) exposes the
following configuration options.
- directory_base: anything under this directory will be served, defaults to current path.
- directory_start: directory will be served when accessing root URL
- directory_remove: file removing will be available under this path, defaults to None.
- directory_upload: file upload will be available under this path, defaults to None.
- directory_tar_buffsize, directory tar streaming buffer size, defaults to 262144 and must be multiple of 512.
- directory_downloadable whether enable directory download or not, defaults to True.
- use_binary_multiples whether use binary units (bi-bytes, like KiB) instead of common ones (bytes, like KB), defaults to True.
- plugin_modules list of module names (absolute or relative to plugin_namespaces) will be loaded.
- plugin_namespaces prefixes for module names listed at plugin_modules where relative plugin_modules are searched.
Please note: After editing plugin_modules value, plugin manager (available
at module browsepy.plugin_manager and
browsepy.app.extensions['plugin_manager']) should be reloaded using
the browsepy.plugin_manager.reload() instance method of browsepy.manager.PluginManager.reload() for browsepy’s plugin
manager.
The other way of loading a plugin programmatically is calling
browsepy.plugin_manager.load_plugin() instance method of
browsepy.manager.PluginManager.load_plugin() for browsepy’s plugin
manager.
Cherrypy and Cherrymusic¶
Startup script running browsepy inside the cherrypy server provided by cherrymusic.
#!/env/bin/python
# -*- coding: UTF-8 -*-
import os
import sys
import cherrymusicserver
import cherrypy
from os.path import expandvars, dirname, abspath, join as joinpath
from browsepy import app as browsepy, plugin_manager
class HTTPHandler(cherrymusicserver.httphandler.HTTPHandler):
def autoLoginActive(self):
return True
class Root(object):
pass
cherrymusicserver.httphandler.HTTPHandler = HTTPHandler
base_path = abspath(dirname(__file__))
static_path = joinpath(base_path, 'static')
media_path = expandvars('$HOME/media')
download_path = joinpath(media_path, 'downloads')
root_config = {
'/': {
'tools.staticdir.on': True,
'tools.staticdir.dir': static_path,
'tools.staticdir.index': 'index.html',
}
}
cherrymusic_config = {
'server.rootpath': '/player',
}
browsepy.config.update(
APPLICATION_ROOT = '/browse',
directory_base = media_path,
directory_start = media_path,
directory_remove = media_path,
directory_upload = media_path,
plugin_modules = ['player'],
)
plugin_manager.reload()
if __name__ == '__main__':
sys.stderr = open(joinpath(base_path, 'stderr.log'), 'w')
sys.stdout = open(joinpath(base_path, 'stdout.log'), 'w')
with open(joinpath(base_path, 'pidfile.pid'), 'w') as f:
f.write('%d' % os.getpid())
cherrymusicserver.setup_config(cherrymusic_config)
cherrymusicserver.setup_services()
cherrymusicserver.migrate_databases()
cherrypy.tree.graft(browsepy, '/browse')
cherrypy.tree.mount(Root(), '/', config=root_config)
try:
cherrymusicserver.start_server(cherrymusic_config)
finally:
print('Exiting...')