.. _integrations: 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 :attr:`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 :data:`browsepy.plugin_manager` and :data:`browsepy.app.extensions['plugin_manager']`) should be reloaded using the :meth:`browsepy.plugin_manager.reload` instance method of :meth:`browsepy.manager.PluginManager.reload` for browsepy's plugin manager. The other way of loading a plugin programmatically is calling :meth:`browsepy.plugin_manager.load_plugin` instance method of :meth:`browsepy.manager.PluginManager.load_plugin` for browsepy's plugin manager. .. _integrations-cherrymusic: Cherrypy and Cherrymusic ------------------------- Startup script running browsepy inside the `cherrypy `_ server provided by `cherrymusic `_. .. code-block:: python #!/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...')