diff --git a/Dockerfile b/Dockerfile index a6e59a7a7..e3ccdc7be 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,7 +10,7 @@ COPY requirements.txt /etc/requirements.txt RUN pip3 install -r /etc/requirements.txt -RUN mkdir /images && mkdir /songs +RUN mkdir /images && mkdir /songs && mkdir /videos EXPOSE 80/tcp diff --git a/files/classes/user.py b/files/classes/user.py index 0f0680416..d16081be7 100644 --- a/files/classes/user.py +++ b/files/classes/user.py @@ -2,7 +2,7 @@ from sqlalchemy.orm import deferred, aliased from secrets import token_hex import pyotp from files.helpers.discord import remove_user -from files.helpers.images import * +from files.helpers.media import * from files.helpers.const import * from .alts import Alt from .saves import * diff --git a/files/helpers/images.py b/files/helpers/media.py similarity index 56% rename from files/helpers/images.py rename to files/helpers/media.py index cda0292c6..b42f294ec 100644 --- a/files/helpers/images.py +++ b/files/helpers/media.py @@ -4,6 +4,27 @@ from webptools import gifwebp import subprocess import os from flask import abort +import requests +import time +from .const import * + +def process_video(file): + name = f'/videos/{time.time()}'.replace('.','') + file.save(name) + os.system(f'ffmpeg -y -loglevel warning -i {name} -map_metadata -1 {name}.mp4') + os.remove(name) + + size = os.stat(f'{name}.mp4').st_size + + with open(f"{name}.mp4", 'rb') as f: + try: req = requests.request("POST", "https://pomf2.lain.la/upload.php", files={'files[]': f}, timeout=20).json() + except requests.Timeout: return {"error": "Video upload timed out, please try again!"} + try: url = req['files'][0]['url'] + except: return {"error": req['description']} + return url + + if SITE_NAME != 'rDrama' or size > 8 * 1024 * 1024: os.remove(f"{name}.mp4") + def process_image(patron, filename=None, resize=0): size = os.stat(filename).st_size diff --git a/files/routes/admin.py b/files/routes/admin.py index 01e086918..c25e936c5 100644 --- a/files/routes/admin.py +++ b/files/routes/admin.py @@ -8,7 +8,7 @@ from files.helpers.alerts import * from files.helpers.sanitize import * from files.helpers.security import * from files.helpers.get import * -from files.helpers.images import * +from files.helpers.media import * from files.helpers.const import * from files.classes import * from flask import * diff --git a/files/routes/chat.py b/files/routes/chat.py index 7b6bc9eb6..1075d60cc 100644 --- a/files/routes/chat.py +++ b/files/routes/chat.py @@ -27,7 +27,6 @@ def chat( v): @app.get('/chat.js') -@limiter.exempt def chatjs(): resp = make_response(send_from_directory('assets', 'js/chat.js')) return resp diff --git a/files/routes/comments.py b/files/routes/comments.py index 773320da9..fafea902b 100644 --- a/files/routes/comments.py +++ b/files/routes/comments.py @@ -1,6 +1,6 @@ from files.helpers.wrappers import * from files.helpers.alerts import * -from files.helpers.images import * +from files.helpers.media import * from files.helpers.const import * from files.helpers.slots import * from files.helpers.blackjack import * @@ -307,17 +307,9 @@ def api_comment(v): return {"error": str(e)}, 400 body += f"\n\n![]({image})" elif file.content_type.startswith('video/'): - if file.content_type == 'video/webm': - file.save("video.mp4") - else: - file.save("unsanitized.mp4") - os.system(f'ffmpeg -y -loglevel warning -i unsanitized.mp4 -map_metadata -1 -c:v copy -c:a copy video.mp4') - with open("video.mp4", 'rb') as f: - try: req = requests.request("POST", "https://pomf2.lain.la/upload.php", files={'files[]': f}, timeout=5).json() - except requests.Timeout: return {"error": "Video upload timed out, please try again!"} - try: url = req['files'][0]['url'] - except: return {"error": req['description']}, 400 - body += f"\n\n{url}" + value = process_video(file) + if type(value) is str: body += f"\n\n{value}" + else: return value else: return {"error": "Image/Video files only"}, 400 body = body.strip() @@ -773,17 +765,9 @@ def edit_comment(cid, v): url = process_image(v.patron, name) body += f"\n\n![]({url})" elif file.content_type.startswith('video/'): - if file.content_type == 'video/webm': - file.save("video.mp4") - else: - file.save("unsanitized.mp4") - os.system(f'ffmpeg -y -loglevel warning -i unsanitized.mp4 -map_metadata -1 -c:v copy -c:a copy video.mp4') - with open("video.mp4", 'rb') as f: - try: req = requests.request("POST", "https://pomf2.lain.la/upload.php", files={'files[]': f}, timeout=5).json() - except requests.Timeout: return {"error": "Video upload timed out, please try again!"} - try: url = req['files'][0]['url'] - except: return {"error": req['description']}, 400 - body += f"\n\n{url}" + value = process_video(file) + if type(value) is str: body += f"\n\n{value}" + else: return value else: return {"error": "Image/Video files only"}, 400 body = body.strip() diff --git a/files/routes/posts.py b/files/routes/posts.py index be7b5b082..6bdf05246 100644 --- a/files/routes/posts.py +++ b/files/routes/posts.py @@ -464,17 +464,9 @@ def edit_post(pid, v): url = process_image(v.patron, name) body += f"\n\n![]({url})" elif file.content_type.startswith('video/'): - if file.content_type == 'video/webm': - file.save("video.mp4") - else: - file.save("unsanitized.mp4") - os.system(f'ffmpeg -y -loglevel warning -i unsanitized.mp4 -map_metadata -1 -c:v copy -c:a copy video.mp4') - with open("video.mp4", 'rb') as f: - try: req = requests.request("POST", "https://pomf2.lain.la/upload.php", files={'files[]': f}, timeout=5).json() - except requests.Timeout: return {"error": "Video upload timed out, please try again!"} - try: url = req['files'][0]['url'] - except: return {"error": req['description']}, 400 - body += f"\n\n{url}" + value = process_video(file) + if type(value) is str: body += f"\n\n{value}" + else: return value else: return {"error": "Image/Video files only"}, 400 body = body.strip() @@ -1083,17 +1075,9 @@ def submit_post(v, sub=None): file.save(name) body += f"\n\n![]({process_image(v.patron, name)})" elif file.content_type.startswith('video/'): - if file.content_type == 'video/webm': - file.save("video.mp4") - else: - file.save("unsanitized.mp4") - os.system(f'ffmpeg -y -loglevel warning -i unsanitized.mp4 -map_metadata -1 -c:v copy -c:a copy video.mp4') - with open("video.mp4", 'rb') as f: - try: req = requests.request("POST", "https://pomf2.lain.la/upload.php", files={'files[]': f}, timeout=5).json() - except requests.Timeout: return {"error": "Video upload timed out, please try again!"} - try: url = req['files'][0]['url'] - except: return {"error": req['description']}, 400 - body += f"\n\n{url}" + value = process_video(file) + if type(value) is str: body += f"\n\n{value}" + else: return error(value['error']) else: return error("Image/Video files only.") @@ -1194,17 +1178,9 @@ def submit_post(v, sub=None): copyfile(name, name2) post.thumburl = process_image(v.patron, name2, resize=100) elif file.content_type.startswith('video/'): - if file.content_type == 'video/webm': - file.save("video.mp4") - else: - file.save("unsanitized.mp4") - os.system(f'ffmpeg -y -loglevel warning -i unsanitized.mp4 -map_metadata -1 -c:v copy -c:a copy video.mp4') - with open("video.mp4", 'rb') as f: - try: req = requests.request("POST", "https://pomf2.lain.la/upload.php", files={'files[]': f}, timeout=5).json() - except requests.Timeout: return {"error": "Video upload timed out, please try again!"} - try: url = req['files'][0]['url'] - except: return {"error": req['description']}, 400 - post.url = url + value = process_video(file) + if type(value) is str: post.url = value + else: return error(value['error']) else: return error("Image/Video files only.") diff --git a/files/routes/settings.py b/files/routes/settings.py index 04534cae8..ec5100934 100644 --- a/files/routes/settings.py +++ b/files/routes/settings.py @@ -217,17 +217,9 @@ def settings_profile_post(v): url = process_image(v.patron, name) bio += f"\n\n![]({url})" elif file.content_type.startswith('video/'): - if file.content_type == 'video/webm': - file.save("video.mp4") - else: - file.save("unsanitized.mp4") - os.system(f'ffmpeg -y -loglevel warning -i unsanitized.mp4 -map_metadata -1 -c:v copy -c:a copy video.mp4') - with open("video.mp4", 'rb') as f: - try: req = requests.request("POST", "https://pomf2.lain.la/upload.php", files={'files[]': f}, timeout=5).json() - except requests.Timeout: return {"error": "Video upload timed out, please try again!"} - try: url = req['files'][0]['url'] - except: return {"error": req['description']}, 400 - bio += f"\n\n{url}" + value = process_video(file) + if type(value) is str: bio += f"\n\n{value}" + else: return value else: if request.headers.get("Authorization") or request.headers.get("xhr"): return {"error": "Image/Video files only"}, 400 return render_template("settings_profile.html", v=v, error="Image/Video files only."), 400 diff --git a/files/routes/static.py b/files/routes/static.py index 4f522d6ad..5a3963672 100644 --- a/files/routes/static.py +++ b/files/routes/static.py @@ -373,9 +373,9 @@ def log_item(id, v): @app.get("/api") -@auth_required -def api(v): - return render_template("api.html", v=v) +@limiter.limit("1/day") +def api(): + return render_template("api.html") @app.get("/contact") @app.get("/press") @@ -404,17 +404,9 @@ def submit_contact(v): url = process_image(v.patron, name) body_html += f'' elif file.content_type.startswith('video/'): - if file.content_type == 'video/webm': - file.save("video.mp4") - else: - file.save("unsanitized.mp4") - os.system(f'ffmpeg -y -loglevel warning -i unsanitized.mp4 -map_metadata -1 -c:v copy -c:a copy video.mp4') - with open("video.mp4", 'rb') as f: - try: req = requests.request("POST", "https://pomf2.lain.la/upload.php", files={'files[]': f}, timeout=5).json() - except requests.Timeout: return {"error": "Video upload timed out, please try again!"} - try: url = req['files'][0]['url'] - except: return {"error": req['description']}, 400 - body_html += f"

