refactor startup code a bit for testing
Gitea/photolib/pipeline/head There was a failure building this commit
Details
Gitea/photolib/pipeline/head There was a failure building this commit
Details
This commit is contained in:
parent
163b4e820e
commit
971d990003
|
@ -215,6 +215,8 @@ Some way to mass process photos in batches. For example, the batch jobs could:
|
||||||
- create a downloadable mini-album
|
- create a downloadable mini-album
|
||||||
- proactively generate thumbnails
|
- proactively generate thumbnails
|
||||||
- replace thumbservice, the video thumb service
|
- replace thumbservice, the video thumb service
|
||||||
|
- import photos
|
||||||
|
- also by grabbing them from a foreign source e.g. sftp
|
||||||
|
|
||||||
Could also have:
|
Could also have:
|
||||||
- a session-based mechanism to "select" photos
|
- a session-based mechanism to "select" photos
|
||||||
|
@ -243,3 +245,5 @@ Design notes:
|
||||||
- there is a numeric ID in the `target` column that can be any of a Photo, PhotoSet, or Tag
|
- there is a numeric ID in the `target` column that can be any of a Photo, PhotoSet, or Tag
|
||||||
- which it is, is determined by the `type` column
|
- which it is, is determined by the `type` column
|
||||||
- therefore the code can know which method to locate the file with
|
- therefore the code can know which method to locate the file with
|
||||||
|
|
||||||
|
- need testing to ensure the program is usable without having a dedicated executor etc
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
import os
|
import os
|
||||||
import math
|
import math
|
||||||
import time
|
import time
|
||||||
|
import signal
|
||||||
import logging
|
import logging
|
||||||
|
import argparse
|
||||||
import cherrypy
|
import cherrypy
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
from urllib.parse import urlparse
|
from urllib.parse import urlparse
|
||||||
|
@ -617,10 +619,60 @@ class SearchView(object):
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def setup_webapp(database_url, library_url, cache_url, thumb_service_url, debug=False, max_upload=1024**3):
|
||||||
import argparse
|
|
||||||
import signal
|
|
||||||
|
|
||||||
|
# Get database connection
|
||||||
|
engine = get_db_engine(database_url)
|
||||||
|
|
||||||
|
# Setup database in web framework
|
||||||
|
cherrypy.tools.db = SATool()
|
||||||
|
SAEnginePlugin(cherrypy.engine, engine).subscribe()
|
||||||
|
|
||||||
|
# Create various internal tools
|
||||||
|
library_storage = uri_to_storage(library_url)
|
||||||
|
library_manager = LibraryManager(library_storage)
|
||||||
|
thumbnail_tool = ThumbGenerator(library_manager, uri_to_storage(cache_url), thumb_service_url)
|
||||||
|
|
||||||
|
# Setup and mount web ui
|
||||||
|
tpl_dir = os.path.join(APPROOT, "templates") if not debug else "templates"
|
||||||
|
web = PhotosWeb(library_manager, thumbnail_tool, tpl_dir)
|
||||||
|
cherrypy.tree.mount(web, '/', {'/': {'tools.trailing_slash.on': False,
|
||||||
|
'tools.db.on': True,
|
||||||
|
'error_page.403': web.error,
|
||||||
|
'error_page.404': web.error},
|
||||||
|
'/static': {"tools.staticdir.on": True,
|
||||||
|
"tools.staticdir.dir": os.path.join(APPROOT, "styles/dist")
|
||||||
|
if not debug else os.path.abspath("styles/dist")},
|
||||||
|
'/thumb': {'tools.expires.on': True,
|
||||||
|
'tools.expires.secs': 7 * 86400},
|
||||||
|
'/login': {'tools.auth_basic.on': True,
|
||||||
|
'tools.auth_basic.realm': 'photolib',
|
||||||
|
'tools.auth_basic.checkpassword': validate_password}})
|
||||||
|
|
||||||
|
# Setup and mount API
|
||||||
|
api = PhotosApi(library_manager)
|
||||||
|
cherrypy.tree.mount(api, '/api', {'/': {'tools.sessions.on': False,
|
||||||
|
'tools.trailing_slash.on': False,
|
||||||
|
'tools.auth_basic.on': True,
|
||||||
|
'tools.auth_basic.realm': 'photolib',
|
||||||
|
'tools.auth_basic.checkpassword': validate_password,
|
||||||
|
'tools.db.on': True,
|
||||||
|
'request.dispatch': cherrypy.dispatch.MethodDispatcher()}})
|
||||||
|
|
||||||
|
# General config options
|
||||||
|
cherrypy.config.update({
|
||||||
|
'tools.sessions.storage_class': DatabaseSession,
|
||||||
|
'tools.sessions.on': True,
|
||||||
|
'tools.sessions.locking': 'explicit',
|
||||||
|
'tools.sessions.timeout': 525600,
|
||||||
|
'request.show_tracebacks': True,
|
||||||
|
'server.show_tracebacks': True,
|
||||||
|
'log.screen': False,
|
||||||
|
'server.max_request_body_size': max_upload
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
parser = argparse.ArgumentParser(description="Photod photo server")
|
parser = argparse.ArgumentParser(description="Photod photo server")
|
||||||
|
|
||||||
parser.add_argument('-p', '--port', help="tcp port to listen on",
|
parser.add_argument('-p', '--port', help="tcp port to listen on",
|
||||||
|
@ -654,58 +706,21 @@ def main():
|
||||||
if not args.thumb_service:
|
if not args.thumb_service:
|
||||||
logging.warning("THUMB_SERVICE_URL not set. Video thumbnails will be unavailable")
|
logging.warning("THUMB_SERVICE_URL not set. Video thumbnails will be unavailable")
|
||||||
|
|
||||||
# Get database connection
|
setup_webapp(
|
||||||
engine = get_db_engine(args.database)
|
args.database,
|
||||||
|
args.library,
|
||||||
|
args.cache,
|
||||||
|
args.thumb_service,
|
||||||
|
debug=args.debug,
|
||||||
|
max_upload=args.max_upload
|
||||||
|
)
|
||||||
|
|
||||||
# Setup database in web framework
|
# Server config options
|
||||||
cherrypy.tools.db = SATool()
|
|
||||||
SAEnginePlugin(cherrypy.engine, engine).subscribe()
|
|
||||||
|
|
||||||
# Create various internal tools
|
|
||||||
library_storage = uri_to_storage(args.library)
|
|
||||||
library_manager = LibraryManager(library_storage)
|
|
||||||
thumbnail_tool = ThumbGenerator(library_manager, uri_to_storage(args.cache), args.thumb_service)
|
|
||||||
|
|
||||||
# Setup and mount web ui
|
|
||||||
tpl_dir = os.path.join(APPROOT, "templates") if not args.debug else "templates"
|
|
||||||
web = PhotosWeb(library_manager, thumbnail_tool, tpl_dir)
|
|
||||||
cherrypy.tree.mount(web, '/', {'/': {'tools.trailing_slash.on': False,
|
|
||||||
'tools.db.on': True,
|
|
||||||
'error_page.403': web.error,
|
|
||||||
'error_page.404': web.error},
|
|
||||||
'/static': {"tools.staticdir.on": True,
|
|
||||||
"tools.staticdir.dir": os.path.join(APPROOT, "styles/dist")
|
|
||||||
if not args.debug else os.path.abspath("styles/dist")},
|
|
||||||
'/thumb': {'tools.expires.on': True,
|
|
||||||
'tools.expires.secs': 7 * 86400},
|
|
||||||
'/login': {'tools.auth_basic.on': True,
|
|
||||||
'tools.auth_basic.realm': 'photolib',
|
|
||||||
'tools.auth_basic.checkpassword': validate_password}})
|
|
||||||
|
|
||||||
# Setup and mount API
|
|
||||||
api = PhotosApi(library_manager)
|
|
||||||
cherrypy.tree.mount(api, '/api', {'/': {'tools.sessions.on': False,
|
|
||||||
'tools.trailing_slash.on': False,
|
|
||||||
'tools.auth_basic.on': True,
|
|
||||||
'tools.auth_basic.realm': 'photolib',
|
|
||||||
'tools.auth_basic.checkpassword': validate_password,
|
|
||||||
'tools.db.on': True,
|
|
||||||
'request.dispatch': cherrypy.dispatch.MethodDispatcher()}})
|
|
||||||
|
|
||||||
# General config options
|
|
||||||
cherrypy.config.update({
|
cherrypy.config.update({
|
||||||
'tools.sessions.storage_class': DatabaseSession,
|
|
||||||
'tools.sessions.on': True,
|
|
||||||
'tools.sessions.locking': 'explicit',
|
|
||||||
'tools.sessions.timeout': 525600,
|
|
||||||
'request.show_tracebacks': True,
|
|
||||||
'server.socket_port': args.port,
|
'server.socket_port': args.port,
|
||||||
'server.thread_pool': 25,
|
'server.thread_pool': 25,
|
||||||
'server.socket_host': '0.0.0.0',
|
'server.socket_host': '0.0.0.0',
|
||||||
'server.show_tracebacks': True,
|
|
||||||
'log.screen': False,
|
|
||||||
'engine.autoreload.on': args.debug,
|
'engine.autoreload.on': args.debug,
|
||||||
'server.max_request_body_size': args.max_upload
|
|
||||||
})
|
})
|
||||||
|
|
||||||
# Setup signal handling and run it.
|
# Setup signal handling and run it.
|
||||||
|
|
Loading…
Reference in New Issue