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: