Merge branch 'master' of https://github.com/klemek/meme-otron
This commit is contained in:
+2
-1
@@ -1,4 +1,5 @@
|
|||||||
.env
|
.env
|
||||||
.idea
|
.idea
|
||||||
__pycache__
|
__pycache__
|
||||||
error_*.txt
|
error_*.txt
|
||||||
|
tmp
|
||||||
+28
-17
@@ -12,10 +12,16 @@ ALIASES = {}
|
|||||||
logger = logging.getLogger("meme_db")
|
logger = logging.getLogger("meme_db")
|
||||||
|
|
||||||
|
|
||||||
def load_memes():
|
def load_memes(purge=False):
|
||||||
"""
|
"""
|
||||||
TODO
|
TODO
|
||||||
|
|
||||||
|
:param (bool) purge:
|
||||||
"""
|
"""
|
||||||
|
global DATA, ALIASES
|
||||||
|
if purge:
|
||||||
|
DATA = {}
|
||||||
|
ALIASES = {}
|
||||||
try:
|
try:
|
||||||
with open(DATA_FILE) as f:
|
with open(DATA_FILE) as f:
|
||||||
content = "".join(f.readlines())
|
content = "".join(f.readlines())
|
||||||
@@ -71,32 +77,37 @@ def load_item(i, item):
|
|||||||
text = load_text(c, raw_text)
|
text = load_text(c, raw_text)
|
||||||
if text.text_ref is None:
|
if text.text_ref is None:
|
||||||
c += 1
|
c += 1
|
||||||
elif text.text_ref < 0 or text.text_ref >= len(meme.texts):
|
elif text.text_ref < 1 or text.text_ref > len(meme.texts):
|
||||||
logger.warning(f"Item '{item_id}'({i}) / Text {j}: invalid text reference {text.text_ref}")
|
logger.warning(
|
||||||
|
f"Item '{item_id}'({i + 1}) / Text {j + 1}: invalid text reference {text.text_ref}")
|
||||||
continue
|
continue
|
||||||
else:
|
else:
|
||||||
|
text.text_ref -= 1
|
||||||
text.text = meme.texts[text.text_ref].text
|
text.text = meme.texts[text.text_ref].text
|
||||||
meme.texts += [text]
|
meme.texts += [text]
|
||||||
except TypeError as e:
|
except TypeError as e:
|
||||||
logger.warning(f"Item '{item_id}'({i}) / Text {j}: {e}")
|
logger.warning(f"Item '{item_id}'({i + 1}) / Text {j + 1}: {e}")
|
||||||
for text in meme.texts:
|
for text in meme.texts:
|
||||||
text.update(meme.text_base)
|
text.update(meme.text_base)
|
||||||
if not meme.abstract and len(meme.texts) == 0:
|
if not meme.abstract and len(meme.texts) == 0:
|
||||||
logger.warning(f"Item '{item_id}'({i}): no texts loaded")
|
logger.warning(f"Item '{item_id}'({i + 1}): no texts loaded")
|
||||||
else:
|
else:
|
||||||
DATA[item_id] = meme
|
DATA[item_id] = meme
|
||||||
for alias in meme.aliases:
|
if not meme.abstract:
|
||||||
if alias in ALIASES:
|
ALIASES[item_id] = item_id
|
||||||
logger.warning(f"Item '{item_id}'({i}): alias '{alias}' already registered by '{ALIASES[alias]}'")
|
for alias in meme.aliases:
|
||||||
else:
|
if alias in ALIASES:
|
||||||
ALIASES[alias] = item_id
|
logger.warning(
|
||||||
|
f"Item '{item_id}'({i + 1}): alias '{alias}' already registered by '{ALIASES[alias]}'")
|
||||||
|
else:
|
||||||
|
ALIASES[alias] = item_id
|
||||||
logger.info(f"Loaded meme '{item_id}' with {len(meme.texts)} texts")
|
logger.info(f"Loaded meme '{item_id}' with {len(meme.texts)} texts")
|
||||||
except KeyError as e:
|
except KeyError as e:
|
||||||
logger.warning(f"Item '{item_id}'({i}): key {e} not found")
|
logger.warning(f"Item '{item_id}'({i + 1}): key {e} not found")
|
||||||
except TypeError as e:
|
except TypeError as e:
|
||||||
logger.warning(f"Item '{item_id}'({i}): {e}")
|
logger.warning(f"Item '{item_id}'({i + 1}): {e}")
|
||||||
except NameError as e:
|
except NameError as e:
|
||||||
logger.warning(f"Item '{item_id}'({i}): {e}")
|
logger.warning(f"Item '{item_id}'({i + 1}): {e}")
|
||||||
|
|
||||||
|
|
||||||
def load_text(c, raw_text, text=None):
|
def load_text(c, raw_text, text=None):
|
||||||
@@ -120,7 +131,8 @@ def load_text(c, raw_text, text=None):
|
|||||||
text.font_size = utils.read_key_safe(raw_text, "font_size", text.font_size, types=[float, int])
|
text.font_size = utils.read_key_safe(raw_text, "font_size", text.font_size, types=[float, int])
|
||||||
text.fill = utils.read_key_safe(raw_text, "fill", text.fill, types=[int], is_list=True, is_list_size=3)
|
text.fill = utils.read_key_safe(raw_text, "fill", text.fill, types=[int], is_list=True, is_list_size=3)
|
||||||
text.stroke_width = utils.read_key_safe(raw_text, "stroke_width", text.stroke_width, types=[float, int])
|
text.stroke_width = utils.read_key_safe(raw_text, "stroke_width", text.stroke_width, types=[float, int])
|
||||||
text.stroke_fill = utils.read_key_safe(raw_text, "stroke_fill", text.stroke_fill, types=[int], is_list=True, is_list_size=3)
|
text.stroke_fill = utils.read_key_safe(raw_text, "stroke_fill", text.stroke_fill, types=[int], is_list=True,
|
||||||
|
is_list_size=3)
|
||||||
if "position" in raw_text:
|
if "position" in raw_text:
|
||||||
if raw_text["position"] not in [p.name for p in Pos]:
|
if raw_text["position"] not in [p.name for p in Pos]:
|
||||||
raise TypeError(f"'position' is not a valid position (ex: NW, E, SE, ...)")
|
raise TypeError(f"'position' is not a valid position (ex: NW, E, SE, ...)")
|
||||||
@@ -140,9 +152,8 @@ def get_meme(name):
|
|||||||
:rtype: Meme|None
|
:rtype: Meme|None
|
||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
if name in DATA and not DATA[name].abstract:
|
name = name.lower().strip().replace(" ", "_")
|
||||||
return DATA[name].clone()
|
if name in ALIASES:
|
||||||
elif name in ALIASES:
|
|
||||||
return DATA[ALIASES[name]].clone()
|
return DATA[ALIASES[name]].clone()
|
||||||
else:
|
else:
|
||||||
return None
|
return None
|
||||||
|
|||||||
@@ -21,6 +21,16 @@ left_wmark.x_range = [0.005, 0.995]
|
|||||||
left_wmark.y_range = [0.005, 0.995]
|
left_wmark.y_range = [0.005, 0.995]
|
||||||
|
|
||||||
|
|
||||||
|
def parse_text(s):
|
||||||
|
"""
|
||||||
|
TODO
|
||||||
|
|
||||||
|
:param (str) s:
|
||||||
|
:rtype: str
|
||||||
|
"""
|
||||||
|
return s.replace("\\n", "\n")
|
||||||
|
|
||||||
|
|
||||||
def compute(*args, left_wmark_text=None, debug=False):
|
def compute(*args, left_wmark_text=None, debug=False):
|
||||||
"""
|
"""
|
||||||
TODO
|
TODO
|
||||||
@@ -43,7 +53,7 @@ def compute(*args, left_wmark_text=None, debug=False):
|
|||||||
for i in range(len(meme.texts)):
|
for i in range(len(meme.texts)):
|
||||||
if meme.texts[i].text_ref is None:
|
if meme.texts[i].text_ref is None:
|
||||||
if i < len(args) - 1:
|
if i < len(args) - 1:
|
||||||
meme.texts[i].text = args[c + 1]
|
meme.texts[i].text = parse_text(args[c + 1])
|
||||||
else:
|
else:
|
||||||
meme.texts[i].text = ""
|
meme.texts[i].text = ""
|
||||||
c += 1
|
c += 1
|
||||||
|
|||||||
+130
-7
@@ -218,11 +218,11 @@
|
|||||||
},{
|
},{
|
||||||
"x_range": [0.16, 0.45],
|
"x_range": [0.16, 0.45],
|
||||||
"y_range": [0.73, 0.91],
|
"y_range": [0.73, 0.91],
|
||||||
"text_ref": 1
|
"text_ref": 2
|
||||||
},{
|
},{
|
||||||
"x_range": [0.69, 0.98],
|
"x_range": [0.69, 0.98],
|
||||||
"y_range": [0.72, 0.90],
|
"y_range": [0.72, 0.90],
|
||||||
"text_ref": 1
|
"text_ref": 2
|
||||||
}]
|
}]
|
||||||
},{
|
},{
|
||||||
"id": "aliens",
|
"id": "aliens",
|
||||||
@@ -414,7 +414,7 @@
|
|||||||
"x_range": [0.33, 0.48],
|
"x_range": [0.33, 0.48],
|
||||||
"y_range": [0.37, 0.43],
|
"y_range": [0.37, 0.43],
|
||||||
"font_size": 0.04,
|
"font_size": 0.04,
|
||||||
"text_ref": 1
|
"text_ref": 2
|
||||||
},{
|
},{
|
||||||
"x_range": [0.03, 0.29],
|
"x_range": [0.03, 0.29],
|
||||||
"y_range": [0.33, 0.45]
|
"y_range": [0.33, 0.45]
|
||||||
@@ -422,7 +422,7 @@
|
|||||||
"x_range": [0.56, 0.74],
|
"x_range": [0.56, 0.74],
|
||||||
"y_range": [0.37, 0.43],
|
"y_range": [0.37, 0.43],
|
||||||
"font_size": 0.04,
|
"font_size": 0.04,
|
||||||
"text_ref": 1
|
"text_ref": 2
|
||||||
},{
|
},{
|
||||||
"x_range": [0.72, 0.96],
|
"x_range": [0.72, 0.96],
|
||||||
"y_range": [0.36, 0.47]
|
"y_range": [0.36, 0.47]
|
||||||
@@ -430,7 +430,7 @@
|
|||||||
"x_range": [0.27, 0.40],
|
"x_range": [0.27, 0.40],
|
||||||
"y_range": [0.65, 0.70],
|
"y_range": [0.65, 0.70],
|
||||||
"font_size": 0.04,
|
"font_size": 0.04,
|
||||||
"text_ref": 1
|
"text_ref": 2
|
||||||
},{
|
},{
|
||||||
"x_range": [0.12, 0.37],
|
"x_range": [0.12, 0.37],
|
||||||
"y_range": [0.53, 0.68]
|
"y_range": [0.53, 0.68]
|
||||||
@@ -438,7 +438,7 @@
|
|||||||
"x_range": [0.53, 0.64],
|
"x_range": [0.53, 0.64],
|
||||||
"y_range": [0.61, 0.67],
|
"y_range": [0.61, 0.67],
|
||||||
"font_size": 0.03,
|
"font_size": 0.03,
|
||||||
"text_ref": 1
|
"text_ref": 2
|
||||||
},{
|
},{
|
||||||
"x_range": [0.65, 0.95],
|
"x_range": [0.65, 0.95],
|
||||||
"y_range": [0.58, 0.70]
|
"y_range": [0.58, 0.70]
|
||||||
@@ -476,7 +476,7 @@
|
|||||||
},{
|
},{
|
||||||
"x_range": [0.53, 0.80],
|
"x_range": [0.53, 0.80],
|
||||||
"y_range": [0.68, 0.97],
|
"y_range": [0.68, 0.97],
|
||||||
"text_ref": 0
|
"text_ref": 1
|
||||||
},{
|
},{
|
||||||
"x_range": [0.62, 0.95],
|
"x_range": [0.62, 0.95],
|
||||||
"y_range": [0.03, 0.26],
|
"y_range": [0.03, 0.26],
|
||||||
@@ -500,4 +500,127 @@
|
|||||||
"font_size": 0.04,
|
"font_size": 0.04,
|
||||||
"position": "E"
|
"position": "E"
|
||||||
}]
|
}]
|
||||||
|
},{
|
||||||
|
"id": "flex_tape",
|
||||||
|
"template": "flex_tape.jpg",
|
||||||
|
"based_on": "white_text",
|
||||||
|
"texts": [{
|
||||||
|
"x_range": [0.18, 0.43],
|
||||||
|
"y_range": [0.10, 0.40]
|
||||||
|
},{
|
||||||
|
"x_range": [0.60, 0.90],
|
||||||
|
"y_range": [0.10, 0.30]
|
||||||
|
},{
|
||||||
|
"x_range": [0.50, 0.84],
|
||||||
|
"y_range": [0.58, 0.82]
|
||||||
|
}]
|
||||||
|
},{
|
||||||
|
"id": "girl_cat",
|
||||||
|
"template": "girl_cat.jpg",
|
||||||
|
"based_on": "white_text",
|
||||||
|
"position": "S",
|
||||||
|
"font_size": 0.12,
|
||||||
|
"texts": [{
|
||||||
|
"x_range": [0.01, 0.49],
|
||||||
|
"y_range": [0.50, 0.99]
|
||||||
|
},{
|
||||||
|
"x_range": [0.51, 0.99],
|
||||||
|
"y_range": [0.50, 0.99]
|
||||||
|
}]
|
||||||
|
},{
|
||||||
|
"id": "gru",
|
||||||
|
"template": "gru.jpg",
|
||||||
|
"texts": [{
|
||||||
|
"x_range": [0.28, 0.48],
|
||||||
|
"y_range": [0.08, 0.50],
|
||||||
|
"angle": -1
|
||||||
|
},{
|
||||||
|
"x_range": [0.78, 0.98],
|
||||||
|
"y_range": [0.10, 0.50],
|
||||||
|
"angle": -1
|
||||||
|
},{
|
||||||
|
"x_range": [0.28, 0.48],
|
||||||
|
"y_range": [0.60, 1.00],
|
||||||
|
"angle": -1
|
||||||
|
},{
|
||||||
|
"x_range": [0.78, 0.98],
|
||||||
|
"y_range": [0.60, 1.00],
|
||||||
|
"angle": -1
|
||||||
|
}]
|
||||||
|
},{
|
||||||
|
"id": "handshake",
|
||||||
|
"template": "handshake.jpg",
|
||||||
|
"based_on": "white_text",
|
||||||
|
"font_size": 0.12,
|
||||||
|
"texts": [{
|
||||||
|
"x_range": [-0.05, 0.45],
|
||||||
|
"y_range": [0.48, 0.78],
|
||||||
|
"position": "W",
|
||||||
|
"angle": -50
|
||||||
|
},{
|
||||||
|
"x_range": [0.43, 0.99],
|
||||||
|
"y_range": [0.40, 0.70],
|
||||||
|
"position": "E",
|
||||||
|
"angle": 25
|
||||||
|
},{
|
||||||
|
"x_range": [0.25, 0.55],
|
||||||
|
"y_range": [0.01, 0.50],
|
||||||
|
"position": "N",
|
||||||
|
"angle": 5
|
||||||
|
}]
|
||||||
|
},{
|
||||||
|
"id": "handshake2",
|
||||||
|
"template": "handshake2.jpg",
|
||||||
|
"based_on": "white_text",
|
||||||
|
"font_size": 0.07,
|
||||||
|
"texts": [{
|
||||||
|
"x_range": [0.10, 0.45],
|
||||||
|
"y_range": [0.25, 0.70]
|
||||||
|
},{
|
||||||
|
"x_range": [0.55, 0.90],
|
||||||
|
"y_range": [0.35, 0.75]
|
||||||
|
}]
|
||||||
|
},{
|
||||||
|
"id": "idea",
|
||||||
|
"template": "idea.jpg",
|
||||||
|
"texts": [{
|
||||||
|
"x_range": [0.01, 0.58],
|
||||||
|
"y_range": [0.01, 0.28]
|
||||||
|
},{
|
||||||
|
"x_range": [0.01, 0.40],
|
||||||
|
"y_range": [0.38, 0.63],
|
||||||
|
"angle": 18,
|
||||||
|
"position": "N"
|
||||||
|
},{
|
||||||
|
"x_range": [0.01, 0.40],
|
||||||
|
"y_range": [0.73, 0.98],
|
||||||
|
"angle": 18,
|
||||||
|
"position": "N"
|
||||||
|
},{
|
||||||
|
"x_range": [0.65, 0.98],
|
||||||
|
"y_range": [0.12, 0.28],
|
||||||
|
"position": "S",
|
||||||
|
"font": "impact",
|
||||||
|
"stroke_fill": [0, 0, 0],
|
||||||
|
"stroke_width": 0.1,
|
||||||
|
"fill": [255, 255, 255]
|
||||||
|
},{
|
||||||
|
"x_range": [0.55, 0.98],
|
||||||
|
"y_range": [0.45, 0.63],
|
||||||
|
"position": "S",
|
||||||
|
"text_ref": 4,
|
||||||
|
"font": "impact",
|
||||||
|
"stroke_fill": [0, 0, 0],
|
||||||
|
"stroke_width": 0.1,
|
||||||
|
"fill": [255, 255, 255]
|
||||||
|
},{
|
||||||
|
"x_range": [0.55, 0.98],
|
||||||
|
"y_range": [0.80, 0.98],
|
||||||
|
"position": "S",
|
||||||
|
"text_ref": 4,
|
||||||
|
"font": "impact",
|
||||||
|
"stroke_fill": [0, 0, 0],
|
||||||
|
"stroke_width": 0.1,
|
||||||
|
"fill": [255, 255, 255]
|
||||||
|
}]
|
||||||
}]
|
}]
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
import os
|
||||||
|
import stat
|
||||||
|
import time
|
||||||
|
import datetime
|
||||||
|
import logging
|
||||||
|
from os import path
|
||||||
|
from meme_otron import img_factory as imgf
|
||||||
|
from meme_otron import meme_db
|
||||||
|
from meme_otron import utils
|
||||||
|
|
||||||
|
logging.basicConfig(format="%(message)s", level=logging.WARNING)
|
||||||
|
|
||||||
|
imgf.load_fonts()
|
||||||
|
|
||||||
|
db_file = utils.relative_path(__file__, "..", meme_db.DATA_FILE)
|
||||||
|
templates_dir = utils.relative_path(__file__)
|
||||||
|
dst_dir = utils.relative_path(__file__, "tmp")
|
||||||
|
|
||||||
|
if not path.exists(dst_dir):
|
||||||
|
os.mkdir(dst_dir)
|
||||||
|
|
||||||
|
last = None
|
||||||
|
|
||||||
|
while True:
|
||||||
|
while os.stat(db_file)[stat.ST_MTIME] == last:
|
||||||
|
time.sleep(0.1)
|
||||||
|
last = os.stat(db_file)[stat.ST_MTIME]
|
||||||
|
meme_db.load_memes(purge=True)
|
||||||
|
count = 0
|
||||||
|
for meme_id in meme_db.DATA:
|
||||||
|
meme = meme_db.get_meme(meme_id)
|
||||||
|
if meme is not None:
|
||||||
|
img = imgf.make(meme.template, meme.texts, debug=True)
|
||||||
|
if img is not None:
|
||||||
|
img.save(path.join(dst_dir, meme.template))
|
||||||
|
count += 1
|
||||||
|
print(f"{datetime.datetime.now():%H:%M:%S} / {count} registered templates / {len(os.listdir(templates_dir))} files")
|
||||||
Reference in New Issue
Block a user