forked from rDrama/rDrama
1
0
Fork 0

dedup process_image code in comments.py

master
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 os
import subprocess import subprocess
import time import time
import requests
from shutil import copyfile from shutil import copyfile
import json
import requests
import ffmpeg import ffmpeg
import gevent import gevent
import imagehash import imagehash
@ -14,10 +15,12 @@ from PIL import UnidentifiedImageError
from PIL.ImageSequence import Iterator from PIL.ImageSequence import Iterator
from files.classes.media import * from files.classes.media import *
from files.classes.badges import BadgeDef
from files.helpers.cloudflare import purge_files_in_cloudflare_cache from files.helpers.cloudflare import purge_files_in_cloudflare_cache
from files.helpers.settings import get_setting from files.helpers.settings import get_setting
from .config.const import * from .config.const import *
from .regex import badge_name_regex
if SITE == 'watchpeopledie.tv': if SITE == 'watchpeopledie.tv':
from rclone_python import rclone from rclone_python import rclone
@ -44,7 +47,7 @@ def media_ratelimit(v):
print(STARS, flush=True) print(STARS, flush=True)
abort(500) 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 if g.is_tor or not files.get("file"): return body
files = files.getlist('file')[:20] 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' name = f'/images/{time.time()}'.replace('.','') + '.webp'
file.save(name) file.save(name)
url = process_image(name, v) url = process_image(name, v)
if admigger_thread:
process_admigger_entry(name, v, admigger_thread, comment_body)
elif file.content_type.startswith('video/'): elif file.content_type.startswith('video/'):
url = process_video(file, v) url = process_video(file, v)
elif file.content_type.startswith('audio/'): elif file.content_type.startswith('audio/'):
@ -299,3 +304,43 @@ def delete_file(filename, url):
def send_file(filename): def send_file(filename):
rclone.copy(filename, 'no:/videos', ignore_existing=True) 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 import os
from collections import Counter from collections import Counter
from json import loads
from shutil import copyfile from shutil import copyfile
import random import random
@ -182,69 +181,14 @@ def comment(v):
if parent_user.has_blocked(v) or parent_user.has_muted(v): if parent_user.has_blocked(v) or parent_user.has_muted(v):
notify_op = False notify_op = False
if request.files.get("file") and not g.is_tor: if posting_to_post and v.admin_level >= PERMS['USE_ADMIGGER_THREADS'] and post_target.id in {SIDEBAR_THREAD, BANNER_THREAD, BADGE_THREAD}:
files = request.files.getlist('file')[:20] admigger_thread = post_target.id
comment_body = body
else:
admigger_thread = None
comment_body = None
if files: body = process_files(request.files, v, body, admigger_thread=admigger_thread, comment_body=comment_body)
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()
if len(body) > COMMENT_BODY_LENGTH_LIMIT: if len(body) > COMMENT_BODY_LENGTH_LIMIT:
abort(400, f'Comment body is too long (max {COMMENT_BODY_LENGTH_LIMIT} characters)') abort(400, f'Comment body is too long (max {COMMENT_BODY_LENGTH_LIMIT} characters)')