dedup process_image code in comments.py

pull/225/head
Aevann 2024-02-21 23:09:23 +02:00
parent 89d11fdb2d
commit c539a8280e
2 changed files with 54 additions and 65 deletions

View File

@ -1,9 +1,10 @@
import os
import subprocess
import time
import requests
from shutil import copyfile
import json
import requests
import ffmpeg
import gevent
import imagehash
@ -14,10 +15,12 @@ from PIL import UnidentifiedImageError
from PIL.ImageSequence import Iterator
from files.classes.media import *
from files.classes.badges import BadgeDef
from files.helpers.cloudflare import purge_files_in_cloudflare_cache
from files.helpers.settings import get_setting
from .config.const import *
from .regex import badge_name_regex
if SITE == 'watchpeopledie.tv':
from rclone_python import rclone
@ -44,7 +47,7 @@ def media_ratelimit(v):
print(STARS, flush=True)
abort(500)
def process_files(files, v, body, is_dm=False, dm_user=None):
def process_files(files, v, body, is_dm=False, dm_user=None, admigger_thread=None, comment_body=None):
if g.is_tor or not files.get("file"): return body
files = files.getlist('file')[:20]
@ -60,6 +63,8 @@ def process_files(files, v, body, is_dm=False, dm_user=None):
name = f'/images/{time.time()}'.replace('.','') + '.webp'
file.save(name)
url = process_image(name, v)
if admigger_thread:
process_admigger_entry(name, v, admigger_thread, comment_body)
elif file.content_type.startswith('video/'):
url = process_video(file, v)
elif file.content_type.startswith('audio/'):
@ -299,3 +304,43 @@ def delete_file(filename, url):
def send_file(filename):
rclone.copy(filename, 'no:/videos', ignore_existing=True)
def process_sidebar_or_banner(oldname, v, type, resize):
li = sorted(os.listdir(f'files/assets/images/{SITE_NAME}/{type}'),
key=lambda e: int(e.split('.webp')[0]))[-1]
num = int(li.split('.webp')[0]) + 1
filename = f'files/assets/images/{SITE_NAME}/{type}/{num}.webp'
copyfile(oldname, filename)
process_image(filename, v, resize=resize)
def process_admigger_entry(oldname, v, admigger_thread, comment_body):
if admigger_thread == SIDEBAR_THREAD:
process_sidebar_or_banner(oldname, v, 'sidebar', 600)
elif admigger_thread == BANNER_THREAD:
banner_width = 1600
process_sidebar_or_banner(oldname, v, 'banners', banner_width)
elif admigger_thread == BADGE_THREAD:
try:
json_body = '{' + comment_body.split('{')[1].split('}')[0] + '}'
badge_def = json.loads(json_body)
name = badge_def["name"]
if len(name) > 50:
abort(400, "Badge name is too long (max 50 characters)")
if not badge_name_regex.fullmatch(name):
abort(400, "Invalid badge name!")
existing = g.db.query(BadgeDef).filter_by(name=name).one_or_none()
if existing: abort(409, "A badge with this name already exists!")
badge = BadgeDef(name=name, description=badge_def["description"])
g.db.add(badge)
g.db.flush()
filename = f'files/assets/images/{SITE_NAME}/badges/{badge.id}.webp'
copyfile(oldname, filename)
process_image(filename, v, resize=300, trim=True)
purge_files_in_cloudflare_cache(f"{SITE_FULL_IMAGES}/i/{SITE_NAME}/badges/{badge.id}.webp")
except Exception as e:
abort(400, str(e))

View File

@ -1,6 +1,5 @@
import os
from collections import Counter
from json import loads
from shutil import copyfile
import random
@ -182,69 +181,14 @@ def comment(v):
if parent_user.has_blocked(v) or parent_user.has_muted(v):
notify_op = False
if request.files.get("file") and not g.is_tor:
files = request.files.getlist('file')[:20]
if posting_to_post and v.admin_level >= PERMS['USE_ADMIGGER_THREADS'] and post_target.id in {SIDEBAR_THREAD, BANNER_THREAD, BADGE_THREAD}:
admigger_thread = post_target.id
comment_body = body
else:
admigger_thread = None
comment_body = None
if files:
media_ratelimit(v)
for file in files:
if f'[{file.filename}]' not in body:
continue
if file.content_type.startswith('image/'):
oldname = f'/images/{time.time()}'.replace('.','') + '.webp'
file.save(oldname)
image = process_image(oldname, v)
if image == "": abort(400, "Image upload failed")
if posting_to_post and v.admin_level >= PERMS['USE_ADMIGGER_THREADS']:
def process_sidebar_or_banner(type, resize=0):
li = sorted(os.listdir(f'files/assets/images/{SITE_NAME}/{type}'),
key=lambda e: int(e.split('.webp')[0]))[-1]
num = int(li.split('.webp')[0]) + 1
filename = f'files/assets/images/{SITE_NAME}/{type}/{num}.webp'
copyfile(oldname, filename)
process_image(filename, v, resize=resize)
if post_target.id == SIDEBAR_THREAD:
process_sidebar_or_banner('sidebar', 600)
elif post_target.id == BANNER_THREAD:
banner_width = 1600
process_sidebar_or_banner('banners', banner_width)
elif post_target.id == BADGE_THREAD:
try:
json_body = '{' + body.split('{')[1].split('}')[0] + '}'
badge_def = loads(json_body)
name = badge_def["name"]
if len(name) > 50:
abort(400, "Badge name is too long (max 50 characters)")
if not badge_name_regex.fullmatch(name):
abort(400, "Invalid badge name!")
existing = g.db.query(BadgeDef).filter_by(name=name).one_or_none()
if existing: abort(409, "A badge with this name already exists!")
badge = BadgeDef(name=name, description=badge_def["description"])
g.db.add(badge)
g.db.flush()
filename = f'files/assets/images/{SITE_NAME}/badges/{badge.id}.webp'
copyfile(oldname, filename)
process_image(filename, v, resize=300, trim=True)
purge_files_in_cloudflare_cache(f"{SITE_FULL_IMAGES}/i/{SITE_NAME}/badges/{badge.id}.webp")
cache.delete_memoized(badge_list)
except Exception as e:
abort(400, str(e))
body = body.replace(f'[{file.filename}]', f' {image} ', 1)
elif file.content_type.startswith('video/'):
body = body.replace(f'[{file.filename}]', f' {process_video(file, v)} ', 1)
elif file.content_type.startswith('audio/'):
body = body.replace(f'[{file.filename}]', f' {SITE_FULL}{process_audio(file, v)} ', 1)
else:
abort(415)
body = body.strip()
body = process_files(request.files, v, body, admigger_thread=admigger_thread, comment_body=comment_body)
if len(body) > COMMENT_BODY_LENGTH_LIMIT:
abort(400, f'Comment body is too long (max {COMMENT_BODY_LENGTH_LIMIT} characters)')