It is now possible to run the API with gunicorn using gunicorn -w 4 -b 0.0.0.0:8001 'bcnsGDSAPI:create_app()'. Also did other small changes.
113 lines
4.0 KiB
Python
113 lines
4.0 KiB
Python
from flask import jsonify, request, send_from_directory, send_file, Blueprint
|
|
import base64
|
|
import json
|
|
import bcnsGDSAPI.modules.db_connect
|
|
from bcnsGDSAPI.modules.functions import reduceartcv2, make_archive
|
|
import os
|
|
|
|
contentpath = bcnsGDSAPI.modules.db_connect.contentpath()
|
|
game = Blueprint('game', __name__, template_folder='templates')
|
|
|
|
|
|
# Fetch and present all information from one _index.nfo-file
|
|
@game.route('/game', methods=['POST'])
|
|
def showgame(
|
|
predefinednfo=False,
|
|
return_dict=False,
|
|
skip_artwork=False,
|
|
skip_displayimage=False):
|
|
nfopath = ""
|
|
if predefinednfo is not False:
|
|
nfopath = predefinednfo
|
|
else:
|
|
nfopath = base64.b64decode(request.json).decode()
|
|
nfo = json.load(open(nfopath, 'r'))
|
|
nfo['path'] = base64.b64encode(nfopath.encode('utf-8')).decode()
|
|
nfo['nfo'] = os.path.basename(nfopath)
|
|
|
|
# Add front cover artwork in medium size
|
|
# TODO: Refactor to use next() instead of nested for()
|
|
if skip_displayimage is True:
|
|
nfo['game']['displayimage'] = ""
|
|
else:
|
|
artpath = os.path.dirname(nfopath)+'/art/'
|
|
i = 0
|
|
if 'artwork' in nfo['game']:
|
|
if nfo['game']['artwork']:
|
|
for art in nfo['game']['artwork']:
|
|
try:
|
|
if skip_artwork is False:
|
|
nfo['game']['artwork'][i]['data'] = reduceartcv2(
|
|
artpath+art['filename'], 'thumbnail')
|
|
if art['type'] == 'front':
|
|
nfo['game']['displayimage'] = reduceartcv2(
|
|
artpath+art['filename'], 'thumbnail')
|
|
except Exception as e:
|
|
print("Failing cover: " + art['filename'])
|
|
print(e)
|
|
i += 1
|
|
if 'displayimage' not in nfo['game']:
|
|
for art in nfo['game']['artwork']:
|
|
if art['type'] in ['cd', 'dvd']:
|
|
nfo['game']['displayimage'] = reduceartcv2(
|
|
artpath+art['filename'], 'thumbnail')
|
|
else:
|
|
nfo['game']['displayimage'] = ""
|
|
if return_dict is False:
|
|
return jsonify(nfo)
|
|
return nfo
|
|
|
|
|
|
# Fetch all artwork from a given _index.nfo-file
|
|
@game.route('/game/artwork/size/<size>', methods=['POST'])
|
|
@game.route('/game/artwork', methods=['POST'])
|
|
def artwork(size='max'):
|
|
f = open(request.json['nfo'], 'r')
|
|
nfo = json.load(f)
|
|
|
|
artpath = os.path.dirname(request.json['nfo'])+'/art/'
|
|
artlist = []
|
|
for art in nfo['game']['artwork']:
|
|
img = ""
|
|
|
|
# If max size, send image as-is
|
|
if size == 'max':
|
|
with open(artpath+art['filename'], mode='rb') as file:
|
|
img = file.read()
|
|
art['img'] = base64.b64encode(img).decode()
|
|
|
|
# Changes filetype to jpeg for size reduction. This also drops
|
|
# Alpha-channel
|
|
else:
|
|
art['img'] = reduceartcv2(artpath+art['filename'], size)
|
|
|
|
artlist.append(art)
|
|
|
|
return jsonify(artlist)
|
|
|
|
|
|
# Serve a file. Takes the following object parameters:
|
|
# nfopath base64-encoded full path to specific game nfo-file
|
|
# filepath base64-encoded path to file starting from game dir
|
|
@game.route('/getfile', methods=["GET"])
|
|
def getfile():
|
|
nfopath = os.path.dirname(
|
|
base64.b64decode(request.json['nfopath']).decode())
|
|
filepath = base64.b64decode(request.json['filepath']).decode()
|
|
return send_from_directory(nfopath, filepath, as_attachment=True)
|
|
|
|
|
|
# Game folder as ZIP-file (kinda slow)
|
|
@game.route('/getzipfile', methods=["GET"])
|
|
def getzipfile():
|
|
nfopath = base64.b64decode(request.json).decode()
|
|
nfo = json.load(open(nfopath, 'r'))
|
|
nfo['path'] = base64.b64encode(nfopath.encode('utf-8')).decode()
|
|
path = os.path.dirname(nfopath)
|
|
dirname = os.path.basename(nfopath)
|
|
return send_file(
|
|
make_archive(dirname, path),
|
|
mimetype='application/zip',
|
|
as_attachment=True,
|
|
download_name=str(dirname) + '.zip')
|