from __main__ import app from flask import jsonify, request, send_from_directory, send_file import base64 import json import modules.db_connect from modules.functions import reduceartcv2, make_archive import os contentpath = modules.db_connect.contentpath() # Fetch and present all information from one _index.nfo-file @app.route('/game', methods=['POST']) def game( 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 @app.route('/game/artwork/size/', methods=['POST']) @app.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 @app.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) @app.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')