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)