You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
200 lines
9.3 KiB
200 lines
9.3 KiB
#!/usr/bin/env python
|
|
import math
|
|
import os
|
|
import shutil
|
|
import time
|
|
import schedule
|
|
import sys
|
|
from os import name
|
|
from pathlib import Path
|
|
from subprocess import Popen
|
|
from typing import NoReturn
|
|
|
|
from prawcore import ResponseException
|
|
from utils.console import print_substep
|
|
from reddit.subreddit import get_subreddit_threads
|
|
from utils import settings
|
|
from utils.cleanup import cleanup
|
|
from utils.console import print_markdown, print_step
|
|
from utils.id import id
|
|
from utils.version import checkversion
|
|
from video_creation.background import (
|
|
download_background_video,
|
|
download_background_audio,
|
|
chop_background,
|
|
get_background_config,
|
|
)
|
|
from video_creation.final_video import make_final_video
|
|
from video_creation.screenshot_downloader import get_screenshots_of_reddit_posts
|
|
from video_creation.voices import save_text_to_mp3
|
|
from utils.ffmpeg_install import ffmpeg_install
|
|
from utils.compressor import compress_video
|
|
|
|
__VERSION__ = "3.2.1"
|
|
|
|
print(
|
|
"""
|
|
██████╗ ███████╗██████╗ ██████╗ ██╗████████╗ ██╗ ██╗██╗██████╗ ███████╗ ██████╗ ███╗ ███╗ █████╗ ██╗ ██╗███████╗██████╗
|
|
██╔══██╗██╔════╝██╔══██╗██╔══██╗██║╚══██╔══╝ ██║ ██║██║██╔══██╗██╔════╝██╔═══██╗ ████╗ ████║██╔══██╗██║ ██╔╝██╔════╝██╔══██╗
|
|
██████╔╝█████╗ ██║ ██║██║ ██║██║ ██║ ██║ ██║██║██║ ██║█████╗ ██║ ██║ ██╔████╔██║███████║█████╔╝ █████╗ ██████╔╝
|
|
██╔══██╗██╔══╝ ██║ ██║██║ ██║██║ ██║ ╚██╗ ██╔╝██║██║ ██║██╔══╝ ██║ ██║ ██║╚██╔╝██║██╔══██║██╔═██╗ ██╔══╝ ██╔══██╗
|
|
██║ ██║███████╗██████╔╝██████╔╝██║ ██║ ╚████╔╝ ██║██████╔╝███████╗╚██████╔╝ ██║ ╚═╝ ██║██║ ██║██║ ██╗███████╗██║ ██║
|
|
╚═╝ ╚═╝╚══════╝╚═════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═══╝ ╚═╝╚═════╝ ╚══════╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
|
|
"""
|
|
)
|
|
# Modified by JasonLovesDoggo
|
|
print_markdown(
|
|
"### Thanks for using this tool! Feel free to contribute to this project on GitHub! If you have any questions, feel free to join my Discord server or submit a GitHub issue. You can find solutions to many common problems in the documentation: https://reddit-video-maker-bot.netlify.app/"
|
|
)
|
|
checkversion(__VERSION__)
|
|
|
|
|
|
def main(POST_ID=None) -> None:
|
|
global redditid, reddit_object
|
|
reddit_object = get_subreddit_threads(POST_ID)
|
|
redditid = id(reddit_object)
|
|
if not (settings.config["settings"]["debug"]["reuse_images"] and
|
|
settings.config["settings"]["debug"]["reuse_separate_mp3s"]):
|
|
reddit_object['thread_post'] = proofread_post(reddit_object['thread_post'])
|
|
post_text = ' '.join(reddit_object['thread_post'])
|
|
|
|
if not os.path.exists(f"./assets/temp/{reddit_object['thread_id']}/"):
|
|
for key in settings.config["settings"]["debug"].keys():
|
|
if key != "debug" and key != "no_youtube":
|
|
settings.config["settings"]["debug"][key] = False
|
|
|
|
length, number_of_comments = save_text_to_mp3(reddit_object)
|
|
length = math.ceil(length)
|
|
reel = length <= 60
|
|
|
|
get_screenshots_of_reddit_posts(reddit_object, number_of_comments, reel)
|
|
if not settings.config["settings"]["debug"]["reuse_background"]:
|
|
bg_config = {
|
|
"video": get_background_config("video"),
|
|
"audio": get_background_config("audio"),
|
|
}
|
|
download_background_video(bg_config["video"])
|
|
download_background_audio(bg_config["audio"])
|
|
chop_background(bg_config, length, reddit_object)
|
|
else:
|
|
bg_config = {
|
|
"video": ["debug mode", "debug mode", "debug mode"],
|
|
"audio": ["debug mode", "debug mode", "debug mode"],
|
|
}
|
|
video_path = make_final_video(number_of_comments, length, reddit_object, bg_config, reel)
|
|
if not video_path: return False
|
|
video_path = compress_video(video_path)
|
|
|
|
video_data, thumbnail_text = get_video_data(post_text, bg_config)
|
|
print("Video title:", video_data['title'])
|
|
print("Video description:", video_data['description'])
|
|
print("Video tags:", video_data['tags'])
|
|
|
|
thumbnail = generate_image(thumbnail_text, f"./assets/temp/{reddit_object['thread_id']}/thumbnail_image.png")
|
|
thumbnail = add_text(
|
|
thumbnail_path=thumbnail,
|
|
text=video_data["thumbnail_text"],
|
|
save_path=f"./assets/temp/{reddit_object['thread_id']}/thumbnail.png"
|
|
)
|
|
print("Thumbnail generated successfully at:", thumbnail)
|
|
if not settings.config["settings"]["debug"]["no_youtube"]:
|
|
upload_video_to_youtube(video_path, video_data, thumbnail)
|
|
|
|
if not settings.config["settings"]["debug"]["debug"]:
|
|
shutil.rmtree(f"./assets/temp/{reddit_object['thread_id']}/")
|
|
return True
|
|
|
|
|
|
def run_many(times) -> None:
|
|
for x in range(1, times + 1):
|
|
print_step(
|
|
f'on the {x}{("th", "st", "nd", "rd", "th", "th", "th", "th", "th", "th")[x % 10]} iteration of {times}'
|
|
) # correct 1st 2nd 3rd 4th 5th....
|
|
main()
|
|
Popen("cls" if name == "nt" else "clear", shell=True).wait()
|
|
|
|
|
|
def shutdown() -> NoReturn:
|
|
if "redditid" in globals():
|
|
print_markdown("## Clearing temp files")
|
|
cleanup(redditid)
|
|
|
|
print("Exiting...")
|
|
sys.exit()
|
|
|
|
def run():
|
|
if config["reddit"]["thread"]["post_id"]:
|
|
for index, post_id in enumerate(config["reddit"]["thread"]["post_id"].split("+")):
|
|
index += 1
|
|
print_step(
|
|
f'on the {index}{("st" if index % 10 == 1 else ("nd" if index % 10 == 2 else ("rd" if index % 10 == 3 else "th")))} post of {len(config["reddit"]["thread"]["post_id"].split("+"))}'
|
|
)
|
|
main(post_id)
|
|
Popen("cls" if name == "nt" else "clear", shell=True).wait()
|
|
# elif config["settings"]["times_to_run"]:
|
|
# run_many(config["settings"]["times_to_run"])
|
|
else:
|
|
while True:
|
|
status = main()
|
|
print("Status:", status)
|
|
if status: break
|
|
|
|
print_substep("The video was created successfully! 🎉", style="bold green")
|
|
print_substep(
|
|
f'Next run will be in {settings.config["settings"]["run_every"]} hours.',
|
|
style="bold green"
|
|
)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
if sys.version_info.major != 3 or sys.version_info.minor != 10:
|
|
print(
|
|
"Hey! Congratulations, you've made it so far (which is pretty rare with no Python 3.10). Unfortunately, this program only works on Python 3.10. Please install Python 3.10 and try again."
|
|
)
|
|
sys.exit()
|
|
ffmpeg_install()
|
|
directory = Path().absolute()
|
|
config = settings.check_toml(
|
|
f"{directory}/utils/.config.template.toml", f"{directory}/config.toml"
|
|
)
|
|
config is False and sys.exit()
|
|
|
|
from video_data_generation.gemini import get_video_data
|
|
from video_data_generation.image_generation import generate_image, add_text
|
|
from utils.proofreading import proofread_post
|
|
|
|
if not settings.config["settings"]["debug"]["no_youtube"]:
|
|
from utils.youtube_uploader import upload_video_to_youtube
|
|
|
|
if (
|
|
not settings.config["settings"]["tts"]["tiktok_sessionid"]
|
|
or settings.config["settings"]["tts"]["tiktok_sessionid"] == ""
|
|
) and config["settings"]["tts"]["voice_choice"] == "tiktok":
|
|
print_substep(
|
|
"TikTok voice requires a sessionid! Check our documentation on how to obtain one.",
|
|
"bold red",
|
|
)
|
|
sys.exit()
|
|
try:
|
|
run()
|
|
schedule.every(settings.config["settings"]["run_every"]).hours.do(run)
|
|
while True:
|
|
schedule.run_pending()
|
|
time.sleep(1)
|
|
except KeyboardInterrupt:
|
|
shutdown()
|
|
except ResponseException:
|
|
print_markdown("## Invalid credentials")
|
|
print_markdown("Please check your credentials in the config.toml file")
|
|
shutdown()
|
|
except Exception as err:
|
|
config["settings"]["tts"]["tiktok_sessionid"] = "REDACTED"
|
|
config["settings"]["tts"]["elevenlabs_api_key"] = "REDACTED"
|
|
print_step(
|
|
f"Sorry, something went wrong with this version! Try again, and feel free to report this issue at GitHub or the Discord community.\n"
|
|
f"Version: {__VERSION__} \n"
|
|
f"Error: {err} \n"
|
|
f'Config: {config["settings"]}'
|
|
)
|
|
raise err
|