From 0b387cc7926fd36db9a40ed6f2de3a53e92f21f0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Joakim=20Hells=C3=A9n?= <tlovinator@gmail.com>
Date: Tue, 7 Dec 2021 20:02:21 +0100
Subject: [PATCH] Respond with error code

---
 main.py     | 57 ++++++++++++++++++++++++++++++-----------------------
 settings.py |  4 ++--
 2 files changed, 34 insertions(+), 27 deletions(-)

diff --git a/main.py b/main.py
index 10864d3..3d7218b 100644
--- a/main.py
+++ b/main.py
@@ -1,9 +1,12 @@
-"""Website for uploading files and creating .HTMLs and thumbnails so we can embed files in Discord.
+"""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 fastapi import FastAPI, File, UploadFile
@@ -28,40 +31,44 @@ app = FastAPI(
 
 
 @app.post("/uploadfiles/")
-async def upload_file(file: UploadFile = File(...)):
+async def upload_file(file: UploadFile = File(...)) -> Dict[str, str]:
     """Page for uploading files.
 
     Args:
         file (UploadFile): Our uploaded file. Defaults to File(...).
 
     Returns:
-        HTMLResponse: Returns HTML for site.
+        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:
+        # Make custom html for video files.
+        if file.content_type.startswith("video/"):
+            # Create folder if it doesn't exist.
+            Path(f"{Settings.upload_folder}/video").mkdir(parents=True, exist_ok=True)
 
-    # Make custom html for video files.
-    if file.content_type.startswith("video/"):
-        # 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
+            )
+            return {"html_url": f"{html_url}"}
 
         # Save file to disk.
-        with open(f"{Settings.upload_folder}/video/{file.filename}", "wb+") as file_object:
+        with open(f"{Settings.upload_folder}/{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
-        )
-        return {"html_url": f"{html_url}"}
-
-    # Save file to disk.
-    with open(f"{Settings.upload_folder}/{file.filename}", "wb+") as file_object:
-        file_object.write(file.file.read())
-
-    return {"html_url": f"{Settings.domain}/{file.filename}"}
+        return {"html_url": f"{Settings.domain}/{file.filename}"}
+    except Exception as e:
+        # TODO: Change response code to 400.
+        print(e)
+        return {"error": f"Something went wrong: {e}"}
 
 
 @app.get("/", response_class=HTMLResponse)
@@ -104,9 +111,9 @@ def generate_html(url: str, width: int, height: int, screenshot: str, filename:
 
 
     Args:
-        url (str): URL for video.
-        width (int): Video width.
-        height (int): Video height.
+        url (str): URL for the video. This is accessible from the browser.
+        width (int): This is the width of the video.
+        height (int): This is the height of the video.
         screenshot (str): URL for screenshot. This is what you will see in Discord.
         filename (str): Original video filename. We will append .html to the filename.
 
diff --git a/settings.py b/settings.py
index 866fed6..8fe2cd3 100644
--- a/settings.py
+++ b/settings.py
@@ -6,8 +6,8 @@ from dotenv import load_dotenv
 
 class Settings:
     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."
+        "Discord will only create embeds for videos and images if they are smaller than 8 mb. We can 'abuse' this"
+        " by creating a .html that contains the 'twitter:player' HTML meta tag linking to the video."
     )
     # Load environment variables
     load_dotenv()