diff --git a/files/helpers/images.py b/files/helpers/images.py index 93f1e7c61..c4a5ef79d 100644 --- a/files/helpers/images.py +++ b/files/helpers/images.py @@ -1,18 +1,10 @@ -from PIL import Image as IImage, ImageSequence, ImageOps +from PIL import Image, ImageOps from webptools import gifwebp -import time +import subprocess - -def process_image(file=None, filename=None, resize=0): +def process_image(filename=None, resize=0): - if not filename: filename = f'/images/{time.time()}'.replace('.','')[:-5] + '.webp' - - try: - if file: - file.save(filename) - i = IImage.open(file) - else: i = IImage.open(filename) - except: return "" + i = Image.open(filename) exif = i.getexif() for k in exif.keys(): @@ -22,21 +14,7 @@ def process_image(file=None, filename=None, resize=0): i.info["exif"] = exif.tobytes() if resize: - size = resize, resize - frames = ImageSequence.Iterator(i) - - def thumbnails(frames): - for frame in frames: - thumbnail = frame.copy() - thumbnail.thumbnail(size) - yield thumbnail - - frames = thumbnails(frames) - - om = next(frames) - om.info = i.info - om = ImageOps.exif_transpose(om) - om.save(filename, format="WEBP", save_all=True, append_images=list(frames), loop=0, method=6, allow_mixed=True) + subprocess.call(['convert',filename,'-coalesce','-layers', 'TrimBounds','-resize', f'{resize}x>',filename]) elif i.format.lower() != "webp": if i.format.lower() == "gif": gifwebp(input_image=filename, output_image=filename, option="-mixed -metadata none -f 100 -mt -m 6") diff --git a/files/routes/comments.py b/files/routes/comments.py index fe54fefef..185f9b11f 100644 --- a/files/routes/comments.py +++ b/files/routes/comments.py @@ -10,6 +10,7 @@ from flask import * from files.__main__ import app, limiter from files.helpers.sanitize import filter_emojis_only import requests +from shutil import copyfile from json import loads IMGUR_KEY = environ.get("IMGUR_KEY").strip() @@ -182,36 +183,49 @@ def api_comment(v): if request.files.get("file") and request.headers.get("cf-ipcountry") != "T1": file=request.files["file"] if file.content_type.startswith('image/'): - image = process_image(file) + oldname = f'/images/{time.time()}'.replace('.','')[:-5] + '.webp' + file.save(oldname) + image = process_image(oldname) if image == "": return {"error":"Image upload failed"} if v.admin_level == 3: if parent_post.id == 37696: filename = 'files/assets/images/Drama/sidebar/' + str(len(listdir('files/assets/images/Drama/sidebar'))+1) + '.webp' - text = process_image(file, filename, 400) + copyfile(oldname, filename) + process_image(filename, 400) elif parent_post.id == 37697: filename = 'files/assets/images/Drama/banners/' + str(len(listdir('files/assets/images/Drama/banners'))+1) + '.webp' - process_image(file, filename) + copyfile(oldname, filename) + process_image(filename) elif parent_post.id == 37833: - try: badge_def = loads(body.lower()) - except: return {"error": "You didn't follow the format retard"}, 500 - name = badge_def["name"] - badge = g.db.query(BadgeDef).filter_by(name=name).first() - if not badge: - badge = BadgeDef(name=name, description=badge_def["description"]) - g.db.add(badge) - g.db.flush() - filename = f'files/assets/images/badges/{badge.id}.webp' - process_image(file, filename, 200) - requests.post(f'https://api.cloudflare.com/client/v4/zones/{CF_ZONE}/purge_cache', headers=CF_HEADERS, data={'files': [f"https://{request.host}/static/assets/images/badges/{badge.id}.webp"]}) + try: + badge_def = loads(body.lower()) + name = badge_def["name"] + badge = g.db.query(BadgeDef).filter_by(name=name).first() + if not badge: + badge = BadgeDef(name=name, description=badge_def["description"]) + g.db.add(badge) + g.db.flush() + filename = f'files/assets/images/badges/{badge.id}.webp' + copyfile(oldname, filename) + process_image(filename, 200) + requests.post(f'https://api.cloudflare.com/client/v4/zones/{CF_ZONE}/purge_cache', headers=CF_HEADERS, data={'files': [f"https://{request.host}/static/assets/images/badges/{badge.id}.webp"]}) + except Exception as e: + print(e) + return {"error": "You didn't follow the format retard"}, 400 elif v.id in (CARP_ID,AEVANN_ID) and parent_post.id == 37838: - marsey = loads(body.lower()) - name = marsey["name"] - if not g.db.query(Marsey.name).filter_by(name=name).first(): - marsey = Marsey(name=marsey["name"], author_id=marsey["author_id"], tags=marsey["tags"], count=0) - g.db.add(marsey) - filename = f'files/assets/images/emojis/{name}.webp' - process_image(file, filename, 200) - requests.post(f'https://api.cloudflare.com/client/v4/zones/{CF_ZONE}/purge_cache', headers=CF_HEADERS, data={'files': [f"https://{request.host}/static/assets/images/emojis/{name}.webp"]}) + try: + marsey = loads(body.lower()) + name = marsey["name"] + if not g.db.query(Marsey.name).filter_by(name=name).first(): + marsey = Marsey(name=marsey["name"], author_id=marsey["author_id"], tags=marsey["tags"], count=0) + g.db.add(marsey) + filename = f'files/assets/images/emojis/{name}.webp' + copyfile(oldname, filename) + process_image(filename, 200) + requests.post(f'https://api.cloudflare.com/client/v4/zones/{CF_ZONE}/purge_cache', headers=CF_HEADERS, data={'files': [f"https://{request.host}/static/assets/images/emojis/{name}.webp"]}) + except Exception as e: + print(e) + return {"error": "You didn't follow the format retard"}, 400 body += f"\n\n![]({image})" elif file.content_type.startswith('video/'): file.save("video.mp4") @@ -676,7 +690,10 @@ def edit_comment(cid, v): if request.files.get("file") and request.headers.get("cf-ipcountry") != "T1": file=request.files["file"] if file.content_type.startswith('image/'): - body += f"\n\n![]({process_image(file)})" + name = f'/images/{time.time()}'.replace('.','')[:-5] + '.webp' + file.save(name) + url = process_image(name) + body += f"\n\n![]({url})" elif file.content_type.startswith('video/'): file.save("video.mp4") with open("video.mp4", 'rb') as f: diff --git a/files/routes/posts.py b/files/routes/posts.py index 8efb50155..82f714e6a 100644 --- a/files/routes/posts.py +++ b/files/routes/posts.py @@ -16,6 +16,7 @@ from .front import frontlist, changeloglist from urllib.parse import ParseResult, urlunparse, urlparse, quote, unquote from os import path import requests +from shutil import copyfile db = db_session() marseys = tuple(f':#{x[0]}:' for x in db.query(Marsey.name).all()) @@ -426,7 +427,10 @@ def edit_post(pid, v): if request.files.get("file") and request.headers.get("cf-ipcountry") != "T1": file=request.files["file"] if file.content_type.startswith('image/'): - body += f"\n\n![]({process_image(file)})" + name = f'/images/{time.time()}'.replace('.','')[:-5] + '.webp' + file.save(name) + url = process_image(name) + body += f"\n\n![]({url})" elif file.content_type.startswith('video/'): file.save("video.mp4") with open("video.mp4", 'rb') as f: @@ -652,7 +656,7 @@ def thumbnail_thread(pid): for chunk in image_req.iter_content(1024): file.write(chunk) - post.thumburl = process_image(filename=name, resize=100) + post.thumburl = process_image(name, resize=100) db.add(post) db.commit() db.close() @@ -858,7 +862,9 @@ def submit_post(v): if request.files.get("file2") and request.headers.get("cf-ipcountry") != "T1": file=request.files["file2"] if file.content_type.startswith('image/'): - body += f"\n\n![]({process_image(file)})" + name = f'/images/{time.time()}'.replace('.','')[:-5] + '.webp' + file.save(name) + body += f"\n\n![]({process_image(name)})" elif file.content_type.startswith('video/'): file.save("video.mp4") with open("video.mp4", 'rb') as f: @@ -947,8 +953,13 @@ def submit_post(v): file = request.files['file'] if file.content_type.startswith('image/'): - new_post.url = process_image(file) - new_post.thumburl = process_image(file, resize=100) + name = f'/images/{time.time()}'.replace('.','')[:-5] + '.webp' + file.save(name) + new_post.url = process_image(name) + + name2 = name.replace('.webp', 'r.webp') + copyfile(name, name2) + new_post.thumburl = process_image(name2, resize=100) elif file.content_type.startswith('video/'): file.save("video.mp4") with open("video.mp4", 'rb') as f: diff --git a/files/routes/settings.py b/files/routes/settings.py index 59047b077..2de221d42 100644 --- a/files/routes/settings.py +++ b/files/routes/settings.py @@ -11,6 +11,7 @@ from .front import frontlist import os from files.helpers.sanitize import filter_emojis_only from files.helpers.discord import add_role +from shutil import copyfile import requests valid_username_regex = re.compile("^[a-zA-Z0-9_\-]{3,25}$") @@ -255,7 +256,10 @@ def settings_profile_post(v): if request.files.get('file'): file = request.files['file'] if file.content_type.startswith('image/'): - bio += f"\n\n![]({process_image(file)})" + name = f'/images/{time.time()}'.replace('.','')[:-5] + '.webp' + file.save(name) + url = process_image(name) + bio += f"\n\n![]({url})" elif file.content_type.startswith('video/'): file.save("video.mp4") with open("video.mp4", 'rb') as f: @@ -621,11 +625,15 @@ def settings_images_profile(v): file = request.files["profile"] - highres = process_image(file) + name = f'/images/{time.time()}'.replace('.','')[:-5] + '.webp' + file.save(name) + highres = process_image(name) if not highres: abort(400) - imageurl = process_image(file, resize=100) + name2 = name.replace('.webp', 'r.webp') + copyfile(name, name2) + imageurl = process_image(name2, resize=100) if not imageurl: abort(400) @@ -652,7 +660,9 @@ def settings_images_banner(v): file = request.files["banner"] - bannerurl = process_image(file) + name = f'/images/{time.time()}'.replace('.','')[:-5] + '.webp' + file.save(name) + bannerurl = process_image(name) if bannerurl: if v.bannerurl and '/images/' in v.bannerurl : os.remove('/images/' + v.bannerurl.split('/images/')[1]) diff --git a/files/routes/static.py b/files/routes/static.py index 772533aed..72eb3ace5 100644 --- a/files/routes/static.py +++ b/files/routes/static.py @@ -275,7 +275,10 @@ def submit_contact(v): if request.files.get("file") and request.headers.get("cf-ipcountry") != "T1": file=request.files["file"] if file.content_type.startswith('image/'): - body_html += f'' + name = f'/images/{time.time()}'.replace('.','')[:-5] + '.webp' + file.save(name) + url = process_image(name) + body_html += f'' elif file.content_type.startswith('video/'): file.save("video.mp4") with open("video.mp4", 'rb') as f: