fix: fixed the GUI
chore: reformatted and optimized imports. Co-authored-by: Jan Tumpa <jtumpa@gmail.com>
This commit is contained in:
1 parent
d8dccb0eb1
commit
ed97ae4ebb
26 files changed
+329
-126
No files matched your search
@@ -5,11 +5,12 @@ from pathlib import Path
|
||||
from random import randrange
|
||||
from typing import Any, Tuple, Dict
|
||||
|
||||
import yt_dlp
|
||||
from moviepy.editor import VideoFileClip, AudioFileClip
|
||||
from moviepy.video.io.ffmpeg_tools import ffmpeg_extract_subclip
|
||||
|
||||
from utils import settings
|
||||
from utils.console import print_step, print_substep
|
||||
import yt_dlp
|
||||
|
||||
|
||||
def load_background_options():
|
||||
@@ -59,7 +60,9 @@ def get_start_and_end_times(video_length: int, length_of_clip: int) -> Tuple[int
|
||||
def get_background_config(mode: str):
|
||||
"""Fetch the background/s configuration"""
|
||||
try:
|
||||
choice = str(settings.config["settings"]["background"][f"background_{mode}"]).casefold()
|
||||
choice = str(
|
||||
settings.config["settings"]["background"][f"background_{mode}"]
|
||||
).casefold()
|
||||
except AttributeError:
|
||||
print_substep("No background selected. Picking random background'")
|
||||
choice = None
|
||||
@@ -119,7 +122,9 @@ def download_background_audio(background_config: Tuple[str, str, str]):
|
||||
print_substep("Background audio downloaded successfully! 🎉", style="bold green")
|
||||
|
||||
|
||||
def chop_background(background_config: Dict[str, Tuple], video_length: int, reddit_object: dict):
|
||||
def chop_background(
|
||||
background_config: Dict[str, Tuple], video_length: int, reddit_object: dict
|
||||
):
|
||||
"""Generates the background audio and footage to be used in the video and writes it to assets/temp/background.mp3 and assets/temp/background.mp4
|
||||
|
||||
Args:
|
||||
@@ -132,7 +137,9 @@ def chop_background(background_config: Dict[str, Tuple], video_length: int, redd
|
||||
print_step("Volume was set to 0. Skipping background audio creation . . .")
|
||||
else:
|
||||
print_step("Finding a spot in the backgrounds audio to chop...✂️")
|
||||
audio_choice = f"{background_config['audio'][2]}-{background_config['audio'][1]}"
|
||||
audio_choice = (
|
||||
f"{background_config['audio'][2]}-{background_config['audio'][1]}"
|
||||
)
|
||||
background_audio = AudioFileClip(f"assets/backgrounds/audio/{audio_choice}")
|
||||
start_time_audio, end_time_audio = get_start_and_end_times(
|
||||
video_length, background_audio.duration
|
||||
|
||||
@@ -1,9 +1,12 @@
|
||||
import multiprocessing
|
||||
import os
|
||||
import re
|
||||
import tempfile
|
||||
import threading
|
||||
import time
|
||||
from os.path import exists # Needs to be imported specifically
|
||||
from typing import Final
|
||||
from typing import Tuple, Any, Dict
|
||||
from typing import Tuple, Dict
|
||||
|
||||
import ffmpeg
|
||||
import translators
|
||||
@@ -11,15 +14,11 @@ from PIL import Image
|
||||
from rich.console import Console
|
||||
from rich.progress import track
|
||||
|
||||
from utils import settings
|
||||
from utils.cleanup import cleanup
|
||||
from utils.console import print_step, print_substep
|
||||
from utils.thumbnail import create_thumbnail
|
||||
from utils.videos import save_data
|
||||
from utils import settings
|
||||
|
||||
import tempfile
|
||||
import threading
|
||||
import time
|
||||
|
||||
console = Console()
|
||||
|
||||
@@ -76,7 +75,9 @@ def name_normalize(name: str) -> str:
|
||||
lang = settings.config["reddit"]["thread"]["post_lang"]
|
||||
if lang:
|
||||
print_substep("Translating filename...")
|
||||
translated_name = translators.translate_text(name, translator="google", to_language=lang)
|
||||
translated_name = translators.translate_text(
|
||||
name, translator="google", to_language=lang
|
||||
)
|
||||
return translated_name
|
||||
else:
|
||||
return name
|
||||
@@ -113,7 +114,9 @@ def merge_background_audio(audio: ffmpeg, reddit_id: str):
|
||||
audio (ffmpeg): The TTS final audio but without background.
|
||||
reddit_id (str): The ID of subreddit
|
||||
"""
|
||||
background_audio_volume = settings.config["settings"]["background"]["background_audio_volume"]
|
||||
background_audio_volume = settings.config["settings"]["background"][
|
||||
"background_audio_volume"
|
||||
]
|
||||
if background_audio_volume == 0:
|
||||
return audio # Return the original audio
|
||||
else:
|
||||
@@ -167,27 +170,42 @@ def make_final_video(
|
||||
if settings.config["settings"]["storymode"]:
|
||||
if settings.config["settings"]["storymodemethod"] == 0:
|
||||
audio_clips = [ffmpeg.input(f"assets/temp/{reddit_id}/mp3/title.mp3")]
|
||||
audio_clips.insert(1, ffmpeg.input(f"assets/temp/{reddit_id}/mp3/postaudio.mp3"))
|
||||
audio_clips.insert(
|
||||
1, ffmpeg.input(f"assets/temp/{reddit_id}/mp3/postaudio.mp3")
|
||||
)
|
||||
elif settings.config["settings"]["storymodemethod"] == 1:
|
||||
audio_clips = [
|
||||
ffmpeg.input(f"assets/temp/{reddit_id}/mp3/postaudio-{i}.mp3")
|
||||
for i in track(range(number_of_clips + 1), "Collecting the audio files...")
|
||||
for i in track(
|
||||
range(number_of_clips + 1), "Collecting the audio files..."
|
||||
)
|
||||
]
|
||||
audio_clips.insert(0, ffmpeg.input(f"assets/temp/{reddit_id}/mp3/title.mp3"))
|
||||
audio_clips.insert(
|
||||
0, ffmpeg.input(f"assets/temp/{reddit_id}/mp3/title.mp3")
|
||||
)
|
||||
|
||||
else:
|
||||
audio_clips = [
|
||||
ffmpeg.input(f"assets/temp/{reddit_id}/mp3/{i}.mp3") for i in range(number_of_clips)
|
||||
ffmpeg.input(f"assets/temp/{reddit_id}/mp3/{i}.mp3")
|
||||
for i in range(number_of_clips)
|
||||
]
|
||||
audio_clips.insert(0, ffmpeg.input(f"assets/temp/{reddit_id}/mp3/title.mp3"))
|
||||
|
||||
audio_clips_durations = [
|
||||
float(ffmpeg.probe(f"assets/temp/{reddit_id}/mp3/{i}.mp3")["format"]["duration"])
|
||||
float(
|
||||
ffmpeg.probe(f"assets/temp/{reddit_id}/mp3/{i}.mp3")["format"][
|
||||
"duration"
|
||||
]
|
||||
)
|
||||
for i in range(number_of_clips)
|
||||
]
|
||||
audio_clips_durations.insert(
|
||||
0,
|
||||
float(ffmpeg.probe(f"assets/temp/{reddit_id}/mp3/title.mp3")["format"]["duration"]),
|
||||
float(
|
||||
ffmpeg.probe(f"assets/temp/{reddit_id}/mp3/title.mp3")["format"][
|
||||
"duration"
|
||||
]
|
||||
),
|
||||
)
|
||||
audio_concat = ffmpeg.concat(*audio_clips, a=1, v=0)
|
||||
ffmpeg.output(
|
||||
@@ -213,13 +231,19 @@ def make_final_video(
|
||||
if settings.config["settings"]["storymode"]:
|
||||
audio_clips_durations = [
|
||||
float(
|
||||
ffmpeg.probe(f"assets/temp/{reddit_id}/mp3/postaudio-{i}.mp3")["format"]["duration"]
|
||||
ffmpeg.probe(f"assets/temp/{reddit_id}/mp3/postaudio-{i}.mp3")[
|
||||
"format"
|
||||
]["duration"]
|
||||
)
|
||||
for i in range(number_of_clips)
|
||||
]
|
||||
audio_clips_durations.insert(
|
||||
0,
|
||||
float(ffmpeg.probe(f"assets/temp/{reddit_id}/mp3/title.mp3")["format"]["duration"]),
|
||||
float(
|
||||
ffmpeg.probe(f"assets/temp/{reddit_id}/mp3/title.mp3")["format"][
|
||||
"duration"
|
||||
]
|
||||
),
|
||||
)
|
||||
if settings.config["settings"]["storymodemethod"] == 0:
|
||||
image_clips.insert(
|
||||
@@ -236,7 +260,9 @@ def make_final_video(
|
||||
)
|
||||
current_time += audio_clips_durations[0]
|
||||
elif settings.config["settings"]["storymodemethod"] == 1:
|
||||
for i in track(range(0, number_of_clips + 1), "Collecting the image files..."):
|
||||
for i in track(
|
||||
range(0, number_of_clips + 1), "Collecting the image files..."
|
||||
):
|
||||
image_clips.append(
|
||||
ffmpeg.input(f"assets/temp/{reddit_id}/png/img{i}.png")["v"].filter(
|
||||
"scale", screenshot_width, -1
|
||||
@@ -252,9 +278,9 @@ def make_final_video(
|
||||
else:
|
||||
for i in range(0, number_of_clips + 1):
|
||||
image_clips.append(
|
||||
ffmpeg.input(f"assets/temp/{reddit_id}/png/comment_{i}.png")["v"].filter(
|
||||
"scale", screenshot_width, -1
|
||||
)
|
||||
ffmpeg.input(f"assets/temp/{reddit_id}/png/comment_{i}.png")[
|
||||
"v"
|
||||
].filter("scale", screenshot_width, -1)
|
||||
)
|
||||
image_overlay = image_clips[i].filter("colorchannelmixer", aa=opacity)
|
||||
background_clip = background_clip.overlay(
|
||||
@@ -273,11 +299,15 @@ def make_final_video(
|
||||
subreddit = settings.config["reddit"]["thread"]["subreddit"]
|
||||
|
||||
if not exists(f"./results/{subreddit}"):
|
||||
print_substep("The 'results' folder could not be found so it was automatically created.")
|
||||
print_substep(
|
||||
"The 'results' folder could not be found so it was automatically created."
|
||||
)
|
||||
os.makedirs(f"./results/{subreddit}")
|
||||
|
||||
if not exists(f"./results/{subreddit}/OnlyTTS") and allowOnlyTTSFolder:
|
||||
print_substep("The 'OnlyTTS' folder could not be found so it was automatically created.")
|
||||
print_substep(
|
||||
"The 'OnlyTTS' folder could not be found so it was automatically created."
|
||||
)
|
||||
os.makedirs(f"./results/{subreddit}/OnlyTTS")
|
||||
|
||||
# create a thumbnail for the video
|
||||
@@ -291,7 +321,11 @@ def make_final_video(
|
||||
os.makedirs(f"./results/{subreddit}/thumbnails")
|
||||
# get the first file with the .png extension from assets/backgrounds and use it as a background for the thumbnail
|
||||
first_image = next(
|
||||
(file for file in os.listdir("assets/backgrounds") if file.endswith(".png")),
|
||||
(
|
||||
file
|
||||
for file in os.listdir("assets/backgrounds")
|
||||
if file.endswith(".png")
|
||||
),
|
||||
None,
|
||||
)
|
||||
if first_image is None:
|
||||
@@ -313,7 +347,9 @@ def make_final_video(
|
||||
title_thumb,
|
||||
)
|
||||
thumbnailSave.save(f"./assets/temp/{reddit_id}/thumbnail.png")
|
||||
print_substep(f"Thumbnail - Building Thumbnail in assets/temp/{reddit_id}/thumbnail.png")
|
||||
print_substep(
|
||||
f"Thumbnail - Building Thumbnail in assets/temp/{reddit_id}/thumbnail.png"
|
||||
)
|
||||
|
||||
text = f"Background by {background_config['video'][2]}"
|
||||
background_clip = ffmpeg.drawtext(
|
||||
@@ -354,7 +390,9 @@ def make_final_video(
|
||||
"b:a": "192k",
|
||||
"threads": multiprocessing.cpu_count(),
|
||||
},
|
||||
).overwrite_output().global_args("-progress", progress.output_file.name).run(
|
||||
).overwrite_output().global_args(
|
||||
"-progress", progress.output_file.name
|
||||
).run(
|
||||
quiet=True,
|
||||
overwrite_output=True,
|
||||
capture_stdout=False,
|
||||
@@ -384,7 +422,9 @@ def make_final_video(
|
||||
"b:a": "192k",
|
||||
"threads": multiprocessing.cpu_count(),
|
||||
},
|
||||
).overwrite_output().global_args("-progress", progress.output_file.name).run(
|
||||
).overwrite_output().global_args(
|
||||
"-progress", progress.output_file.name
|
||||
).run(
|
||||
quiet=True,
|
||||
overwrite_output=True,
|
||||
capture_stdout=False,
|
||||
|
||||
@@ -4,7 +4,6 @@ from pathlib import Path
|
||||
from typing import Dict, Final
|
||||
|
||||
import translators
|
||||
from playwright.async_api import async_playwright # pylint: disable=unused-import
|
||||
from playwright.sync_api import ViewportSize, sync_playwright
|
||||
from rich.progress import track
|
||||
|
||||
@@ -12,7 +11,6 @@ from utils import settings
|
||||
from utils.console import print_step, print_substep
|
||||
from utils.imagenarator import imagemaker
|
||||
from utils.playwright import clear_cookie_by_name
|
||||
|
||||
from utils.videos import save_data
|
||||
|
||||
__all__ = ["download_screenshots_of_reddit_posts"]
|
||||
@@ -38,7 +36,9 @@ def get_screenshots_of_reddit_posts(reddit_object: dict, screenshot_num: int):
|
||||
|
||||
# set the theme and disable non-essential cookies
|
||||
if settings.config["settings"]["theme"] == "dark":
|
||||
cookie_file = open("./video_creation/data/cookie-dark-mode.json", encoding="utf-8")
|
||||
cookie_file = open(
|
||||
"./video_creation/data/cookie-dark-mode.json", encoding="utf-8"
|
||||
)
|
||||
bgcolor = (33, 33, 36, 255)
|
||||
txtcolor = (240, 240, 240)
|
||||
transparent = False
|
||||
@@ -48,15 +48,21 @@ def get_screenshots_of_reddit_posts(reddit_object: dict, screenshot_num: int):
|
||||
bgcolor = (0, 0, 0, 0)
|
||||
txtcolor = (255, 255, 255)
|
||||
transparent = True
|
||||
cookie_file = open("./video_creation/data/cookie-dark-mode.json", encoding="utf-8")
|
||||
cookie_file = open(
|
||||
"./video_creation/data/cookie-dark-mode.json", encoding="utf-8"
|
||||
)
|
||||
else:
|
||||
# Switch to dark theme
|
||||
cookie_file = open("./video_creation/data/cookie-dark-mode.json", encoding="utf-8")
|
||||
cookie_file = open(
|
||||
"./video_creation/data/cookie-dark-mode.json", encoding="utf-8"
|
||||
)
|
||||
bgcolor = (33, 33, 36, 255)
|
||||
txtcolor = (240, 240, 240)
|
||||
transparent = False
|
||||
else:
|
||||
cookie_file = open("./video_creation/data/cookie-light-mode.json", encoding="utf-8")
|
||||
cookie_file = open(
|
||||
"./video_creation/data/cookie-light-mode.json", encoding="utf-8"
|
||||
)
|
||||
bgcolor = (255, 255, 255, 255)
|
||||
txtcolor = (0, 0, 0)
|
||||
transparent = False
|
||||
@@ -100,8 +106,12 @@ def get_screenshots_of_reddit_posts(reddit_object: dict, screenshot_num: int):
|
||||
page.set_viewport_size(ViewportSize(width=1920, height=1080))
|
||||
page.wait_for_load_state()
|
||||
|
||||
page.locator('[name="username"]').fill(settings.config["reddit"]["creds"]["username"])
|
||||
page.locator('[name="password"]').fill(settings.config["reddit"]["creds"]["password"])
|
||||
page.locator('[name="username"]').fill(
|
||||
settings.config["reddit"]["creds"]["username"]
|
||||
)
|
||||
page.locator('[name="password"]').fill(
|
||||
settings.config["reddit"]["creds"]["password"]
|
||||
)
|
||||
page.locator("button[class$='m-full-width']").click()
|
||||
page.wait_for_timeout(5000)
|
||||
|
||||
@@ -182,7 +192,9 @@ def get_screenshots_of_reddit_posts(reddit_object: dict, screenshot_num: int):
|
||||
location[i] = float("{:.2f}".format(location[i] * zoom))
|
||||
page.screenshot(clip=location, path=postcontentpath)
|
||||
else:
|
||||
page.locator('[data-test-id="post-content"]').screenshot(path=postcontentpath)
|
||||
page.locator('[data-test-id="post-content"]').screenshot(
|
||||
path=postcontentpath
|
||||
)
|
||||
except Exception as e:
|
||||
print_substep("Something went wrong!", style="red")
|
||||
resp = input(
|
||||
@@ -196,7 +208,9 @@ def get_screenshots_of_reddit_posts(reddit_object: dict, screenshot_num: int):
|
||||
"green",
|
||||
)
|
||||
|
||||
resp = input("Do you want the error traceback for debugging purposes? (y/n)")
|
||||
resp = input(
|
||||
"Do you want the error traceback for debugging purposes? (y/n)"
|
||||
)
|
||||
if not resp.casefold().startswith("y"):
|
||||
exit()
|
||||
|
||||
@@ -241,9 +255,13 @@ def get_screenshots_of_reddit_posts(reddit_object: dict, screenshot_num: int):
|
||||
# zoom the body of the page
|
||||
page.evaluate("document.body.style.zoom=" + str(zoom))
|
||||
# scroll comment into view
|
||||
page.locator(f"#t1_{comment['comment_id']}").scroll_into_view_if_needed()
|
||||
page.locator(
|
||||
f"#t1_{comment['comment_id']}"
|
||||
).scroll_into_view_if_needed()
|
||||
# as zooming the body doesn't change the properties of the divs, we need to adjust for the zoom
|
||||
location = page.locator(f"#t1_{comment['comment_id']}").bounding_box()
|
||||
location = page.locator(
|
||||
f"#t1_{comment['comment_id']}"
|
||||
).bounding_box()
|
||||
for i in location:
|
||||
location[i] = float("{:.2f}".format(location[i] * zoom))
|
||||
page.screenshot(
|
||||
|
||||
@@ -5,9 +5,9 @@ from rich.console import Console
|
||||
from TTS.GTTS import GTTS
|
||||
from TTS.TikTok import TikTok
|
||||
from TTS.aws_polly import AWSPolly
|
||||
from TTS.elevenlabs import elevenlabs
|
||||
from TTS.engine_wrapper import TTSEngine
|
||||
from TTS.pyttsx import pyttsx
|
||||
from TTS.elevenlabs import elevenlabs
|
||||
from TTS.streamlabs_polly import StreamlabsPolly
|
||||
from utils import settings
|
||||
from utils.console import print_table, print_step
|
||||
@@ -36,7 +36,9 @@ def save_text_to_mp3(reddit_obj) -> Tuple[int, int]:
|
||||
|
||||
voice = settings.config["settings"]["tts"]["voice_choice"]
|
||||
if str(voice).casefold() in map(lambda _: _.casefold(), TTSProviders):
|
||||
text_to_mp3 = TTSEngine(get_case_insensitive_key_value(TTSProviders, voice), reddit_obj)
|
||||
text_to_mp3 = TTSEngine(
|
||||
get_case_insensitive_key_value(TTSProviders, voice), reddit_obj
|
||||
)
|
||||
else:
|
||||
while True:
|
||||
print_step("Please choose one of the following TTS providers: ")
|
||||
@@ -45,12 +47,18 @@ def save_text_to_mp3(reddit_obj) -> Tuple[int, int]:
|
||||
if choice.casefold() in map(lambda _: _.casefold(), TTSProviders):
|
||||
break
|
||||
print("Unknown Choice")
|
||||
text_to_mp3 = TTSEngine(get_case_insensitive_key_value(TTSProviders, choice), reddit_obj)
|
||||
text_to_mp3 = TTSEngine(
|
||||
get_case_insensitive_key_value(TTSProviders, choice), reddit_obj
|
||||
)
|
||||
return text_to_mp3.run()
|
||||
|
||||
|
||||
def get_case_insensitive_key_value(input_dict, key):
|
||||
return next(
|
||||
(value for dict_key, value in input_dict.items() if dict_key.lower() == key.lower()),
|
||||
(
|
||||
value
|
||||
for dict_key, value in input_dict.items()
|
||||
if dict_key.lower() == key.lower()
|
||||
),
|
||||
None,
|
||||
)
|
||||
Reference in new issue
Block a user