"""Website for uploading files and creating .HTMLs and thumbnails so we can embed files in Discord. """ import os import sys from datetime import datetime from pathlib import Path import ffmpeg from dotenv import load_dotenv from fastapi import FastAPI, File, UploadFile from fastapi.responses import HTMLResponse load_dotenv() app = FastAPI( title="discord-nice-embed", description=""" Discord will only create embeds for videos and images if they are smaller than 8mb. We can "abuse" this by using the "twitter:image" HTML meta tag. """, version="0.0.1", contact={ "name": "Joakim Hellsén", "url": "https://github.com/TheLovinator1", "email": "tlovinator@gmail.com", }, license_info={ "name": "GPL-3.0", "url": "https://www.gnu.org/licenses/gpl-3.0.txt", }, ) # Check if user has added a domain to the environment. try: domain = os.environ["DOMAIN"] except KeyError: sys.exit("discord-embed: Environment variable 'DOMAIN' is missing!") # Remove trailing slash from domain. if domain.endswith("/"): domain = domain[:-1] # Check if we have a folder for uploads. try: upload_folder = os.environ["UPLOAD_FOLDER"] except KeyError: sys.exit("discord-embed: Environment variable 'UPLOAD_FOLDER' is missing!") # Remove trailing slash from path. if upload_folder.endswith("/"): upload_folder = upload_folder[:-1] @app.post("/uploadfiles/") async def upload_file(file: UploadFile = File(...)): """Page for uploading files. Args: file (UploadFile): Our uploaded file. Defaults to File(...). Returns: HTMLResponse: Returns HTML for site. """ if file.content_type.startswith("video/"): file_type = "video" elif file.content_type.startswith("image/"): file_type = "image" elif file.content_type.startswith("text/"): file_type = "text" else: file_type = "files" output_folder = f"{upload_folder}/{file_type}" # Create folder if it doesn't exist. Path(output_folder).mkdir(parents=True, exist_ok=True) file_url = f"{domain}/{file_type}/{file.filename}" file_location = f"{output_folder}/{file.filename}" with open(file_location, "wb+") as file_object: file_object.write(file.file.read()) height, width = find_video_resolution(file_location) # Only create thumbnail if file is a video. if file_type == "video": screenshot_url = make_thumbnail_from_video(file_location, file.filename) else: return file_url html_url = generate_html(file_url, width, height, screenshot_url, file.filename) json_output = { "html_url": f"{html_url}", "video_url": f"{file_url}", "width": f"{width}", "height": f"{height}", "filename": f"{file.filename}", "content_type": f"{file.content_type}", "file_type": f"{file_type}", "current_time": f"{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}", } # Only add screenshot_url if it exists. if screenshot_url: json_output.update({"screenshot_url": f"{screenshot_url}"}) return json_output @app.get("/", response_class=HTMLResponse) async def main(): """Our index view. You can upload files here. Returns: HTMLResponse: Returns HTML for site. """ return """