Merge pull request #648 from HallowedDust5/Documentation

Documentation and typing in function declarations
pull/758/head
Callum Leslie 2 years ago committed by GitHub
commit 76f4166914
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -37,11 +37,9 @@ def main():
load_dotenv() load_dotenv()
cleanup() cleanup()
def get_obj():
reddit_obj = get_subreddit_threads()
return reddit_obj
reddit_object = get_obj()
reddit_object = get_subreddit_threads()
length, number_of_comments = save_text_to_mp3(reddit_object) length, number_of_comments = save_text_to_mp3(reddit_object)
download_screenshots_of_reddit_posts(reddit_object, number_of_comments) download_screenshots_of_reddit_posts(reddit_object, number_of_comments)
download_background() download_background()

@ -11,6 +11,11 @@ console = Console()
def check_env() -> bool: def check_env() -> bool:
"""Checks to see what's been put in .env
Returns:
bool: Whether or not everything was put in properly
"""
if not os.path.exists(".env.template"): if not os.path.exists(".env.template"):
console.print("[red]Couldn't find .env.template. Unable to check variables.") console.print("[red]Couldn't find .env.template. Unable to check variables.")
return True return True

@ -3,6 +3,11 @@ from os.path import exists
def cleanup() -> int: def cleanup() -> int:
"""Deletes all temporary assets in assets/temp
Returns:
int: How many files were deleted
"""
if exists("./assets/temp"): if exists("./assets/temp"):
count = 0 count = 0
files = [f for f in os.listdir(".") if f.endswith(".mp4") and "temp" in f.lower()] files = [f for f in os.listdir(".") if f.endswith(".mp4") and "temp" in f.lower()]

@ -4,7 +4,16 @@ from os import getenv
from utils.console import print_substep from utils.console import print_substep
def get_subreddit_undone(submissions: List, subreddit): def get_subreddit_undone(submissions: list, subreddit):
"""_summary_
Args:
submissions (list): List of posts that are going to potentially be generated into a video
subreddit (praw.Reddit.SubredditHelper): Chosen subreddit
Returns:
Any: The submission that has not been done
"""
""" """
recursively checks if the top submission in the list was already done. recursively checks if the top submission in the list was already done.
""" """
@ -27,7 +36,16 @@ def get_subreddit_undone(submissions: List, subreddit):
) # all of the videos in hot have already been done ) # all of the videos in hot have already been done
def already_done(done_videos: list, submission): def already_done(done_videos: list, submission)->bool:
"""Checks to see if the given submission is in the list of videos
Args:
done_videos (list): Finished videos
submission (Any): The submission
Returns:
Boolean: Whether the video was found in the list
"""
for video in done_videos: for video in done_videos:
if video["id"] == str(submission): if video["id"] == str(submission):

@ -5,10 +5,17 @@ from utils.console import print_step
def check_done( def check_done(
redditobj, redditobj:dict[str],
): # don't set this to be run anyplace that isn't subreddit.py bc of inspect stack )->dict[str]|None: # don't set this to be run anyplace that isn't subreddit.py bc of inspect stack
"""params: """Checks if the chosen post has already been generated
reddit_object: The Reddit Object you received in askreddit.py"""
Args:
redditobj (dict[str]): Reddit object gotten from reddit/subreddit.py
Returns:
dict[str]|None: Reddit object in args
"""
with open("./video_creation/data/videos.json", "r") as done_vids_raw: with open("./video_creation/data/videos.json", "r") as done_vids_raw:
done_videos = json.load(done_vids_raw) done_videos = json.load(done_vids_raw)
for video in done_videos: for video in done_videos:

@ -1,12 +1,17 @@
import re import re
def sanitize_text(text): def sanitize_text(text: str) -> str:
""" """Sanitizes the text for tts.
Sanitizes the text for tts. What gets removed:
What gets removed: - following characters`^_~@!&;#:-%“”‘"%*/{}[]()\|<>?=+`
- following characters`^_~@!&;#:-%“”‘"%*/{}[]()\|<>?=+` - any http or https links
- any http or https links
Args:
text (str): Text to be sanitized
Returns:
str: Sanitized text
""" """
# remove any urls from the text # remove any urls from the text

@ -8,7 +8,16 @@ from moviepy.editor import VideoFileClip
from utils.console import print_step, print_substep from utils.console import print_step, print_substep
def get_start_and_end_times(video_length, length_of_clip): def get_start_and_end_times(video_length:int, length_of_clip:int)->tuple[int,int]:
"""Generates a random interval of time to be used as the beckground of the video.
Args:
video_length (int): Length of the video
length_of_clip (int): Length of the video to be used as the background
Returns:
tuple[int,int]: Start and end time of the randomized interval
"""
random_time = randrange(180, int(length_of_clip) - int(video_length)) random_time = randrange(180, int(length_of_clip) - int(video_length))
return random_time, random_time + video_length return random_time, random_time + video_length
@ -45,7 +54,12 @@ def download_background():
) )
def chop_background_video(video_length): def chop_background_video(video_length:int):
"""Generates the background footage to be used in the video and writes it to assets/temp/background.mp4
Args:
video_length (int): Length of the clip where the background footage is to be taken out of
"""
print_step("Finding a spot in the backgrounds video to chop...✂️") print_step("Finding a spot in the backgrounds video to chop...✂️")
choice = random.choice(listdir("assets/backgrounds")) choice = random.choice(listdir("assets/backgrounds"))
environ["background_credit"] = choice.split("-")[0] environ["background_credit"] = choice.split("-")[0]
@ -60,4 +74,3 @@ def chop_background_video(video_length):
targetname="assets/temp/background.mp4", targetname="assets/temp/background.mp4",
) )
print_substep("Background video chopped successfully!", style="bold green") print_substep("Background video chopped successfully!", style="bold green")
return True

