Synchronize Etiquette and YCDL.
This commit is contained in:
parent
18e1849fcf
commit
28181428be
4 changed files with 42 additions and 25 deletions
|
@ -1710,7 +1710,8 @@ class PhotoDB(
|
||||||
existing_database = self.database_filepath.exists
|
existing_database = self.database_filepath.exists
|
||||||
|
|
||||||
if not existing_database and not create:
|
if not existing_database and not create:
|
||||||
raise FileNotFoundError(f'"{self.data_directory}" does not exist and create is off.')
|
msg = f'"{self.database_filepath.absolute_path}" does not exist and create is off.'
|
||||||
|
raise FileNotFoundError(msg)
|
||||||
|
|
||||||
os.makedirs(self.data_directory.absolute_path, exist_ok=True)
|
os.makedirs(self.data_directory.absolute_path, exist_ok=True)
|
||||||
self.sql = sqlite3.connect(self.database_filepath.absolute_path)
|
self.sql = sqlite3.connect(self.database_filepath.absolute_path)
|
||||||
|
|
|
@ -1,3 +1,7 @@
|
||||||
|
'''
|
||||||
|
Do not execute this file directly.
|
||||||
|
Use etiquette_flask_launch.py to start the server with gevent.
|
||||||
|
'''
|
||||||
import flask; from flask import request
|
import flask; from flask import request
|
||||||
import gzip
|
import gzip
|
||||||
import io
|
import io
|
||||||
|
@ -15,7 +19,7 @@ from . import jinja_filters
|
||||||
from . import jsonify
|
from . import jsonify
|
||||||
from . import sessions
|
from . import sessions
|
||||||
|
|
||||||
# Runtime init #####################################################################################
|
# Flask init #######################################################################################
|
||||||
|
|
||||||
root_dir = pathclass.Path(__file__).parent.parent
|
root_dir = pathclass.Path(__file__).parent.parent
|
||||||
|
|
||||||
|
@ -39,8 +43,6 @@ site.jinja_env.lstrip_blocks = True
|
||||||
jinja_filters.register_all(site)
|
jinja_filters.register_all(site)
|
||||||
site.debug = True
|
site.debug = True
|
||||||
|
|
||||||
P = etiquette.photodb.PhotoDB()
|
|
||||||
|
|
||||||
session_manager = sessions.SessionManager(maxlen=10000)
|
session_manager = sessions.SessionManager(maxlen=10000)
|
||||||
file_cache_manager = caching.FileCacheManager(
|
file_cache_manager = caching.FileCacheManager(
|
||||||
maxlen=10000,
|
maxlen=10000,
|
||||||
|
@ -86,7 +88,7 @@ def after_request(response):
|
||||||
bail = bail or response.status_code < 200
|
bail = bail or response.status_code < 200
|
||||||
bail = bail or response.status_code >= 300
|
bail = bail or response.status_code >= 300
|
||||||
bail = bail or response.direct_passthrough
|
bail = bail or response.direct_passthrough
|
||||||
bail = bail or int(response.headers.get('Content-Length', gzip_minimum_size)) > gzip_maximum_size
|
bail = bail or int(response.headers.get('Content-Length', 0)) > gzip_maximum_size
|
||||||
bail = bail or len(response.get_data()) < gzip_minimum_size
|
bail = bail or len(response.get_data()) < gzip_minimum_size
|
||||||
bail = bail or 'gzip' not in accept_encoding.lower()
|
bail = bail or 'gzip' not in accept_encoding.lower()
|
||||||
bail = bail or 'Content-Encoding' in response.headers
|
bail = bail or 'Content-Encoding' in response.headers
|
||||||
|
@ -208,6 +210,8 @@ def send_file(filepath, override_mimetype=None):
|
||||||
if not filepath.is_file:
|
if not filepath.is_file:
|
||||||
flask.abort(404)
|
flask.abort(404)
|
||||||
|
|
||||||
|
file_size = filepath.size
|
||||||
|
|
||||||
headers = file_cache_manager.matches(request=request, filepath=filepath)
|
headers = file_cache_manager.matches(request=request, filepath=filepath)
|
||||||
if headers:
|
if headers:
|
||||||
response = flask.Response(status=304, headers=headers)
|
response = flask.Response(status=304, headers=headers)
|
||||||
|
@ -240,21 +244,21 @@ def send_file(filepath, override_mimetype=None):
|
||||||
if range_min is None:
|
if range_min is None:
|
||||||
range_min = 0
|
range_min = 0
|
||||||
if range_max is None:
|
if range_max is None:
|
||||||
range_max = filepath.size
|
range_max = file_size
|
||||||
|
|
||||||
# because ranges are 0-indexed
|
# because ranges are 0-indexed
|
||||||
range_max = min(range_max, filepath.size - 1)
|
range_max = min(range_max, file_size - 1)
|
||||||
range_min = max(range_min, 0)
|
range_min = max(range_min, 0)
|
||||||
|
|
||||||
range_header = 'bytes {min}-{max}/{outof}'.format(
|
range_header = 'bytes {min}-{max}/{outof}'.format(
|
||||||
min=range_min,
|
min=range_min,
|
||||||
max=range_max,
|
max=range_max,
|
||||||
outof=filepath.size,
|
outof=file_size,
|
||||||
)
|
)
|
||||||
outgoing_headers['Content-Range'] = range_header
|
outgoing_headers['Content-Range'] = range_header
|
||||||
status = 206
|
status = 206
|
||||||
else:
|
else:
|
||||||
range_max = filepath.size - 1
|
range_max = file_size - 1
|
||||||
range_min = 0
|
range_min = 0
|
||||||
status = 200
|
status = 200
|
||||||
|
|
||||||
|
@ -280,3 +284,9 @@ def send_file(filepath, override_mimetype=None):
|
||||||
headers=outgoing_headers,
|
headers=outgoing_headers,
|
||||||
)
|
)
|
||||||
return response
|
return response
|
||||||
|
|
||||||
|
####################################################################################################
|
||||||
|
|
||||||
|
def init_photodb(*args, **kwargs):
|
||||||
|
global P
|
||||||
|
P = etiquette.photodb.PhotoDB(*args, **kwargs)
|
||||||
|
|
|
@ -3,6 +3,8 @@ import jinja2.filters
|
||||||
|
|
||||||
import voussoirkit.bytestring
|
import voussoirkit.bytestring
|
||||||
|
|
||||||
|
####################################################################################################
|
||||||
|
|
||||||
filter_functions = []
|
filter_functions = []
|
||||||
global_functions = []
|
global_functions = []
|
||||||
|
|
||||||
|
|
|
@ -16,51 +16,55 @@ import argparse
|
||||||
import gevent.pywsgi
|
import gevent.pywsgi
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
from voussoirkit import pathclass
|
||||||
|
|
||||||
import etiquette_flask_entrypoint
|
import etiquette_flask_entrypoint
|
||||||
|
|
||||||
site = etiquette_flask_entrypoint.site
|
HTTPS_DIR = pathclass.Path(__file__).parent.with_child('https')
|
||||||
|
|
||||||
def run(port=None, use_https=None):
|
|
||||||
if port is None:
|
|
||||||
port = 5000
|
|
||||||
else:
|
|
||||||
port = int(port)
|
|
||||||
|
|
||||||
|
def etiquette_flask_launch(create, port, use_https):
|
||||||
if use_https is None:
|
if use_https is None:
|
||||||
use_https = port == 443
|
use_https = port == 443
|
||||||
|
|
||||||
if use_https:
|
if use_https:
|
||||||
http = gevent.pywsgi.WSGIServer(
|
http = gevent.pywsgi.WSGIServer(
|
||||||
listener=('0.0.0.0', port),
|
listener=('0.0.0.0', port),
|
||||||
application=site,
|
application=etiquette_flask_entrypoint.site,
|
||||||
keyfile='D:\\git\\etiquette\\frontends\\etiquette_flask\\https\\etiquette.key',
|
keyfile=HTTPS_DIR.with_child('etiquette.key').absolute_path,
|
||||||
certfile='D:\\git\\etiquette\\frontends\\etiquette_flask\\https\\etiquette.crt',
|
certfile=HTTPS_DIR.with_child('etiquette.crt').absolute_path,
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
http = gevent.pywsgi.WSGIServer(
|
http = gevent.pywsgi.WSGIServer(
|
||||||
listener=('0.0.0.0', port),
|
listener=('0.0.0.0', port),
|
||||||
application=site,
|
application=etiquette_flask_entrypoint.site,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
etiquette_flask_entrypoint.backend.common.init_photodb(create=create)
|
||||||
|
|
||||||
message = f'Starting server on port {port}'
|
message = f'Starting server on port {port}'
|
||||||
if use_https:
|
if use_https:
|
||||||
message += ' (https)'
|
message += ' (https)'
|
||||||
print(message)
|
print(message)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
http.serve_forever()
|
http.serve_forever()
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
pass
|
pass
|
||||||
return 0
|
|
||||||
|
|
||||||
def run_argparse(args):
|
def etiquette_flask_launch_argparse(args):
|
||||||
return run(port=args.port, use_https=args.use_https)
|
return etiquette_flask_launch(
|
||||||
|
create=args.create,
|
||||||
|
port=args.port,
|
||||||
|
use_https=args.use_https,
|
||||||
|
)
|
||||||
|
|
||||||
def main(argv):
|
def main(argv):
|
||||||
parser = argparse.ArgumentParser()
|
parser = argparse.ArgumentParser()
|
||||||
|
|
||||||
parser.add_argument(dest='port', nargs='?', default=None)
|
parser.add_argument('port', nargs='?', type=int, default=5000)
|
||||||
|
parser.add_argument('--dont_create', '--dont-create', '--no-create', dest='create', action='store_false', default=True)
|
||||||
parser.add_argument('--https', dest='use_https', action='store_true', default=None)
|
parser.add_argument('--https', dest='use_https', action='store_true', default=None)
|
||||||
parser.set_defaults(func=run_argparse)
|
parser.set_defaults(func=etiquette_flask_launch_argparse)
|
||||||
|
|
||||||
args = parser.parse_args(argv)
|
args = parser.parse_args(argv)
|
||||||
return args.func(args)
|
return args.func(args)
|
||||||
|
|
Loading…
Reference in a new issue