Compare commits
3 commits
80d1a06c23
...
f45b76973b
Author | SHA1 | Date | |
---|---|---|---|
|
f45b76973b | ||
|
eec37ad4d9 | ||
|
482aa313fa |
5 changed files with 48 additions and 15 deletions
|
@ -27,4 +27,5 @@ ENV PYTHONPATH=/app
|
|||
EXPOSE 8080
|
||||
|
||||
ENTRYPOINT ["/entrypoint.sh"]
|
||||
CMD ["/run.sh"]
|
||||
CMD ["/run.sh"]
|
||||
|
||||
|
|
|
@ -9,23 +9,16 @@ import requests
|
|||
from datetime import datetime
|
||||
from flask import Flask, render_template, jsonify, request, abort
|
||||
from flask.helpers import send_file, send_from_directory
|
||||
from werkzeug.utils import secure_filename
|
||||
from apscheduler.schedulers.background import BackgroundScheduler
|
||||
from core_client import Client
|
||||
|
||||
app = Flask(__name__)
|
||||
scheduler = BackgroundScheduler()
|
||||
|
||||
# Log handlers
|
||||
logger_api = logging.getLogger('waitress')
|
||||
logger_job = logging.getLogger('apscheduler')
|
||||
logger_content = logging.getLogger('content')
|
||||
|
||||
log_level = os.environ.get('SCHEDULER_LOG_LEVEL', 'INFO').upper()
|
||||
logger_api.setLevel(log_level)
|
||||
logger_job.setLevel(log_level)
|
||||
logger_content = logging.getLogger('content')
|
||||
|
||||
# Variables
|
||||
log_level = os.environ.get('FLASKAPI_LOG_LEVEL', 'INFO').upper()
|
||||
vod_token = os.environ.get('FLASKAPI_VOD_TOKEN')
|
||||
core_hostname = os.environ.get('CORE_API_HOSTNAME', 'stream.example.com')
|
||||
core_username = os.environ.get('CORE_API_AUTH_USERNAME', 'admin')
|
||||
core_password = os.environ.get('CORE_API_AUTH_PASSWORD', 'pass')
|
||||
|
@ -34,6 +27,15 @@ core_sync_period = int(os.environ.get('CORE_SYNC_PERIOD', 15))
|
|||
rec_path = "/recordings"
|
||||
enable_delay = 24
|
||||
|
||||
# Log handlers
|
||||
logger_api = logging.getLogger('waitress')
|
||||
logger_job = logging.getLogger('apscheduler')
|
||||
logger_content = logging.getLogger('content')
|
||||
|
||||
logger_api.setLevel(log_level)
|
||||
logger_job.setLevel(log_level)
|
||||
logger_content = logging.getLogger('content')
|
||||
|
||||
# Init
|
||||
database = {}
|
||||
playhead = {}
|
||||
|
@ -272,7 +274,29 @@ def thumb_route(thumb_file):
|
|||
logger_content.warning('[' + client_address(request) + '] thumb' + str(thumb_path))
|
||||
return send_file(thumb_path, mimetype='image/png')
|
||||
|
||||
# Video
|
||||
# Video uploader
|
||||
@app.route('/video', methods=['POST'])
|
||||
def video_upload():
|
||||
token = request.headers.get("Authorization")
|
||||
if token != "Bearer " + str(vod_token):
|
||||
return "Unauthorized", 401
|
||||
upload_path = f'{rec_path}/vod/'
|
||||
if not os.path.exists(upload_path):
|
||||
abort(404)
|
||||
# Streaming chunks
|
||||
#file = request.files['file']
|
||||
#if file:
|
||||
# with open('large_file.txt', 'wb') as f:
|
||||
# for chunk in file.stream:
|
||||
# f.write(chunk)
|
||||
# return 'File uploaded successfully'
|
||||
#return 'No file provided', 400
|
||||
file = request.files['file']
|
||||
filename = secure_filename(file.filename)
|
||||
file.save(os.path.join(upload_path, filename))
|
||||
return "File uploaded successfully"
|
||||
|
||||
# Video streamer
|
||||
@app.route("/video/<video_file>", methods=['GET'])
|
||||
def video_route(video_file):
|
||||
video_path = f'{rec_path}/vod/{video_file}'
|
||||
|
@ -281,6 +305,7 @@ def video_route(video_file):
|
|||
logger_content.warning('[' + client_address(request) + '] stream' + str(video_path))
|
||||
return send_file(video_path, mimetype='video/mp4')
|
||||
|
||||
# Video download
|
||||
@app.route("/video/download/<video_file>", methods=['GET'])
|
||||
def video_download_route(video_file):
|
||||
video_path = f'{rec_path}/vod/{video_file}'
|
||||
|
@ -289,6 +314,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)
|
||||
|
||||
# Video player
|
||||
@app.route("/video/watch/<video_file_no_extension>", methods=['GET'])
|
||||
def video_watch_route(video_file_no_extension):
|
||||
video_file = f'{video_file_no_extension}.mp4'
|
||||
|
|
|
@ -6,4 +6,5 @@ MODULE_NAME=${MODULE_NAME:-flask_api}
|
|||
VARIABLE_NAME=${VARIABLE_NAME:-create_app}
|
||||
export APP_MODULE=${APP_MODULE:-"$MODULE_NAME:$VARIABLE_NAME"}
|
||||
|
||||
exec "$@"
|
||||
exec "$@"
|
||||
|
||||
|
|
|
@ -16,4 +16,5 @@ pwd
|
|||
waitress-serve --port=8080 --threads=16 \
|
||||
--trusted-proxy='*' --log-untrusted-proxy-headers \
|
||||
--trusted-proxy-headers='x-forwarded-for x-forwarded-proto' \
|
||||
--call $APP_MODULE
|
||||
--call $APP_MODULE
|
||||
|
||||
|
|
|
@ -1,14 +1,18 @@
|
|||
BASE_URL=example.com
|
||||
EMAIL=info@example.com
|
||||
ACCOUNT_THUMBPRINT=CHANGE_ME
|
||||
|
||||
CORE_LOG_LEVEL=warn
|
||||
CORE_API_HOSTNAME=stream.example.com
|
||||
CORE_API_AUTH_USERNAME=admin
|
||||
CORE_API_AUTH_PASSWORD=CHANGE_ME
|
||||
SCHEDULER_LOG_LEVEL=warn
|
||||
FLASKAPI_LOG_LEVEL=warn
|
||||
FLASKAPI_VOD_TOKEN=CHANGE_ME
|
||||
|
||||
DISCORDBOT_TOKEN=CHANGE_ME
|
||||
DISCORDBOT_LIVE_CHANNEL_ID=CHANGE_ME
|
||||
DISCORDBOT_LIVE_CHANNEL_UPDATE=1440
|
||||
|
||||
ICECAST_SOURCE_PASSWORD=CHANGE_ME
|
||||
ICECAST_ADMIN_PASSWORD=CHANGE_ME
|
||||
ICECAST_RELAY_PASSWORD=CHANGE_ME
|
||||
|
|
Loading…
Add table
Reference in a new issue