Create setup TUI and improve overall UX

pull/125/head
BlockArchitech 3 years ago
parent f4b7ff736f
commit 39a691887e
No known key found for this signature in database
GPG Key ID: B264EC928CE5983E

@ -1,15 +1,61 @@
# Main
from utils.console import print_markdown from utils.console import print_markdown
from utils.console import print_step
from utils.console import print_substep
from rich.console import Console
import time import time
import os
from reddit.askreddit import get_askreddit_threads from reddit.askreddit import get_askreddit_threads
from video_creation.background import download_background, chop_background_video from video_creation.background import download_background, chop_background_video
from video_creation.voices import save_text_to_mp3 from video_creation.voices import save_text_to_mp3
from video_creation.screenshot_downloader import download_screenshots_of_reddit_posts from video_creation.screenshot_downloader import download_screenshots_of_reddit_posts
from video_creation.final_video import make_final_video from video_creation.final_video import make_final_video
from utils.loader import Loader
from dotenv import load_dotenv
console = Console()
print_markdown( print_markdown(
"### Thanks for using this tool! 😊 [Feel free to contribute to this project on GitHub!](https://lewismenelaws.com). If you have any questions, feel free to reach out to me on Twitter or submit a GitHub issue." "### Thanks for using this tool! 😊 [Feel free to contribute to this project on GitHub!](https://lewismenelaws.com). If you have any questions, feel free to reach out to me on Twitter or submit a GitHub issue."
) )
"""
Load .env file if exists. If it doesnt exist, print a warning and launch the setup wizard.
If there is a .env file, check if the required variables are set. If not, print a warning and launch the setup wizard.
"""
client_id=os.getenv("REDDIT_CLIENT_ID")
client_secret=os.getenv("REDDIT_CLIENT_SECRET")
username=os.getenv("REDDIT_USERNAME")
password=os.getenv("REDDIT_PASSWORD")
console.log("[bold green]Checking environment variables...")
time.sleep(1)
if client_id == "" or client_secret == "" or username == "" or password == "":
console.log("[red]Looks like you need to set your Reddit credentials in the .env file. Please follow the instructions in the README.md file to set them up.")
time.sleep(0.5)
console.log("[red]We can also launch the easy setup wizard. type yes to launch it, or no to quit the program.")
setup_ask = input("Launch setup wizard? > ")
if setup_ask=="yes":
console.log("[bold green]Here goes nothing! Launching setup wizard...")
time.sleep(0.5)
os.system("python3 setup.py")
else:
if setup_ask=="no":
console.print("[red]Exiting...")
time.sleep(0.5)
exit()
else:
console.print("[red]I don't understand that. Exiting...")
time.sleep(0.5)
exit()
exit()
console.log("[bold green]Enviroment Variables are set! Continuing...")
time.sleep(3) time.sleep(3)

