-
Notifications
You must be signed in to change notification settings - Fork 0
/
app.py
97 lines (84 loc) · 3.02 KB
/
app.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
from flask import Flask, render_template, request, url_for, flash, redirect
import prometheus_client
from werkzeug.middleware.dispatcher import DispatcherMiddleware
import logging
import os
import random
import secrets
from metrics import gifs_posted, gifs_created
from rainbow import rainbowify
app = Flask(__name__)
app.secret_key = secrets.token_urlsafe(32)
app.wsgi_app = DispatcherMiddleware(app.wsgi_app, {
'/metrics': prometheus_client.make_wsgi_app()
})
params = [{'name': 'blend_amount',
'type': float,
'default': 0.25,
'min': 0.0,
'max': 1.0,
'help': 'How vibrant the rainbow colors should be'},
{'name': 'hue_rate',
'type': int,
'default': 30,
'min': 5,
'max': 100,
'help': 'How fast the colors change'},
{'name': 'duration',
'type': int,
'default': 60,
'min': 5,
'max': 300,
'help': 'How long the gif should be'}
]
def random_name():
return os.urandom(12).hex()
def path_for(id):
output_filename = f"{id}.gif"
output_path = os.path.join('static', 'images', 'output', output_filename)
return output_path
examples_dir = os.path.join('static', 'images', 'examples')
def get_examples():
possible_examples = []
with os.scandir(examples_dir) as it:
for x in it:
if x.is_dir():
in_file = os.path.join(examples_dir, x.name, "in.png")
out_file = os.path.join(examples_dir, x.name, "out.gif")
if os.path.isfile(in_file) and os.path.isfile(out_file):
possible_examples.append({"in": in_file, "out": out_file})
return possible_examples
@app.route('/')
def index():
all_examples = get_examples()
random.shuffle(all_examples)
how_many = 2
examples = all_examples[0:how_many]
return render_template('index.html', examples=examples)
@app.route('/create/', methods=('GET', 'POST'))
def create():
if request.method == 'POST':
inputfile = request.files['inputfile']
logging.info(f'{inputfile=}')
logging.info(f'{type(inputfile)=}')
blend_amount = float(request.form['blend_amount'])
hue_rate = int(request.form['hue_rate'])
duration = int(request.form['duration'])
logging.info(f'{hue_rate=}')
logging.info(f'{blend_amount=}')
logging.info(f'{duration=}')
if not inputfile:
flash('FILE is required!')
else:
gifs_posted.inc()
id = random_name()
output_path = path_for(id)
# TODO: Some checks on the inputfile
rainbowify(inputfile, output_file=output_path, blend_amount=blend_amount, hue_rate=hue_rate, duration=duration)
gifs_created.inc()
return redirect(url_for('display', id=id))
else:
return render_template('create.html', params=params)
@app.route('/display/<id>')
def display(id):
return render_template('display.html', image_path=path_for(id))