Files
pyfa/scripts/renders_update.py
2017-06-12 16:12:45 -04:00

124 lines
3.5 KiB
Python

#!/usr/bin/env python3
"""
This script updates ship renders and removes unused ones.
"""
import argparse
import os
import re
import sqlite3
from PIL import Image
parser = argparse.ArgumentParser(description='This script updates ship renders for pyfa')
parser.add_argument('-r', '--renders', required=True, type=str, help='path to unpacked Renders folder from CCP\'s image export')
args = parser.parse_args()
script_dir = os.path.dirname(os.path.abspath(__file__))
db_path = os.path.abspath(os.path.join(script_dir, '..', 'eve.db'))
icons_dir = os.path.abspath(os.path.join(script_dir, '..', 'imgs', 'renders'))
export_dir = os.path.abspath(os.path.expanduser(args.renders))
db = sqlite3.connect(db_path)
cursor = db.cursor()
RENDER_SIZE = (32, 32)
query_ships = 'select it.typeID from invtypes as it inner join invgroups as ig on it.groupID = ig.groupID where ig.categoryID in (6, 65)'
needed = set()
existing = set()
export = set()
for row in cursor.execute(query_ships):
needed.add(row[0])
for container, filedir in (
(existing, icons_dir),
(export, export_dir)
):
for fname in os.listdir(filedir):
if not os.path.isfile(os.path.join(filedir, fname)):
continue
m = re.match(r'^(?P<typeid>\d+)\.png', fname)
if not m:
continue
container.add(int(m.group('typeid')))
toremove = existing.difference(needed)
toupdate = existing.intersection(needed)
toadd = needed.difference(existing)
def crop_image(img):
w, h = img.size
if h == w:
return img
normal = min(h, w)
diff_w = w - normal
diff_h = h - normal
crop_top = diff_h // 2
crop_bot = diff_h // 2 + diff_h % 2
crop_left = diff_w // 2
crop_right = diff_w // 2 + diff_w % 2
box = (crop_left, crop_top, w - crop_right, h - crop_bot)
return img.crop(box)
def get_render(type_id):
fname = '{}.png'.format(type_id)
fullpath = os.path.join(export_dir, fname)
img = Image.open(fullpath)
if img.size != RENDER_SIZE:
img = crop_image(img)
img.thumbnail(RENDER_SIZE, Image.ANTIALIAS)
# Strip all additional image info (mostly for ICC color
# profiles, see issue #337)
img.info.clear()
return img
if toremove:
print('Some renders are not used and will be removed:')
for type_id in sorted(toremove):
fullname = '{}.png'.format(type_id)
print((' {}'.format(fullname)))
fullpath = os.path.join(icons_dir, fullname)
os.remove(fullpath)
if toupdate:
print(('Updating {} renders...'.format(len(toupdate))))
missing = toupdate.difference(export)
toupdate.intersection_update(export)
for type_id in sorted(toupdate):
render = get_render(type_id)
fname = '{}.png'.format(type_id)
fullpath = os.path.join(icons_dir, fname)
render.save(fullpath, 'png')
if missing:
print((' {} renders are missing in export:'.format(len(missing))))
for type_id in sorted(missing):
print((' {}.png'.format(type_id)))
if toadd:
print(('Adding {} renders...'.format(len(toadd))))
missing = toadd.difference(export)
toadd.intersection_update(export)
for type_id in sorted(toadd):
render = get_render(type_id)
fname = '{}.png'.format(type_id)
fullpath = os.path.join(icons_dir, fname)
render.save(fullpath, 'png')
if missing:
print((' {} renders are missing in export:'.format(len(missing))))
for type_id in sorted(missing):
print((' {}.png'.format(type_id)))