diff --git a/.env.template b/.env.template index 7cf7cc2..77f2acf 100644 --- a/.env.template +++ b/.env.template @@ -14,7 +14,7 @@ REDDIT_CLIENT_SECRET="" #fFAGRNJru1FTz70BzhT3Zg REDDIT_USERNAME="" #asdfghjkl #EXPLANATION the username of your reddit account #RANGE 3:20 -#MATCH_REGEX [_0-9a-zA-Z]+$ +#MATCH_REGEX [-_0-9a-zA-Z]+$ #OOB_ERROR A username HAS to be between 3 and 20 characters REDDIT_PASSWORD="" #fFAGRNJru1FTz70BzhT3Zg diff --git a/README.md b/README.md index bffbc8c..dc6237c 100644 --- a/README.md +++ b/README.md @@ -32,21 +32,19 @@ The only original thing being done is the editing and gathering of all materials ## Requirements -- Python 3.7+ +- Python 3.9+ - Playwright (this should install automatically in installation) ## Installation 👩‍💻 1. Clone this repository -2. **Automatic Install**: Run `python main.py` and type 'yes' to activate the setup assistant. +2. Run `pip install -r requirements.txt` -3. Run `pip install -r requirements.txt` +3. Run `playwright install` and `playwright install-deps`. (if this fails try adding python -m to the front of the command) -4. Run `playwright install` and `playwright install-deps`. (if this fails try adding python -m to the front of the command) - -5. Run `python main.py` (unless you chose automatic install, then the installer will automatically run main.py) +4. Run `python main.py` required\*\*), visit [the Reddit Apps page.](https://www.reddit.com/prefs/apps) TL;DR set up an app that is a "script". -6. Enjoy 😎 +5. Enjoy 😎 (Note if you got an error installing or running the bot try first rerunning the command with a three after the name e.g. python3 or pip3) diff --git a/requirements.txt b/requirements.txt index 4cc217c..687f952 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ boto3==1.24.12 -botocore==1.27.12 +botocore==1.27.22 gTTS==2.2.4 moviepy==1.0.3 mutagen==1.45.1 @@ -9,4 +9,4 @@ python-dotenv==0.20.0 pytube==12.1.0 requests==2.28.1 rich==12.4.4 -translators==5.2.2 +translators==5.3.1 diff --git a/utils/videos.py b/utils/videos.py index f675ecf..07659f6 100755 --- a/utils/videos.py +++ b/utils/videos.py @@ -2,6 +2,7 @@ import json import os import time from os import getenv +from typing import Dict from praw.models import Submission @@ -9,18 +10,17 @@ from utils.console import print_step def check_done( - redditobj: dict[str], + redditobj: Submission, ) -> Submission: # don't set this to be run anyplace that isn't subreddit.py bc of inspect stack """Checks if the chosen post has already been generated Args: - redditobj (dict[str]): Reddit object gotten from reddit/subreddit.py + redditobj (Dict[str]): Reddit object gotten from reddit/subreddit.py Returns: - dict[str]|None: Reddit object in args + Dict[str]|None: Reddit object in args """ - with open("./video_creation/data/videos.json", "r", encoding="utf-8") as done_vids_raw: done_videos = json.load(done_vids_raw) for video in done_videos: diff --git a/video_creation/final_video.py b/video_creation/final_video.py index 418254c..01be0db 100755 --- a/video_creation/final_video.py +++ b/video_creation/final_video.py @@ -3,6 +3,8 @@ import multiprocessing import os import re from os.path import exists +from typing import Dict + from moviepy.editor import ( VideoFileClip, AudioFileClip, @@ -24,12 +26,13 @@ console = Console() W, H = 1080, 1920 -def make_final_video(number_of_clips: int, length: int, reddit_obj: dict[str]): +def make_final_video(number_of_clips: int, length: int, reddit_obj: dict): """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 + reddit_obj (dict): The reddit object that contains the posts to read. """ print_step("Creating the final video 🎥") VideoFileClip.reW = lambda clip: clip.resize(width=W) @@ -52,40 +55,25 @@ def make_final_video(number_of_clips: int, length: int, reddit_obj: dict[str]): # add title to video image_clips = [] # Gather all images - if opacity is None or float(opacity) >= 1: # opacity not set or is set to one OR MORE - image_clips.insert( - 0, - ImageClip("assets/temp/png/title.png") - .set_duration(audio_clips[0].duration) - .set_position("center") - .resize(width=W - 100), - ) - else: - image_clips.insert( - 0, - ImageClip("assets/temp/png/title.png") - .set_duration(audio_clips[0].duration) - .set_position("center") - .resize(width=W - 100) - .set_opacity(float(opacity)), - ) + new_opacity = 1 if opacity is None or float(opacity) >= 1 else opacity + + image_clips.insert( + 0, + ImageClip("assets/temp/png/title.png") + .set_duration(audio_clips[0].duration) + .set_position("center") + .resize(width=W - 100) + .set_opacity(new_opacity) + ) for i in range(0, number_of_clips): - if opacity is None or float(opacity) >= 1: # opacity not set or is set to one OR MORE - image_clips.append( - ImageClip(f"assets/temp/png/comment_{i}.png") - .set_duration(audio_clips[i + 1].duration) - .set_position("center") - .resize(width=W - 100), - ) - else: - image_clips.append( - ImageClip(f"assets/temp/png/comment_{i}.png") - .set_duration(audio_clips[i + 1].duration) - .set_position("center") - .resize(width=W - 100) - .set_opacity(float(opacity)), - ) + image_clips.append( + ImageClip(f"assets/temp/png/comment_{i}.png") + .set_duration(audio_clips[i + 1].duration) + .set_position("center") + .resize(width=W - 100) + .set_opacity(new_opacity) + ) # if os.path.exists("assets/mp3/posttext.mp3"): # image_clips.insert( diff --git a/video_creation/screenshot_downloader.py b/video_creation/screenshot_downloader.py index aa1c9d9..e8afc44 100644 --- a/video_creation/screenshot_downloader.py +++ b/video_creation/screenshot_downloader.py @@ -2,6 +2,7 @@ import json import os from os import getenv from pathlib import Path +from typing import Dict from playwright.async_api import async_playwright # pylint: disable=unused-import @@ -16,14 +17,13 @@ from utils.console import print_step, print_substep storymode = False -def download_screenshots_of_reddit_posts(reddit_object: dict[str], screenshot_num: int): +def download_screenshots_of_reddit_posts(reddit_object: dict, screenshot_num: int): """Downloads screenshots of reddit posts as seen on the web. Downloads to assets/temp/png Args: - reddit_object (dict[str]): Reddit object received from reddit/subreddit.py + reddit_object (Dict[str]): Reddit object received from reddit/subreddit.py screenshot_num (int): Number of screenshots to downlaod """ - print_step("Downloading screenshots of reddit posts...") # ! Make sure the reddit screenshots folder exists diff --git a/video_creation/voices.py b/video_creation/voices.py index 240c851..5105a10 100644 --- a/video_creation/voices.py +++ b/video_creation/voices.py @@ -1,6 +1,7 @@ #!/usr/bin/env python import os +from typing import Dict, Tuple from rich.console import Console @@ -23,7 +24,7 @@ TTSProviders = { } -def save_text_to_mp3(reddit_obj: dict[str]) -> tuple[int, int]: +def save_text_to_mp3(reddit_obj) -> Tuple[int, int]: """Saves text to MP3 files. Args: