"""Website for uploading files, creating .HTMLs, and thumbnails. This was created for Discord. You can use this to embed videos in Discord. """ import sys from datetime import datetime from pathlib import Path from typing import Dict import ffmpeg from dhooks import Webhook from fastapi import FastAPI, File, UploadFile from fastapi.responses import HTMLResponse from settings import Settings hook = Webhook(Settings.webhook_url) app = FastAPI( title="discord-nice-embed", description=Settings.description, 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", }, ) def normal_file_uploaded(file: UploadFile) -> Dict[str, str]: """Save file to disk and return URL. Args: file (UploadFile): Our file object. Returns: Dict[str, str]: Returns URL for file. """ # Save file to disk. with open(f"{Settings.upload_folder}/{file.filename}", "wb+") as file_object: file_object.write(file.file.read()) hook.send(f"{Settings.domain}/{file.filename} was uploaded.") return {"html_url": f"{Settings.domain}/{file.filename}"} def video_file_uploaded(file: UploadFile) -> Dict[str, str]: """Save video to disk, generate HTML, thumbnail, and return the .HTML file instead of the file. Args: file (UploadFile): Our file object. Returns: Dict[str, str]: Returns URL for video. """ # Make custom html for video files. # Create folder if it doesn't exist. Path(f"{Settings.upload_folder}/video").mkdir(parents=True, exist_ok=True) # Save file to disk. with open(f"{Settings.upload_folder}/video/{file.filename}", "wb+") as file_object: file_object.write(file.file.read()) file_url = f"{Settings.domain}/video/{file.filename}" file_location = f"{Settings.upload_folder}/video/{file.filename}" height, width = find_video_resolution(file_location) screenshot_url = make_thumbnail_from_video(file_location, file.filename) html_url = generate_html( filename=file.filename, url=file_url, width=width, height=height, screenshot=screenshot_url ) hook.send(f"{Settings.domain}/{file.filename} was uploaded.") return {"html_url": f"{html_url}"} @app.post("/uploadfiles/") async def upload_file(file: UploadFile = File(...)) -> Dict[str, str]: """Page for uploading files. If it is a video, we need to make a HTML file, and a thumbnail otherwise we can just save the file and return the URL for it. If something goes wrong, we will send a message to Discord. Args: file (UploadFile): Our uploaded file. Returns: Dict[str, str]: Returns a dict with the filename or a link to the .html if it was a video. """ # TODO: Add syntax highlighting for text. try: if file.content_type.startswith("video/"): return video_file_uploaded(file) return normal_file_uploaded(file) except Exception as e: # TODO: Change response code to 400. hook.send(f"Something went wrong for {Settings.domain}/{file.filename}:\n{e}") return {"error": f"Something went wrong: {e}"} @app.get("/", response_class=HTMLResponse) async def main(): """Our index view. You can upload files here. Returns: HTMLResponse: Returns HTML for site. """ return """