The RedditVideoMakerBot has been updated to version 3.2, bringing exciting new features and bug fixes. Introducing **ElevenLabs TTS** for high-quality audio. Enjoy **background audio** and **random voices per comment**. Run the bot with one click using the **bat file**. Use the **zoom setting** for bigger text. Bug fixes include video downloader improvements, random story mode fix, updated dependencies, code optimizations, text size adjustments, enhanced Reddit credentials validation, and translator fixes. Enjoy the new features and **thanks to all contributors**!
120 lines
4.2 KiB
Python
120 lines
4.2 KiB
Python
import json
|
|
from os.path import exists
|
|
|
|
from utils import settings
|
|
from utils.console import print_substep
|
|
from utils.ai_methods import sort_by_similarity
|
|
|
|
|
|
def get_subreddit_undone(
|
|
submissions: list, subreddit, times_checked=0, similarity_scores=None
|
|
):
|
|
"""_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
|
|
"""
|
|
# Second try of getting a valid Submission
|
|
if times_checked and settings.config["ai"]["ai_similarity_enabled"]:
|
|
print(
|
|
"Sorting based on similarity for a different date filter and thread limit.."
|
|
)
|
|
submissions = sort_by_similarity(
|
|
submissions, keywords=settings.config["ai"]["ai_similarity_enabled"]
|
|
)
|
|
|
|
# recursively checks if the top submission in the list was already done.
|
|
if not exists("./video_creation/data/videos.json"):
|
|
with open("./video_creation/data/videos.json", "w+") as f:
|
|
json.dump([], f)
|
|
with open(
|
|
"./video_creation/data/videos.json", "r", encoding="utf-8"
|
|
) as done_vids_raw:
|
|
done_videos = json.load(done_vids_raw)
|
|
for i, submission in enumerate(submissions):
|
|
if already_done(done_videos, submission):
|
|
continue
|
|
if submission.over_18:
|
|
try:
|
|
if not settings.config["settings"]["allow_nsfw"]:
|
|
print_substep("NSFW Post Detected. Skipping...")
|
|
continue
|
|
except AttributeError:
|
|
print_substep("NSFW settings not defined. Skipping NSFW post...")
|
|
if submission.stickied:
|
|
print_substep("This post was pinned by moderators. Skipping...")
|
|
continue
|
|
if (
|
|
submission.num_comments
|
|
<= int(settings.config["reddit"]["thread"]["min_comments"])
|
|
and not settings.config["settings"]["storymode"]
|
|
):
|
|
print_substep(
|
|
f'This post has under the specified minimum of comments ({settings.config["reddit"]["thread"]["min_comments"]}). Skipping...'
|
|
)
|
|
continue
|
|
if settings.config["settings"]["storymode"]:
|
|
if not submission.selftext:
|
|
print_substep(
|
|
"You are trying to use story mode on post with no post text"
|
|
)
|
|
continue
|
|
else:
|
|
# Check for the length of the post text
|
|
if len(submission.selftext) > (
|
|
settings.config["settings"]["storymode_max_length"] or 2000
|
|
):
|
|
print_substep(
|
|
f"Post is too long ({len(submission.selftext)}), try with a different post. ({settings.config['settings']['storymode_max_length']} character limit)"
|
|
)
|
|
continue
|
|
elif len(submission.selftext) < 30:
|
|
continue
|
|
if settings.config["settings"]["storymode"] and not submission.is_self:
|
|
continue
|
|
if similarity_scores is not None:
|
|
return submission, similarity_scores[i].item()
|
|
return submission
|
|
print("all submissions have been done going by top submission order")
|
|
VALID_TIME_FILTERS = [
|
|
"day",
|
|
"hour",
|
|
"month",
|
|
"week",
|
|
"year",
|
|
"all",
|
|
] # set doesn't have __getitem__
|
|
index = times_checked + 1
|
|
if index == len(VALID_TIME_FILTERS):
|
|
print("All submissions have been done.")
|
|
|
|
return get_subreddit_undone(
|
|
subreddit.top(
|
|
time_filter=VALID_TIME_FILTERS[index],
|
|
limit=(50 if int(index) == 0 else index + 1 * 50),
|
|
),
|
|
subreddit,
|
|
times_checked=index,
|
|
) # all the videos in hot have already been done
|
|
|
|
|
|
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:
|
|
if video["id"] == str(submission):
|
|
return True
|
|
return False
|