JSONEncoder and manual
Focus on remving deprecated flas.JSONEncoder and replacing it with json.JSONEncoder. * Exception handling when API is not accessible [fix #25] * flask.JSONEncoder deprecated [fix #24] * Show manual (if present) [fix #23] * Small touch-ups
This commit is contained in:
parent
e03ab77a67
commit
ad3fd6a195
@ -1,10 +1,10 @@
|
|||||||
from flask import request, jsonify, Flask
|
from flask import request, jsonify, Flask
|
||||||
from flask.json import JSONEncoder
|
import json
|
||||||
from datetime import date
|
from datetime import date
|
||||||
import modules.db_connect
|
import modules.db_connect
|
||||||
|
|
||||||
|
|
||||||
class MyJSONEncoder(JSONEncoder):
|
class MyJSONEncoder(json.JSONEncoder):
|
||||||
def default(self, o):
|
def default(self, o):
|
||||||
if isinstance(o, date):
|
if isinstance(o, date):
|
||||||
return o.isoformat()
|
return o.isoformat()
|
||||||
@ -18,8 +18,8 @@ class MyFlask(Flask):
|
|||||||
|
|
||||||
app = MyFlask(__name__)
|
app = MyFlask(__name__)
|
||||||
modules.db_connect.init()
|
modules.db_connect.init()
|
||||||
import modules.gamelist # noqa: E402
|
import modules.gamelist # noqa: E402
|
||||||
import modules.game # noqa: E402
|
import modules.game # noqa: E402
|
||||||
|
|
||||||
# Important initialization stuff
|
# Important initialization stuff
|
||||||
config = modules.db_connect.config
|
config = modules.db_connect.config
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
from __main__ import app
|
from __main__ import app
|
||||||
from flask import jsonify, request
|
from flask import jsonify, request, send_from_directory
|
||||||
import base64
|
import base64
|
||||||
import json
|
import json
|
||||||
import modules.db_connect
|
import modules.db_connect
|
||||||
@ -75,3 +75,14 @@ def artwork(size='max'):
|
|||||||
artlist.append(art)
|
artlist.append(art)
|
||||||
|
|
||||||
return jsonify(artlist)
|
return jsonify(artlist)
|
||||||
|
|
||||||
|
|
||||||
|
# Server game manual
|
||||||
|
@app.route('/getmanual', methods=["GET"])
|
||||||
|
def getmanual():
|
||||||
|
nfopath = base64.b64decode(request.json).decode()
|
||||||
|
nfo = json.load(open(nfopath, 'r'))
|
||||||
|
nfo['path'] = base64.b64encode(nfopath.encode('utf-8')).decode()
|
||||||
|
manualname = nfo['game']['manual']
|
||||||
|
manualpath = os.path.dirname(nfopath)+'/'
|
||||||
|
return send_from_directory(manualpath, manualname, as_attachment=True)
|
||||||
|
|||||||
@ -31,7 +31,7 @@ def update_gamelist():
|
|||||||
game = modules.game.game(nfo, True, True)
|
game = modules.game.game(nfo, True, True)
|
||||||
glist.append(game)
|
glist.append(game)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(e)
|
print(nfo, e)
|
||||||
|
|
||||||
set_gamelist(glist)
|
set_gamelist(glist)
|
||||||
return make_response("<h1>Success</h1>", 200)
|
return make_response("<h1>Success</h1>", 200)
|
||||||
|
|||||||
@ -1,7 +1,8 @@
|
|||||||
{
|
{
|
||||||
|
"lang_error_body_header": "Oops, something went wrong",
|
||||||
"lang_home_body_header": "Hello and welcome",
|
"lang_home_body_header": "Hello and welcome",
|
||||||
"lang_home_change_language": "Change language",
|
"lang_home_change_language": "Change language",
|
||||||
"lang_home_change_language_button": "CHange",
|
"lang_home_change_language_button": "Change",
|
||||||
"lang_navigation_home": "Home",
|
"lang_navigation_home": "Home",
|
||||||
"lang_navigation_gamelist": "Game list",
|
"lang_navigation_gamelist": "Game list",
|
||||||
"lang_gamelist_title": "Gamelist",
|
"lang_gamelist_title": "Gamelist",
|
||||||
@ -11,6 +12,9 @@
|
|||||||
"lang_game_body_header": "Game",
|
"lang_game_body_header": "Game",
|
||||||
"lang_game_body_ingress": "Here there be info about games n stuff",
|
"lang_game_body_ingress": "Here there be info about games n stuff",
|
||||||
"lang_game_plot": "Plot",
|
"lang_game_plot": "Plot",
|
||||||
|
"lang_game_manual": "Manual",
|
||||||
|
"lang_game_get_manual": "Link to manual",
|
||||||
|
"lang_game_manual_not_found": "Manual not available",
|
||||||
"lang_game_download_header": "Download game",
|
"lang_game_download_header": "Download game",
|
||||||
"lang_game_download_ingress": "Here you can download the game using either torrent file or a magnet-link!",
|
"lang_game_download_ingress": "Here you can download the game using either torrent file or a magnet-link!",
|
||||||
"lang_game_download_torrent_button": "Download",
|
"lang_game_download_torrent_button": "Download",
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
{
|
{
|
||||||
|
"lang_error_body_header": "Ojdå, någonting gick fel",
|
||||||
"lang_home_body_header": "Hej och välkommen",
|
"lang_home_body_header": "Hej och välkommen",
|
||||||
"lang_home_change_language": "Byt språk",
|
"lang_home_change_language": "Byt språk",
|
||||||
"lang_home_change_language_button": "Byt",
|
"lang_home_change_language_button": "Byt",
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
from __main__ import app
|
from __main__ import app
|
||||||
import json
|
import json
|
||||||
import requests
|
import requests
|
||||||
from flask import render_template, request
|
from flask import render_template, request, Response
|
||||||
import modules.init
|
import modules.init
|
||||||
|
|
||||||
host_endpoint = modules.init.host_endpoint()
|
host_endpoint = modules.init.host_endpoint()
|
||||||
@ -47,3 +47,15 @@ def artwork(lang_code):
|
|||||||
@app.route("/<lang_code>/game/download")
|
@app.route("/<lang_code>/game/download")
|
||||||
def download(lang_code):
|
def download(lang_code):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
# Download manual
|
||||||
|
@app.route("/<lang_code>/game/getmanual")
|
||||||
|
def getmanual(lang_code):
|
||||||
|
gamepath = request.args.get("gamepath")
|
||||||
|
manualname = request.args.get("manual")
|
||||||
|
manual = requests.get(host_endpoint + '/getmanual', json=gamepath)
|
||||||
|
return Response(manual, mimetype="application/pdf",
|
||||||
|
headers={
|
||||||
|
"Content-Disposition":
|
||||||
|
"attachment;filename=" + str(manualname)})
|
||||||
|
|||||||
@ -21,14 +21,29 @@ def lang(lang_code):
|
|||||||
# @app.route("/gamelist")
|
# @app.route("/gamelist")
|
||||||
def gamelist(lang_code):
|
def gamelist(lang_code):
|
||||||
lang_code = lang(lang_code)
|
lang_code = lang(lang_code)
|
||||||
glist = json.loads((requests.get(
|
glist = None
|
||||||
host_endpoint + '/gamelist').content).decode())
|
try:
|
||||||
|
glist = json.loads((requests.get(
|
||||||
|
host_endpoint + '/gamelist').content).decode())
|
||||||
|
|
||||||
# Sorting list alphabetically
|
# Sorting list alphabetically
|
||||||
glist = sorted(glist, key=lambda d: d['game']['title'])
|
glist = sorted(glist, key=lambda d: d['game']['title'])
|
||||||
|
|
||||||
return render_template('gamelist.html', gamelist=glist,
|
# If the server is down
|
||||||
**languages[lang_code], lang_code=lang_code)
|
except requests.exceptions.ConnectionError as e:
|
||||||
|
print("fancy connection error: ", e)
|
||||||
|
em = "Cannot connect to the API, is the server up?"
|
||||||
|
et = "Connection Error"
|
||||||
|
error_object = {"error_type": et, "error_message": em}
|
||||||
|
return render_template('error.html', **languages[lang_code],
|
||||||
|
lang_code=lang_code, error_object=error_object)
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print("error type: ", type(e))
|
||||||
|
|
||||||
|
if glist is not None:
|
||||||
|
return render_template('gamelist.html', gamelist=glist,
|
||||||
|
**languages[lang_code], lang_code=lang_code)
|
||||||
|
|
||||||
|
|
||||||
# Update/Refresh the gamelist by re-scanning the game archive (slow)
|
# Update/Refresh the gamelist by re-scanning the game archive (slow)
|
||||||
|
|||||||
17
site/templates/error.html
Normal file
17
site/templates/error.html
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>BCNS</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
{% extends "navigation.html" %}
|
||||||
|
{% block content %}
|
||||||
|
<h1>{{lang_error_body_header}}</h1>
|
||||||
|
{% if error_object %}
|
||||||
|
<p class="error">Something went wrong</p>
|
||||||
|
<p>{{error_object.error_type}}</p>
|
||||||
|
<p>{{error_object.error_message}}</p>
|
||||||
|
{% endif %}
|
||||||
|
{% endblock %}
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@ -14,6 +14,12 @@
|
|||||||
{% for part in game.game.plot %}
|
{% for part in game.game.plot %}
|
||||||
<p>{{part}}</p>
|
<p>{{part}}</p>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
<h3>{{lang_game_manual}}</h3>
|
||||||
|
{% if 'manual' in game.game %}
|
||||||
|
<a href="{{ url_for('getmanual', gamepath=game.path, manual=game.game.manual, lang_code=lang_code)}}">{{lang_game_get_manual}}</a>
|
||||||
|
{% else %}
|
||||||
|
<p>{{lang_game_manual_not_found}}</p>
|
||||||
|
{% endif%}
|
||||||
<h3>{{lang_game_download_header}}</h3>
|
<h3>{{lang_game_download_header}}</h3>
|
||||||
<p>{{lang_game_download_ingress}}</p>
|
<p>{{lang_game_download_ingress}}</p>
|
||||||
<a href="{{ url_for('download', gamepath=game.path, lang_code=lang_code)}}"><button type="button">{{lang_game_download_torrent_button}}</button></a>
|
<a href="{{ url_for('download', gamepath=game.path, lang_code=lang_code)}}"><button type="button">{{lang_game_download_torrent_button}}</button></a>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user