forked from captbaritone/urlmeme
/
url.py
111 lines (88 loc) · 3.27 KB
/
url.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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
import re
import logging
import json
import os
from flask import Flask, send_from_directory, render_template, request, abort
from memegenerator import gen_meme
from ngram import NGram
from hashlib import md5
from logging.handlers import RotatingFileHandler
APP_ROOT = os.path.dirname(__file__)
MEME_PATH = os.path.join(APP_ROOT, 'static/memes/')
TEMPLATES_PATH = os.path.join(APP_ROOT, 'templates/memes/')
app = Flask(__name__)
# Maps meme's file name to its common names
with open(os.path.join(APP_ROOT, 'memes.json')) as data_file:
MEMES = json.load(data_file)
def replace_underscore(string):
return re.sub(r'_', ' ', string)
def tokenize(string):
string = re.sub(r' ', '', string)
return replace_underscore(string.lower())
def guess_meme_image(meme_name):
'''
Guess which meme image they mean by finding the alias with greatest ngram
similarity
'''
meme_name = tokenize(meme_name)
best = ''
best_score = None
for guess_image, names in MEMES.items():
for guess in names:
guess = tokenize(guess)
score = NGram.compare(guess, meme_name)
if best_score is None or score > best_score:
best_score = score
best = guess_image
app.logger.info('New best meme for "%s": "%s" (Score: %s)', meme_name, guess, score)
app.logger.info('Picked meme "%s" for name "%s"' % (best, meme_name))
return best
@app.route("/")
def help():
return render_template('help.html', base_url=request.base_url)
@app.route('/favicon.ico')
def favicon():
return send_from_directory(os.path.join(app.root_path, 'static'),
'favicon.ico', mimetype='image/vnd.microsoft.icon')
@app.route('/<path:path>')
def meme(path):
image_extensions = ('png', 'jpeg', 'jpg', 'gif')
extensions = image_extensions + ('json', 'log')
ext = 'jpg'
if path.endswith(tuple('.%s' % e for e in extensions)):
path_parts = path.split('.')
path = ''.join(path_parts[:-1])
ext = path_parts[-1]
path_parts = path.split('/')
while(len(path_parts) < 3):
path_parts.append('')
try:
meme_name, top, bottom = tuple(path_parts)
except ValueError:
abort(404)
meme_image = guess_meme_image(meme_name)
top = replace_underscore(top)
bottom = replace_underscore(bottom)
if ext == 'log':
return meme_image
elif ext == 'json':
return json.dumps({'image': meme_image, 'top': top, 'bottom': bottom})
elif ext in image_extensions:
meme_path = os.path.join(TEMPLATES_PATH, meme_image)
meme_id = md5("%s|%s|%s" % (meme_image, top, bottom)).hexdigest()
file_path = '%s.%s' % (meme_id, ext)
try:
open(MEME_PATH + file_path)
app.logger.debug('file "%s" exists', file_path)
except IOError:
app.logger.info('Generating Meme')
gen_meme(meme_path + '.jpg', top, bottom, MEME_PATH + file_path)
return send_from_directory(MEME_PATH, file_path)
if __name__ == "__main__":
handler = RotatingFileHandler(
os.path.join(APP_ROOT, 'access.log'),
maxBytes=10000,
backupCount=1)
handler.setLevel(logging.INFO)
app.logger.addHandler(handler)
app.run()