{url}

" + value = process_video(file) + if type(value) is str: body_html += f"

{value}

" + else: return value else: return {"error": "Image/Video files only"}, 400 @@ -449,7 +441,6 @@ def archives(path): return resp @app.get('/e/') -@limiter.exempt def emoji(emoji): if not emoji.endswith('.webp'): abort(404) resp = make_response(send_from_directory('assets/images/emojis', emoji)) @@ -461,7 +452,6 @@ def emoji(emoji): @app.get('/assets/') @app.get('/static/assets/') -@limiter.exempt def static_service(path): resp = make_response(send_from_directory('assets', path)) if request.path.endswith('.webp') or request.path.endswith('.gif') or request.path.endswith('.ttf') or request.path.endswith('.woff2'): @@ -477,14 +467,21 @@ def static_service(path): @app.get('/images/') @app.get('/hostedimages/') @app.get("/static/images/") -@limiter.exempt def images(path): resp = make_response(send_from_directory('/images', path.replace('.WEBP','.webp'))) resp.headers.remove("Cache-Control") resp.headers.add("Cache-Control", "public, max-age=3153600") - if request.path.endswith('.webp'): - resp.headers.remove("Content-Type") - resp.headers.add("Content-Type", "image/webp") + resp.headers.remove("Content-Type") + resp.headers.add("Content-Type" ,"image/webp") + return resp + +@app.get('/videos/') +def videos(path): + resp = make_response(send_from_directory('/videos', path.replace('.MP4','.mp4'))) + resp.headers.remove("Cache-Control") + resp.headers.add("Cache-Control", "public, max-age=3153600") + resp.headers.remove("Content-Type") + resp.headers.add("Content-Type", "video/mp4") return resp @app.get("/robots.txt") diff --git a/files/routes/users.py b/files/routes/users.py index aa64d4647..69a214ef9 100644 --- a/files/routes/users.py +++ b/files/routes/users.py @@ -701,17 +701,9 @@ def messagereply(v): url = process_image(v.patron, name) body_html += f'' elif file.content_type.startswith('video/'): - if file.content_type == 'video/webm': - file.save("video.mp4") - else: - file.save("unsanitized.mp4") - os.system(f'ffmpeg -y -loglevel warning -i unsanitized.mp4 -map_metadata -1 -c:v copy -c:a copy video.mp4') - with open("video.mp4", 'rb') as f: - try: req = requests.request("POST", "https://pomf2.lain.la/upload.php", files={'files[]': f}, timeout=5).json() - except requests.exceptions.ConnectionError: return {"error": "Video upload timed out, please try again!"} - try: url = req['files'][0]['url'] - except: return {"error": req['description']}, 400 - body_html += f"

{url}

" + value = process_video(file) + if type(value) is str: body_html += f"

{value}

" + else: return value else: return {"error": "Image/Video files only"}, 400 @@ -1149,7 +1141,6 @@ def remove_follow(username, v): @app.get("/logged_out/pp/") @app.get("/logged_out/uid//pic") @app.get("/logged_out/uid//pic/profile") -@limiter.exempt @auth_desired def user_profile_uid(v, id): if not v and not request.path.startswith('/logged_out'): return redirect(f"/logged_out{request.full_path}") @@ -1164,7 +1155,6 @@ def user_profile_uid(v, id): return redirect(x.profile_url) @app.get("/@/pic") -@limiter.exempt @auth_required def user_profile_name(v, username): x = get_user(username) diff --git a/ubuntu_setup b/ubuntu_setup index 85a152abd..03ccc7717 100644 --- a/ubuntu_setup +++ b/ubuntu_setup @@ -11,6 +11,7 @@ service postgresql restart pip3 install -r requirements.txt mkdir /songs mkdir /images +mkdir /videos snap install opera-proxy ufw allow ssh ufw allow from 173.245.48.0/20