3Dshock/server/main.py

144 lines
3.0 KiB
Python

import os
import json
import time
from pathlib import Path
from flask import Flask, request, abort, send_from_directory
from flask_cors import CORS
import power, capture, download
build_folder = Path('../client/build')
output_folder = Path('./output')
app = Flask(__name__, static_folder=str(build_folder), static_url_path='')
CORS(app)
status = 'Standby'
@app.route('/api/status', methods=['GET'])
def status_get():
return {'status': status}
@app.route('/api/clients', methods=['POST'])
def clients_post():
content = request.json
print('Recieved:', content)
phone = str(content['phone'])
for i in range(1, 100):
suffix = str(i).zfill(3)
folder = phone + '_' + suffix
path = output_folder / folder
if not path.exists():
break
path.mkdir()
info_file = path / 'info.json'
info_file.touch()
info_file.write_text(json.dumps(content, indent=4))
client_id = folder
return {'client_id': client_id}
@app.route('/api/clients/<cid>', methods=['GET'])
def clients_get(cid):
folder = cid
path = output_folder / cid
if not path.exists():
abort(404)
info_file = path / 'info.json'
info_text = info_file.read_text()
res = json.loads(info_text)
photo_glob = path.glob('*.jpg')
res['has_photos'] = bool(list(photo_glob))
return res
@app.route('/api/clients/<cid>/session', methods=['GET'])
def session_get(cid):
folder = cid
path = output_folder / cid
if not path.exists():
abort(404)
photo_glob = path.glob('*.jpg')
res = {}
res['photos'] = sorted([x.name for x in photo_glob])
return res
@app.route('/api/clients/<cid>/session', methods=['DELETE'])
def session_delete(cid):
folder = cid
path = output_folder / cid
if not path.exists():
abort(404)
photo_glob = path.glob('*.jpg')
for p in photo_glob:
p.unlink()
return ''
@app.route('/api/clients/<cid>/session', methods=['POST'])
def session_post(cid):
global status
folder = cid
path = output_folder / cid
if not path.exists():
abort(404)
# go through the photo taking process
status = 'Warming up'
# warmup
power.lights_on()
time.sleep(4)
power.lights_off()
time.sleep(0.5)
status = 'Capturing'
# capture
power.lights_on()
time.sleep(0.25)
capture.trigger_capture()
time.sleep(1)
power.grid_on()
time.sleep(0.25)
capture.trigger_capture()
time.sleep(1)
power.grid_off()
power.lights_off()
status = 'Writing to files'
time.sleep(3)
status = 'Downloading'
download.download_all_photos(path)
status = 'Standby'
return ''
@app.route('/')
def index():
return app.send_static_file('index.html')
@app.errorhandler(404)
def not_found(e):
return app.send_static_file('index.html')
@app.route('/output/<path:filename>')
def output(filename):
return send_from_directory('output/', filename)
app.run(host='0.0.0.0')