@ -25,7 +25,13 @@ console = Console()
W, H = 1080, 1920 W, H = 1080, 1920
def make_final_video(number_of_clips, length): def make_final_video(number_of_clips:int, length:int):
"""Gathers audio clips, gathers all screenshots, stitches them together and saves the final video to assets/temp
Args:
number_of_clips (int): Index to end at when going through the screenshots
length (int): Length of the video
"""
print_step("Creating the final video 🎥") print_step("Creating the final video 🎥")
VideoFileClip.reW = lambda clip: clip.resize(width=W) VideoFileClip.reW = lambda clip: clip.resize(width=W)
VideoFileClip.reH = lambda clip: clip.resize(width=H) VideoFileClip.reH = lambda clip: clip.resize(width=H)
@ -110,32 +116,12 @@ def make_final_video(number_of_clips, length):
image_concat.audio = audio_composite image_concat.audio = audio_composite
final = CompositeVideoClip([background_clip, image_concat]) final = CompositeVideoClip([background_clip, image_concat])
def get_video_title() -> str:
title = os.getenv("VIDEO_TITLE") or "final_video"
if len(title) <= 35:
return title
else:
return title[0:30] + "..."
filename = f"{get_video_title()}.mp4" filename = f"{get_video_title()}.mp4"
def save_data():
with open("./video_creation/data/videos.json", "r+") as raw_vids: save_data(filename)
done_vids = json.load(raw_vids)
if str(subreddit.submission.id) in [video["id"] for video in done_vids]:
return # video already done but was specified to continue anyway in the .env file
payload = {
"id": str(os.getenv("VIDEO_ID")),
"time": str(int(time.time())),
"background_credit": str(os.getenv("background_credit")),
"reddit_title": str(os.getenv("VIDEO_TITLE")),
"filename": filename,
}
done_vids.append(payload)
raw_vids.seek(0)
json.dump(done_vids, raw_vids, ensure_ascii=False, indent=4)
save_data()
if not exists("./results"): if not exists("./results"):
print_substep("the results folder didn't exist so I made it") print_substep("the results folder didn't exist so I made it")
os.mkdir("./results") os.mkdir("./results")
@ -160,3 +146,36 @@ def make_final_video(number_of_clips, length):
print_step( print_step(
f"Reddit title: {os.getenv('VIDEO_TITLE')} \n Background Credit: {os.getenv('background_credit')}" f"Reddit title: {os.getenv('VIDEO_TITLE')} \n Background Credit: {os.getenv('background_credit')}"
) )
def save_data(filename:str):
"""Saves the videos that have already been generated to a JSON file in video_creation/data/videos.json
Args:
filename (str): The finished video title name
"""
with open("./video_creation/data/videos.json", "r+") as raw_vids:
done_vids = json.load(raw_vids)
if str(subreddit.submission.id) in [video["id"] for video in done_vids]:
return # video already done but was specified to continue anyway in the .env file
payload = {
"id": str(os.getenv("VIDEO_ID")),
"time": str(int(time.time())),
"background_credit": str(os.getenv("background_credit")),
"reddit_title": str(os.getenv("VIDEO_TITLE")),
"filename": filename,
}
done_vids.append(payload)
raw_vids.seek(0)
json.dump(done_vids, raw_vids, ensure_ascii=False, indent=4)
def get_video_title() -> str:
"""Gets video title from env variable or gives it the name "final_video"
Returns:
str: Video title
"""
title = os.getenv("VIDEO_TITLE") or "final_video"
if len(title) <= 35:
return title
else:
return title[0:30] + "..."

@ -18,12 +18,14 @@ console = Console()
storymode = False storymode = False
def download_screenshots_of_reddit_posts(reddit_object, screenshot_num): def download_screenshots_of_reddit_posts(reddit_object:dict[str], screenshot_num:int):
"""Downloads screenshots of reddit posts as they are seen on the web. """Downloads screenshots of reddit posts as seen on the web. Downloads to assets/temp/png
Args: Args:
reddit_object: The Reddit Object you received in askreddit.py reddit_object (dict[str]): Reddit object received from reddit/subreddit.py
screenshot_num: The number of screenshots you want to download. screenshot_num (int): Number of screenshots to downlaod
""" """
print_step("Downloading screenshots of reddit posts...") print_step("Downloading screenshots of reddit posts...")
# ! Make sure the reddit screenshots folder exists # ! Make sure the reddit screenshots folder exists

@ -25,11 +25,16 @@ TTSProviders = {
VIDEO_LENGTH: int = 40 # secs VIDEO_LENGTH: int = 40 # secs
def save_text_to_mp3(reddit_obj): def save_text_to_mp3(reddit_obj:dict[str])->tuple[int,int]:
"""Saves Text to MP3 files. """Saves text to MP3 files. Goes through the reddit_obj and generates the title MP3 file and a certain number of comments until the total amount of time exceeds VIDEO_LENGTH seconds.
Args: Args:
reddit_obj : The reddit object you received from the reddit API in the askreddit.py file. reddit_obj (dict[str]): Reddit object received from reddit API in reddit/subreddit.py
Returns:
tuple[int,int]: (total length of the audio, the number of comments audio was generated for)
""" """
env = os.getenv("TTSCHOICE", "") env = os.getenv("TTSCHOICE", "")
if env.casefold() in map(lambda _: _.casefold(), TTSProviders): if env.casefold() in map(lambda _: _.casefold(), TTSProviders):
text_to_mp3 = TTSEngine( text_to_mp3 = TTSEngine(

Loading…
Cancel
Save