From 1a849d6b0e5c3b145dbdd25a1526dd14df13cc9c Mon Sep 17 00:00:00 2001 From: deflax Date: Thu, 6 Feb 2025 16:36:44 +0000 Subject: [PATCH] Refactor the api --- src/api/Dockerfile | 17 ++- src/api/{api.py => app/app.py} | 20 ++-- src/api/app/prestart.sh | 3 + src/api/{ => app}/static/css/root.css | 0 src/api/{ => app}/static/images/favicon.ico | Bin .../{ => app}/static/images/forgejo-96.png | Bin .../{ => app}/static/images/freeravemini.png | Bin .../static/images/icons8-discord-96.png | Bin .../static/images/icons8-facebook-96.png | Bin .../static/images/icons8-instagram-96.png | Bin .../static/images/icons8-soundcloud-96.png | Bin .../static/images/icons8-twitch-96.png | Bin .../static/images/icons8-youtube-96.png | Bin src/api/{ => app}/static/images/jtlogo.png | Bin src/api/{ => app}/static/images/logo-96.png | Bin src/api/{ => app}/static/images/logo.png | Bin src/api/{ => app}/static/images/odeala.jpg | Bin src/api/{ => app}/static/images/odealo.jpg | Bin src/api/{ => app}/static/images/poster.png | Bin src/api/{ => app}/templates/index.html | 0 src/api/{ => app}/templates/robots.txt | 0 src/api/{ => app}/templates/watch.html | 0 src/api/scripts/entrypoint.sh | 12 +++ src/api/scripts/run.sh | 100 ++++++++++++++++++ src/api/start.sh | 5 - 25 files changed, 137 insertions(+), 20 deletions(-) rename src/api/{api.py => app/app.py} (96%) create mode 100644 src/api/app/prestart.sh rename src/api/{ => app}/static/css/root.css (100%) rename src/api/{ => app}/static/images/favicon.ico (100%) rename src/api/{ => app}/static/images/forgejo-96.png (100%) rename src/api/{ => app}/static/images/freeravemini.png (100%) rename src/api/{ => app}/static/images/icons8-discord-96.png (100%) rename src/api/{ => app}/static/images/icons8-facebook-96.png (100%) rename src/api/{ => app}/static/images/icons8-instagram-96.png (100%) rename src/api/{ => app}/static/images/icons8-soundcloud-96.png (100%) rename src/api/{ => app}/static/images/icons8-twitch-96.png (100%) rename src/api/{ => app}/static/images/icons8-youtube-96.png (100%) rename src/api/{ => app}/static/images/jtlogo.png (100%) rename src/api/{ => app}/static/images/logo-96.png (100%) rename src/api/{ => app}/static/images/logo.png (100%) rename src/api/{ => app}/static/images/odeala.jpg (100%) rename src/api/{ => app}/static/images/odealo.jpg (100%) rename src/api/{ => app}/static/images/poster.png (100%) rename src/api/{ => app}/templates/index.html (100%) rename src/api/{ => app}/templates/robots.txt (100%) rename src/api/{ => app}/templates/watch.html (100%) create mode 100644 src/api/scripts/entrypoint.sh create mode 100644 src/api/scripts/run.sh delete mode 100644 src/api/start.sh diff --git a/src/api/Dockerfile b/src/api/Dockerfile index b57edc6..704908b 100644 --- a/src/api/Dockerfile +++ b/src/api/Dockerfile @@ -6,8 +6,6 @@ ffmpeg \ apt-get clean && \ rm -rf /var/lib/apt/lists/* -WORKDIR /python-docker - COPY requirements.txt requirements.txt RUN pip3 install -r requirements.txt @@ -15,9 +13,18 @@ COPY requirements-pydantic-pin.txt requirements-pydantic-pin.txt RUN pip3 install -r requirements-pydantic-pin.txt RUN pip3 install https://github.com/datarhei/core-client-python/archive/refs/tags/1.1.0.tar.gz -COPY . . -RUN chmod +x start.sh +COPY ./scripts/entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh + +COPY ./scripts/run.sh /run.sh +RUN chmod +x /run.sh + +COPY ./app /app +WORKDIR /app/ + +ENV PYTHONPATH=/app EXPOSE 8080 -ENTRYPOINT [ "start.sh" ] \ No newline at end of file +ENTRYPOINT ["/entrypoint.sh"] +CMD ["/run.sh"] \ No newline at end of file diff --git a/src/api/api.py b/src/api/app/app.py similarity index 96% rename from src/api/api.py rename to src/api/app/app.py index d6e6fd9..660fa0a 100644 --- a/src/api/api.py +++ b/src/api/app/app.py @@ -11,7 +11,7 @@ from flask.helpers import send_file, send_from_directory from apscheduler.schedulers.background import BackgroundScheduler from core_client import Client -app = Flask(__name__) +api = Flask(__name__) scheduler = BackgroundScheduler() # Log handlers @@ -238,7 +238,7 @@ def client_address(req): return req.environ['HTTP_X_FORWARDED_FOR'] # Frontend -@app.route('/', methods=['GET']) +@api.route('/', methods=['GET']) def root_route(): # Get a list of video files and thumbnails video_files = [file for file in os.listdir(f'{rec_path}/vod/') if file.endswith(('.mp4', '.mkv', '.avi'))] @@ -254,18 +254,18 @@ def root_route(): return render_template('index.html', now=datetime.utcnow(), video_files=video_files, thumbnails=sorted_thumbnails) # JSON Data -@app.route('/playhead', methods=['GET']) +@api.route('/playhead', methods=['GET']) def playhead_route(): global playhead return jsonify(playhead) -@app.route('/database', methods=['GET']) +@api.route('/database', methods=['GET']) def database_route(): global database return jsonify(database) # Images -@app.route("/thumb/", methods=['GET']) +@api.route("/thumb/", methods=['GET']) def thumb_route(thumb_file): thumb_path = f'{rec_path}/thumb/{thumb_file}' if not os.path.exists(thumb_path): @@ -273,7 +273,7 @@ def thumb_route(thumb_file): return send_file(thumb_path, mimetype='image/png') # Video -@app.route("/video/", methods=['GET']) +@api.route("/video/", methods=['GET']) def video_route(video_file): video_path = f'{rec_path}/vod/{video_file}' if not os.path.exists(video_path): @@ -281,7 +281,7 @@ def video_route(video_file): logger_content.warning('[' + client_address(request) + '] stream' + str(video_path)) return send_file(video_path, mimetype='video/mp4') -@app.route("/video/download/", methods=['GET']) +@api.route("/video/download/", methods=['GET']) def video_download_route(video_file): video_path = f'{rec_path}/vod/{video_file}' if not os.path.exists(video_path): @@ -289,7 +289,7 @@ def video_download_route(video_file): logger_content.warning('[' + client_address(request) + '] download' + str(video_path)) return send_file(video_path, as_attachment=True, download_name=video_file) -@app.route("/video/watch/", methods=['GET']) +@api.route("/video/watch/", methods=['GET']) def video_watch_route(video_file_no_extension): video_file = f'{video_file_no_extension}.mp4' thumb_file = f'{video_file_no_extension}.png' @@ -302,5 +302,5 @@ def video_watch_route(video_file_no_extension): logger_content.warning('[' + client_address(request) + '] player' + str(video_path)) return render_template('watch.html', video_file=video_file, thumb_file=thumb_file) -def create_app(): - return app +def create_api(): + return api diff --git a/src/api/app/prestart.sh b/src/api/app/prestart.sh new file mode 100644 index 0000000..c87b6e5 --- /dev/null +++ b/src/api/app/prestart.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +echo "Scheduler API" \ No newline at end of file diff --git a/src/api/static/css/root.css b/src/api/app/static/css/root.css similarity index 100% rename from src/api/static/css/root.css rename to src/api/app/static/css/root.css diff --git a/src/api/static/images/favicon.ico b/src/api/app/static/images/favicon.ico similarity index 100% rename from src/api/static/images/favicon.ico rename to src/api/app/static/images/favicon.ico diff --git a/src/api/static/images/forgejo-96.png b/src/api/app/static/images/forgejo-96.png similarity index 100% rename from src/api/static/images/forgejo-96.png rename to src/api/app/static/images/forgejo-96.png diff --git a/src/api/static/images/freeravemini.png b/src/api/app/static/images/freeravemini.png similarity index 100% rename from src/api/static/images/freeravemini.png rename to src/api/app/static/images/freeravemini.png diff --git a/src/api/static/images/icons8-discord-96.png b/src/api/app/static/images/icons8-discord-96.png similarity index 100% rename from src/api/static/images/icons8-discord-96.png rename to src/api/app/static/images/icons8-discord-96.png diff --git a/src/api/static/images/icons8-facebook-96.png b/src/api/app/static/images/icons8-facebook-96.png similarity index 100% rename from src/api/static/images/icons8-facebook-96.png rename to src/api/app/static/images/icons8-facebook-96.png diff --git a/src/api/static/images/icons8-instagram-96.png b/src/api/app/static/images/icons8-instagram-96.png similarity index 100% rename from src/api/static/images/icons8-instagram-96.png rename to src/api/app/static/images/icons8-instagram-96.png diff --git a/src/api/static/images/icons8-soundcloud-96.png b/src/api/app/static/images/icons8-soundcloud-96.png similarity index 100% rename from src/api/static/images/icons8-soundcloud-96.png rename to src/api/app/static/images/icons8-soundcloud-96.png diff --git a/src/api/static/images/icons8-twitch-96.png b/src/api/app/static/images/icons8-twitch-96.png similarity index 100% rename from src/api/static/images/icons8-twitch-96.png rename to src/api/app/static/images/icons8-twitch-96.png diff --git a/src/api/static/images/icons8-youtube-96.png b/src/api/app/static/images/icons8-youtube-96.png similarity index 100% rename from src/api/static/images/icons8-youtube-96.png rename to src/api/app/static/images/icons8-youtube-96.png diff --git a/src/api/static/images/jtlogo.png b/src/api/app/static/images/jtlogo.png similarity index 100% rename from src/api/static/images/jtlogo.png rename to src/api/app/static/images/jtlogo.png diff --git a/src/api/static/images/logo-96.png b/src/api/app/static/images/logo-96.png similarity index 100% rename from src/api/static/images/logo-96.png rename to src/api/app/static/images/logo-96.png diff --git a/src/api/static/images/logo.png b/src/api/app/static/images/logo.png similarity index 100% rename from src/api/static/images/logo.png rename to src/api/app/static/images/logo.png diff --git a/src/api/static/images/odeala.jpg b/src/api/app/static/images/odeala.jpg similarity index 100% rename from src/api/static/images/odeala.jpg rename to src/api/app/static/images/odeala.jpg diff --git a/src/api/static/images/odealo.jpg b/src/api/app/static/images/odealo.jpg similarity index 100% rename from src/api/static/images/odealo.jpg rename to src/api/app/static/images/odealo.jpg diff --git a/src/api/static/images/poster.png b/src/api/app/static/images/poster.png similarity index 100% rename from src/api/static/images/poster.png rename to src/api/app/static/images/poster.png diff --git a/src/api/templates/index.html b/src/api/app/templates/index.html similarity index 100% rename from src/api/templates/index.html rename to src/api/app/templates/index.html diff --git a/src/api/templates/robots.txt b/src/api/app/templates/robots.txt similarity index 100% rename from src/api/templates/robots.txt rename to src/api/app/templates/robots.txt diff --git a/src/api/templates/watch.html b/src/api/app/templates/watch.html similarity index 100% rename from src/api/templates/watch.html rename to src/api/app/templates/watch.html diff --git a/src/api/scripts/entrypoint.sh b/src/api/scripts/entrypoint.sh new file mode 100644 index 0000000..db8e663 --- /dev/null +++ b/src/api/scripts/entrypoint.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +set -e + +if [ -f /app/app.py ]; then + DEFAULT_MODULE_NAME=api +fi +MODULE_NAME=${MODULE_NAME:-$DEFAULT_MODULE_NAME} +VARIABLE_NAME=${VARIABLE_NAME:-api} +export APP_MODULE=${APP_MODULE:-"$MODULE_NAME:$VARIABLE_NAME"} + +exec "$@" \ No newline at end of file diff --git a/src/api/scripts/run.sh b/src/api/scripts/run.sh new file mode 100644 index 0000000..ad0307f --- /dev/null +++ b/src/api/scripts/run.sh @@ -0,0 +1,100 @@ +#!/bin/bash + +set -e + +# If there's a prestart.sh script in the /app directory, run it before starting +PRE_START_PATH=/app/prestart.sh +echo "Checking for script in $PRE_START_PATH" +if [ -f $PRE_START_PATH ] ; then + echo "Running script $PRE_START_PATH" + . "$PRE_START_PATH" +else + echo "There is no script $PRE_START_PATH" +fi + +#waitress-serve --trusted-proxy='*' \ +#--trusted-proxy-headers="x-forwarded-for","x-forwarded-host","x-forwarded-proto","x-forwarded-port" \ +#--log-untrusted-proxy-headers --threads=16 --call api:create_app + +params="" + +if [[ -v WAITRESS_LISTEN ]]; then + listeners=$(echo "$WAITRESS_LISTEN" | tr "," "\n") + for listener in $listeners + do + if [[ -z $params ]]; then + params="--listen=$listener" + else + params=" $params --listen=$listener" + fi + done +else + if [[ -v WAITRESS_HOST ]]; then + if [[ -z $params ]]; then + params="--host=$WAITRESS_HOST" + else + params=" $params --host=$WAITRESS_HOST" + fi + fi + if [[ -v WAITRESS_PORT ]]; then + if [[ -z $params ]]; then + params="--port=$WAITRESS_PORT" + else + params=" $params --port=$WAITRESS_PORT" + fi + fi +fi + +if [[ -z $params ]]; then + params="--listen=*:8080" +fi + +if [[ -v WAITRESS_CALL ]]; then + params=" $params --call" +fi +if [[ -v WAITRESS_NO_IPV6 ]]; then + params=" $params --no-ipv6" +fi +if [[ -v WAITRESS_NO_IPV4 ]]; then + params=" $params --no-ipv4" +fi +if [[ -v WAITRESS_EXPOSE_TRACEBACKS ]]; then + params=" $params --expose-tracebacks" +fi +if [[ -v WAITRESS_NO_EXPOSE_TRACEBACKS ]]; then + params=" $params --no-expose-tracebacks" +fi +if [[ -v WAITRESS_THREADS ]]; then + params=" $params --threads=$WAITRESS_THREADS" +fi +if [[ -v WAITRESS_IDENT ]]; then + params=" $params --ident=$WAITRESS_IDENT" +fi +if [[ -v WAITRESS_OUTBUF_OVERFLOW ]]; then + params=" $params --outbuf_overflow=$WAITRESS_OUTBUF_OVERFLOW" +fi +if [[ -v WAITRESS_OUTBUF_HIGH_WATERMARK ]]; then + params=" $params --outbuf_high_watermark=$WAITRESS_OUTBUF_HIGH_WATERMARK" +fi +if [[ -v WAITRESS_INBUF_OVERFLOW ]]; then + params=" $params --inbuf_overflow=$WAITRESS_INBUF_OVERFLOW" +fi +if [[ -v WAITRESS_CONNECTION_LIMIT ]]; then + params=" $params --connection_limit=$WAITRESS_CONNECTION_LIMIT" +fi +if [[ -v WAITRESS_MAX_REQUEST_HEADER_SIZE ]]; then + params=" $params --max_request_header_size=$WAITRESS_MAX_REQUEST_HEADER_SIZE" +fi +if [[ -v WAITRESS_MAX_REQUEST_BODY_SIZE ]]; then + params=" $params --max_request_body_size=$WAITRESS_MAX_REQUEST_BODY_SIZE" +fi +if [[ -v WAITRESS_ASYNCORE_LOOP_TIMEOUT ]]; then + params=" $params --asyncore_loop_timeout=$WAITRESS_ASYNCORE_LOOP_TIMEOUT" +fi +if [[ -v WAITRESS_ASYNCORE_USE_POLL ]]; then + params=" $params --asyncore_use_poll=$WAITRESS_ASYNCORE_USE_POLL" +fi + +# Start Waitress +echo "waitress-serve $params $APP_MODULE" +exec waitress-serve $params $APP_MODULE diff --git a/src/api/start.sh b/src/api/start.sh deleted file mode 100644 index a62b546..0000000 --- a/src/api/start.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh - -waitress-serve --port=8080 --trusted-proxy='*' \ ---trusted-proxy-headers="x-forwarded-for","x-forwarded-host","x-forwarded-proto","x-forwarded-port" \ ---log-untrusted-proxy-headers --threads=16 --call api:create_app \ No newline at end of file