@ -1,9 +1,10 @@
from rich import Console
from utils.console import print_markdown, print_step, print_substep from utils.console import print_markdown, print_step, print_substep
import praw import praw
import random import random
from dotenv import load_dotenv from dotenv import load_dotenv
import os import os
console = Console()
def get_askreddit_threads(): def get_askreddit_threads():
""" """
@ -14,6 +15,7 @@ def get_askreddit_threads():
content = {} content = {}
load_dotenv() load_dotenv()
console.log("Logging in to reddit...")
reddit = praw.Reddit( reddit = praw.Reddit(
client_id=os.getenv("REDDIT_CLIENT_ID"), client_id=os.getenv("REDDIT_CLIENT_ID"),
client_secret=os.getenv("REDDIT_CLIENT_SECRET"), client_secret=os.getenv("REDDIT_CLIENT_SECRET"),
@ -25,6 +27,7 @@ def get_askreddit_threads():
threads = askreddit.hot(limit=25) threads = askreddit.hot(limit=25)
submission = list(threads)[random.randrange(0, 25)] submission = list(threads)[random.randrange(0, 25)]
print_substep(f"Video will be: {submission.title} :thumbsup:") print_substep(f"Video will be: {submission.title} :thumbsup:")
console.log("Getting video comments...")
try: try:
content["thread_url"] = submission.url content["thread_url"] = submission.url

@ -34,7 +34,7 @@ rich==12.4.4
six==1.16.0 six==1.16.0
toml==0.10.1 toml==0.10.1
tqdm==4.64.0 tqdm==4.64.0
typed-ast==1.4.1 typed-ast==1.5.4 # Please see issue https://github.com/elebumm/RedditVideoMakerBot/issues/16 comment three.
typing_extensions==4.2.0 typing_extensions==4.2.0
update-checker==0.18.0 update-checker==0.18.0
urllib3==1.26.9 urllib3==1.26.9

@ -0,0 +1,96 @@
"""
Setup Script for RedditVideoMakerBot
"""
# Imports
import os
import time
from utils.console import print_markdown
from utils.console import print_step
from utils.console import print_substep
from rich.console import Console
from utils.loader import Loader
console = Console()
# These lines ensure the user:
# - knows they are in setup mode
# - knows that they are about to erase any other setup files/data.
print_step("Setup Assistant")
print_markdown(
"### You're in the setup wizard. Ensure you're supposed to be here, then type yes to continue. If you're not sure, type no to quit."
)
# This Input is used to ensure the user is sure they want to continue.
ensureSetupIsRequired = input("Are you sure you want to continue? > ")
if ensureSetupIsRequired != "yes":
console.print("[red]Exiting...")
time.sleep(0.5)
exit()
else:
# Again, let them know they are about to erase all other setup data.
console.print("[bold red] This will overwrite your current settings. Are you sure you want to continue? [bold green]yes/no")
overwriteSettings = input("Are you sure you want to continue? > ")
if overwriteSettings != "yes":
console.print("[red]Abort mission! Exiting...")
time.sleep(0.5)
exit()
else:
# Once they confirm, move on with the script.
console.print("[bold green]Alright! Let's get started!")
time.sleep(1)
console.log("Ensure you have the following ready to enter:")
console.log("[bold green]Reddit Client ID")
console.log("[bold green]Reddit Client Secret")
console.log("[bold green]Reddit Username")
console.log("[bold green]Reddit Password")
time.sleep(0.5)
console.print("[green]If you don't have these, please follow the instructions in the README.md file to set them up.")
console.print("[green]If you do have these, type yes to continue. If you dont, go ahead and grab those quickly and come back.")
confirmUserHasCredentials = input("Are you sure you have the credentials? > ")
if confirmUserHasCredentials != "yes":
console.print("[red]I don't understand that.")
console.print("[red]Exiting...")
exit()
else:
console.print("[bold green]Alright! Let's get started!")
time.sleep(1)
"""
Begin the setup process.
"""
console.log("Enter your credentials now.")
cliID = input("Client ID > ")
cliSec = input("Client Secret > ")
user = input("Username > ")
passw = input("Password > ")
console.log("Attempting to save your credentials...")
loader = Loader("Saving Credentials...", "Done!").start()
# you can also put a while loop here, e.g. while VideoIsBeingMade == True: ...
time.sleep(0.5)
console.log("Removing old .env file...")
os.remove(".env")
time.sleep(0.5)
console.log("Creating new .env file...")
with open('.env', 'a') as f:
f.write(f'REDDIT_CLIENT_ID="{cliID}"\n')
time.sleep(0.5)
f.write(f'REDDIT_CLIENT_SECRET="{cliSec}"\n')
time.sleep(0.5)
f.write(f'REDDIT_USERNAME="{user}"\n')
time.sleep(0.5)
f.write(f'REDDIT_PASSWORD="{passw}"\n')
loader.stop()
console.log("[bold green]Setup Complete! Returning...")
# Post-Setup: send message and try to run main.py again.
os.system("python3 main.py")

@ -0,0 +1,53 @@
"""
Okay, have to admit. This code is from StackOverflow. It's so efficient, that it's probably the best way to do it.
Although, it is edited to use less threads.
"""
from itertools import cycle
from shutil import get_terminal_size
from threading import Thread
from time import sleep
class Loader:
def __init__(self, desc="Loading...", end="Done!", timeout=0.1):
"""
A loader-like context manager
Args:
desc (str, optional): The loader's description. Defaults to "Loading...".
end (str, optional): Final print. Defaults to "Done!".
timeout (float, optional): Sleep time between prints. Defaults to 0.1.
"""
self.desc = desc
self.end = end
self.timeout = timeout
self._thread = Thread(target=self._animate, daemon=True)
self.steps = ["", "", "", "", "", "", "", ""]
self.done = False
def start(self):
self._thread.start()
return self
def _animate(self):
for c in cycle(self.steps):
if self.done:
break
print(f"\r{self.desc} {c}", flush=True, end="")
sleep(self.timeout)
def __enter__(self):
self.start()
def stop(self):
self.done = True
cols = get_terminal_size((80, 20)).columns
print("\r" + " " * cols, end="", flush=True)
print(f"\r{self.end}", flush=True)
def __exit__(self, exc_type, exc_value, tb):
# handle exceptions with those variables ^
self.stop()
Loading…
Cancel
Save