diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml
index 32999fe..4722e68 100644
--- a/.github/workflows/build.yaml
+++ b/.github/workflows/build.yaml
@@ -46,7 +46,7 @@ jobs:
strategy:
fail-fast: false
matrix:
- python-version: ['3.9']
+ python-version: ['3.8','3.9']
node-version: ['14']
steps:
diff --git a/build/build-exe-config.template.json b/build/build-exe-config.template.json
index 4f7e3ee..c40e3c2 100644
--- a/build/build-exe-config.template.json
+++ b/build/build-exe-config.template.json
@@ -80,6 +80,14 @@
{
"optionDest": "datas",
"value": "/package.json;./"
+ },
+ {
+ "optionDest": "collect-all",
+ "value": "sanic"
+ },
+ {
+ "optionDest": "collect-all",
+ "value": "setproctitle"
}
],
"nonPyinstallerOptions": {
diff --git a/build/build-exe.py b/build/build-exe.py
index c3fde21..8a46cd8 100644
--- a/build/build-exe.py
+++ b/build/build-exe.py
@@ -1,10 +1,15 @@
import json
+from helpers.os_environment import isLinux
file = open('build-exe-config.json', 'r')
config = json.loads(file.read())
file.close()
-cmd_str = "pyinstaller "
+if isLinux():
+ cmd_str = "python3 -m PyInstaller "
+else:
+ cmd_str = "pyinstaller "
+
json_dests = ["icon_file", "clean_build"]
pyi_dests = ["icon", "clean"]
diff --git a/build/build-linux.sh b/build/build-linux.sh
index c5a9ea9..49d60f0 100755
--- a/build/build-linux.sh
+++ b/build/build-linux.sh
@@ -1,4 +1,5 @@
#!/bin/bash
+set -x
cd "$(dirname "$0")"
# Get the git commit / branch and write it into build.py.
diff --git a/build/build-macos.sh b/build/build-macos.sh
index 1648b57..2b3337e 100755
--- a/build/build-macos.sh
+++ b/build/build-macos.sh
@@ -1,4 +1,5 @@
#!/bin/bash
+set -x
cd "$(dirname "$0")"
# Get the git commit / branch and write it into build.py.
diff --git a/build/requirements.txt b/build/requirements.txt
index 2dcdff0..3909025 100644
--- a/build/requirements.txt
+++ b/build/requirements.txt
@@ -1,7 +1,7 @@
wheel
pygame==2.0.2
sanic==21.9.3
-sanic-Cors==1.0.1
+sanic-Cors==2.0.1
syncer==1.3.0
aiohttp==3.7.4
mutagen==1.45.1
diff --git a/ui-templates/config_server.html b/ui-templates/config_server.html
index 18a2852..04e7d99 100644
--- a/ui-templates/config_server.html
+++ b/ui-templates/config_server.html
@@ -56,7 +56,7 @@
{% endfor %}
- Normalisation requests significant CPU requirements, if you're finding the CPU usuage is too high / causing audio glitches, disable this feature. ffmpeg
or avconf
required.
+ Normalisation requests significant CPU requirements, if you're finding the CPU usage is too high / causing audio glitches, disable this feature. ffmpeg
or avconf
required.
diff --git a/web_server.py b/web_server.py
index a14627e..1189abe 100644
--- a/web_server.py
+++ b/web_server.py
@@ -1,10 +1,8 @@
from sanic import Sanic
-from sanic.exceptions import NotFound, abort
+from sanic.exceptions import NotFound, SanicException
from sanic.response import html, file, redirect
from sanic.response import json as resp_json
from sanic_cors import CORS
-from syncer import sync
-import asyncio
from jinja2 import Environment, FileSystemLoader
from jinja2.utils import select_autoescape
from urllib.parse import unquote
@@ -16,6 +14,7 @@ from queue import Empty
from time import sleep
import json
import os
+import sys
from helpers.os_environment import (
isLinux,
@@ -89,7 +88,7 @@ LOGGING_CONFIG = dict(
},
)
-app = Sanic("BAPSicle Web Server", log_config=LOGGING_CONFIG)
+app = Sanic("BAPSicle-WebServer", log_config=LOGGING_CONFIG)
def render_template(file, data, status=200):
@@ -258,8 +257,7 @@ def ui_logs_render(request, path):
try:
log_file = open(resolve_external_file_path("/logs/{}.log").format(path))
except FileNotFoundError:
- abort(404)
- return
+ raise SanicException("Not Found",404)
data = {
"logs": log_file.read().splitlines()[
@@ -285,10 +283,10 @@ def player_simple(request, channel: int, command: str):
player_to_q[channel].put("UI:" + command.upper())
return redirect("/status")
- abort(404)
+ raise SanicException("Not Found",404)
-@app.route("/player//seek/")
+@app.route("/player//seek/")
def player_seek(request, channel: int, pos: float):
player_to_q[channel].put("UI:SEEK:" + str(pos))
@@ -310,7 +308,7 @@ def player_remove(request, channel: int, channel_weight: int):
return redirect("/status")
-@app.route("/player//output/")
+@app.route("/player//output/")
def player_output(request, channel: int, name: Optional[str]):
player_to_q[channel].put("UI:OUTPUT:" + unquote(str(name)))
return redirect("/config/player")
@@ -322,7 +320,7 @@ def player_autoadvance(request, channel: int, state: int):
return redirect("/status")
-@app.route("/player//repeat/")
+@app.route("/player//repeat/")
def player_repeat(request, channel: int, state: str):
player_to_q[channel].put("UI:REPEAT:" + state.upper())
return redirect("/status")
@@ -386,11 +384,11 @@ async def api_search_library(request):
)
-@app.route("/library/playlists/")
+@app.route("/library/playlists/")
async def api_get_playlists(request, type: str):
if type not in ["music", "aux"]:
- abort(401)
+ raise SanicException("Bad Request",400)
if type == "music":
return resp_json(await api.get_playlist_music())
@@ -398,11 +396,11 @@ async def api_get_playlists(request, type: str):
return resp_json(await api.get_playlist_aux())
-@app.route("/library/playlist//")
+@app.route("/library/playlist//")
async def api_get_playlist(request, type: str, library_id: str):
if type not in ["music", "aux"]:
- abort(401)
+ raise SanicException("Bad Request",400)
if type == "music":
return resp_json(await api.get_playlist_music_items(library_id))
@@ -424,10 +422,10 @@ def json_status(request):
# Get audio for UI to generate waveforms.
-@app.route("/audiofile//")
+@app.route("/audiofile//")
async def audio_file(request, type: str, id: int):
if type not in ["managed", "track"]:
- abort(404)
+ raise SanicException("Bad Request",400)
filename = resolve_external_file_path(
"music-tmp/{}-{}.mp3".format(type, id))
@@ -438,8 +436,7 @@ async def audio_file(request, type: str, id: int):
try:
response = await file(filename)
except FileNotFoundError:
- abort(404)
- return
+ raise SanicException("Not Found: "+filename,404)
return response
@@ -552,23 +549,13 @@ def WebServer(player_to: List[Queue], player_from: Queue, state: StateManager):
terminate = Terminator()
while not terminate.terminate:
try:
- sync(
- app.run(
- host=server_state.get()["host"],
- port=server_state.get()["port"],
- auto_reload=False,
- debug=not package.BETA,
- access_log=not package.BETA,
- )
+ app.run(
+ host=server_state.get()["host"],
+ port=server_state.get()["port"],
+ auto_reload=False,
+ debug=not package.BETA,
+ access_log=not package.BETA,
)
- except Exception:
- break
- try:
- loop = asyncio.get_event_loop()
- if loop:
- loop.close()
- if app:
- app.stop()
- del app
- except Exception:
- pass
+ except Exception as e:
+ logger.log.exception(e)
+ sys.exit(1)