From 873292d60d4e8d513af4b75fc8c5a69e53138761 Mon Sep 17 00:00:00 2001 From: Aevann Date: Mon, 6 Mar 2023 21:32:08 +0200 Subject: [PATCH] make remove_media() to fix 500 error --- files/helpers/media.py | 32 +++++++++++++++++++++---------- files/routes/admin.py | 2 +- files/routes/asset_submissions.py | 12 ++++++------ files/routes/settings.py | 24 +++++++++++------------ files/routes/static.py | 2 +- files/routes/subs.py | 8 ++++---- 6 files changed, 46 insertions(+), 34 deletions(-) diff --git a/files/helpers/media.py b/files/helpers/media.py index 617961607..62061f545 100644 --- a/files/helpers/media.py +++ b/files/helpers/media.py @@ -20,6 +20,18 @@ from files.helpers.settings import get_setting from .config.const import * +def remove_media(path): + img_prefix = f'https://i.{SITE}' + if path.startswith(img_prefix): + path = path.split(img_prefix, 1)[1] + + video_prefix = f'https://videos.{SITE}' + if path.startswith(video_prefix): + path = path.split(video_prefix, 1)[1] + + os.remove(path) + + def media_ratelimit(v): t = time.time() - 86400 count = g.db.query(Media).filter(Media.user_id == v.id, Media.created_utc > t).count() @@ -63,7 +75,7 @@ def process_audio(file, v): size = os.stat(name).st_size if size > MAX_IMAGE_AUDIO_SIZE_MB_PATRON * 1024 * 1024 or not v.patron and size > MAX_IMAGE_AUDIO_SIZE_MB * 1024 * 1024: - os.remove(name) + remove_media(name) abort(413, f"Max image/audio size is {MAX_IMAGE_AUDIO_SIZE_MB} MB ({MAX_IMAGE_AUDIO_SIZE_MB_PATRON} MB for {patron.lower()}s)") media = g.db.query(Media).filter_by(filename=name, kind='audio').one_or_none() @@ -84,7 +96,7 @@ def webm_to_mp4(old, new, vid, db): tmp = new.replace('.mp4', '-t.mp4') subprocess.run(["ffmpeg", "-y", "-loglevel", "warning", "-nostats", "-threads:v", "1", "-i", old, "-map_metadata", "-1", tmp], check=True, stderr=subprocess.STDOUT) os.replace(tmp, new) - os.remove(old) + remove_media(old) media = db.query(Media).filter_by(filename=new, kind='video').one_or_none() if media: db.delete(media) @@ -111,7 +123,7 @@ def process_video(file, v): if (SITE_NAME != 'WPD' and (size > MAX_VIDEO_SIZE_MB_PATRON * 1024 * 1024 or not v.patron and size > MAX_VIDEO_SIZE_MB * 1024 * 1024)): - os.remove(old) + remove_media(old) abort(413, f"Max video size is {MAX_VIDEO_SIZE_MB} MB ({MAX_VIDEO_SIZE_MB_PATRON} MB for paypigs)") name_original = secure_filename(file.filename) @@ -125,7 +137,7 @@ def process_video(file, v): gevent.spawn(webm_to_mp4, old, new, v.id, db) else: subprocess.run(["ffmpeg", "-y", "-loglevel", "warning", "-nostats", "-i", old, "-map_metadata", "-1", "-c:v", "copy", "-c:a", "copy", new], check=True) - os.remove(old) + remove_media(old) media = g.db.query(Media).filter_by(filename=new, kind='video').one_or_none() if media: g.db.delete(media) @@ -150,7 +162,7 @@ def process_image(filename:str, v, resize=0, trim=False, uploader_id:Optional[in patron = bool(v.patron) if size > MAX_IMAGE_AUDIO_SIZE_MB_PATRON * 1024 * 1024 or not patron and size > MAX_IMAGE_AUDIO_SIZE_MB * 1024 * 1024: - os.remove(filename) + remove_media(filename) if has_request: abort(413, f"Max image/audio size is {MAX_IMAGE_AUDIO_SIZE_MB} MB ({MAX_IMAGE_AUDIO_SIZE_MB_PATRON} MB for paypigs)") return None @@ -168,7 +180,7 @@ def process_image(filename:str, v, resize=0, trim=False, uploader_id:Optional[in except UnidentifiedImageError as e: print(f"Couldn't identify an image for {filename}; deleting... (user {v.id if v else '-no user-'})") try: - os.remove(filename) + remove_media(filename) except: pass if has_request: abort(415) @@ -185,7 +197,7 @@ def process_image(filename:str, v, resize=0, trim=False, uploader_id:Optional[in if resize: if os.stat(filename).st_size > MAX_IMAGE_SIZE_BANNER_RESIZED_MB * 1024 * 1024: - os.remove(filename) + remove_media(filename) if has_request: abort(413, f"Max size for site assets is {MAX_IMAGE_SIZE_BANNER_RESIZED_MB} MB") return None @@ -216,7 +228,7 @@ def process_image(filename:str, v, resize=0, trim=False, uploader_id:Optional[in i_hash = str(imagehash.phash(i)) if i_hash in hashes.keys(): - os.remove(filename) + remove_media(filename) if has_request: abort(409, "Image already exists! " + hashes[i_hash].split('/')[-1]) return None @@ -257,11 +269,11 @@ def process_dm_images(v, user, body): patron = bool(v.patron) if size > MAX_IMAGE_AUDIO_SIZE_MB_PATRON * 1024 * 1024 or not patron and size > MAX_IMAGE_AUDIO_SIZE_MB * 1024 * 1024: - os.remove(filename) + remove_media(filename) abort(413, f"Max image/audio size is {MAX_IMAGE_AUDIO_SIZE_MB} MB ({MAX_IMAGE_AUDIO_SIZE_MB_PATRON} MB for paypigs)") with open(filename, 'rb') as f: - os.remove(filename) + remove_media(filename) try: req = requests.request( "POST", diff --git a/files/routes/admin.py b/files/routes/admin.py index e763580c7..b59fada52 100644 --- a/files/routes/admin.py +++ b/files/routes/admin.py @@ -1771,7 +1771,7 @@ def delete_media_post(v): if not os.path.isfile(path): return render_template("admin/delete_media.html", v=v, url=url, error="File not found on the server!") - os.remove(path) + remove_media(path) ma=ModAction( kind="delete_media", diff --git a/files/routes/asset_submissions.py b/files/routes/asset_submissions.py index 2341b1f0b..833f0edb6 100644 --- a/files/routes/asset_submissions.py +++ b/files/routes/asset_submissions.py @@ -205,8 +205,8 @@ def remove_asset(cls, type_name:str, v:User, name:str) -> dict[str, str]: g.db.add(ma) g.db.delete(asset) - os.remove(f"/asset_submissions/{type_name}s/{name}.webp") - os.remove(f"/asset_submissions/{type_name}s/{name}") + remove_media(f"/asset_submissions/{type_name}s/{name}.webp") + remove_media(f"/asset_submissions/{type_name}s/{name}") return {"message": f"'{name}' removed!"} @@ -271,7 +271,7 @@ def submit_hat(v:User): with Image.open(highquality) as i: if i.width > 100 or i.height > 130: - os.remove(highquality) + remove_media(highquality) return error("Images must be 100x130") if len(list(Iterator(i))) > 1: price = 1000 @@ -417,7 +417,7 @@ def update_marsey(v): for x in IMAGE_FORMATS: if path.isfile(f'/asset_submissions/marseys/original/{name}.{x}'): - os.remove(f'/asset_submissions/marseys/original/{name}.{x}') + remove_media(f'/asset_submissions/marseys/original/{name}.{x}') highquality = f"/asset_submissions/marseys/{name}" file.save(highquality) @@ -483,7 +483,7 @@ def update_hat(v): with Image.open(highquality) as i: if i.width > 100 or i.height > 130: - os.remove(highquality) + remove_media(highquality) return error("Images must be 100x130") format = i.format.lower() @@ -491,7 +491,7 @@ def update_hat(v): for x in IMAGE_FORMATS: if path.isfile(f'/asset_submissions/hats/original/{name}.{x}'): - os.remove(f'/asset_submissions/hats/original/{name}.{x}') + remove_media(f'/asset_submissions/hats/original/{name}.{x}') rename(highquality, new_path) diff --git a/files/routes/settings.py b/files/routes/settings.py index 39529a2ed..91ca75428 100644 --- a/files/routes/settings.py +++ b/files/routes/settings.py @@ -12,7 +12,7 @@ from files.helpers.alerts import * from files.helpers.config.const import * from files.helpers.get import * from files.helpers.mail import * -from files.helpers.media import process_files, process_image +from files.helpers.media import * from files.helpers.regex import * from files.helpers.sanitize import * from files.helpers.sanitize import filter_emojis_only @@ -45,7 +45,7 @@ def settings_personal(v:User): def remove_background(v): if v.background: if v.background.startswith('/images/'): - os.remove(v.background) + remove_media(v.background) v.background = None g.db.add(v) return {"message": "Background removed!"} @@ -69,7 +69,7 @@ def upload_custom_background(v): if background: if v.background and v.background.startswith('/images/'): - os.remove(v.background) + remove_media(v.background) v.background = background g.db.add(v) @@ -91,7 +91,7 @@ def upload_profile_background(v): if background: if v.profile_background and path.isfile(v.profile_background): - os.remove(v.profile_background) + remove_media(v.profile_background) v.profile_background = background g.db.add(v) badge_grant(badge_id=193, user=v) @@ -103,7 +103,7 @@ def upload_profile_background(v): @auth_required def delete_profile_background(v): if v.profile_background: - os.remove(v.profile_background) + remove_media(v.profile_background) v.profile_background = None return {"message": "Profile background removed!"} @@ -551,10 +551,10 @@ def settings_images_profile(v): if not imageurl: abort(400) if v.highres and '/images/' in v.highres and path.isfile(v.highres): - os.remove(v.highres) + remove_media(v.highres) if v.profileurl and '/images/' in v.profileurl and path.isfile(v.profileurl): - os.remove(v.profileurl) + remove_media(v.profileurl) v.highres = highres v.profileurl = imageurl @@ -584,7 +584,7 @@ def settings_images_banner(v): if bannerurl: if v.bannerurl and '/images/' in v.bannerurl and path.isfile(v.bannerurl): - os.remove(v.bannerurl) + remove_media(v.bannerurl) v.bannerurl = bannerurl g.db.add(v) @@ -751,11 +751,11 @@ def settings_song_change_mp3(v): size = os.stat(name).st_size if size > 8 * 1024 * 1024: - os.remove(name) + remove_media(name) return redirect("/settings/personal?error=MP3 file must be smaller than 8MB") if path.isfile(f"/songs/{v.song}.mp3") and g.db.query(User).filter_by(song=v.song).count() == 1: - os.remove(f"/songs/{v.song}.mp3") + remove_media(f"/songs/{v.song}.mp3") v.song = song g.db.add(v) @@ -768,7 +768,7 @@ def _change_song_youtube(vid, id): v = db.get(User, vid) if v.song and path.isfile(f"/songs/{v.song}.mp3") and db.query(User).filter_by(song=v.song).count() == 1: - os.remove(f"/songs/{v.song}.mp3") + remove_media(f"/songs/{v.song}.mp3") ydl_opts = { 'cookiefile': '/cookies', @@ -809,7 +809,7 @@ def settings_song_change(v): if song == "" and v.song: if path.isfile(f"/songs/{v.song}.mp3") and g.db.query(User).filter_by(song=v.song).count() == 1: - os.remove(f"/songs/{v.song}.mp3") + remove_media(f"/songs/{v.song}.mp3") v.song = None g.db.add(v) return redirect("/settings/personal?msg=Profile Anthem successfully removed!") diff --git a/files/routes/static.py b/files/routes/static.py index 221410270..2eeb2774d 100644 --- a/files/routes/static.py +++ b/files/routes/static.py @@ -2,7 +2,7 @@ import os from shutil import copyfile from sqlalchemy import func -from files.helpers.media import process_files +from files.helpers.media import * import files.helpers.stats as statshelper from files.classes.award import AWARDS diff --git a/files/routes/subs.py b/files/routes/subs.py index 46b3f0f00..4d740cc3e 100644 --- a/files/routes/subs.py +++ b/files/routes/subs.py @@ -541,7 +541,7 @@ def delete_sub_banner(v:User, sub:str, index:int): abort(404, f'Banner not found (banner index {index} is not between 0 and {len(sub.bannerurls)})') banner = sub.bannerurls[index] try: - os.remove(banner) + remove_media(banner) except FileNotFoundError: pass del sub.bannerurls[index] @@ -567,7 +567,7 @@ def delete_all_sub_banners(v:User, sub:str): if v.shadowbanned: return redirect(f'/h/{sub}/settings') for banner in sub.banner_urls: try: - os.remove(banner) + remove_media(banner) except FileNotFoundError: pass sub.bannerurls = [] @@ -602,7 +602,7 @@ def sub_sidebar(v:User, sub): if sidebarurl: if sub.sidebarurl: - os.remove(sub.sidebarurl) + remove_media(sub.sidebarurl) sub.sidebarurl = sidebarurl g.db.add(sub) @@ -634,7 +634,7 @@ def sub_marsey(v:User, sub): if marseyurl: if sub.marseyurl: - os.remove(sub.marseyurl) + remove_media(sub.marseyurl) sub.marseyurl = marseyurl g.db.add(sub)