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**!
@ -24,7 +25,7 @@ from video_creation.screenshot_downloader import get_screenshots_of_reddit_posts
fromvideo_creation.voicesimportsave_text_to_mp3
fromvideo_creation.voicesimportsave_text_to_mp3
fromutils.ffmpeg_installimportffmpeg_install
fromutils.ffmpeg_installimportffmpeg_install
__VERSION__="3.1"
__VERSION__="3.2"
print(
print(
"""
"""
@ -38,7 +39,7 @@ print(
)
)
# Modified by JasonLovesDoggo
# Modified by JasonLovesDoggo
print_markdown(
print_markdown(
"### Thanks for using this tool! [Feel free to contribute to this project on GitHub!](https://lewismenelaws.com) If you have any questions, feel free to reach out to me on Twitter or submit a GitHub issue. You can find solutions to many common problems in the [Documentation](): https://reddit-video-maker-bot.netlify.app/"
"### 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/"
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.")
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.")
min_comment_length={default=1,optional=true,nmin=0,nmax=10000,type="int",explanation="min_comment_length number of characters a comment can have. default is 0",example=50,oob_error="the max comment length should be between 1 and 100"}
min_comment_length={default=1,optional=true,nmin=0,nmax=10000,type="int",explanation="min_comment_length number of characters a comment can have. default is 0",example=50,oob_error="the max comment length should be between 1 and 100"}
post_lang={default="",optional=true,explanation="The language you would like to translate to.",example="es-cr",options=['','af','ak','am','ar','as','ay','az','be','bg','bho','bm','bn','bs','ca','ceb','ckb','co','cs','cy','da','de','doi','dv','ee','el','en','en-US','eo','es','et','eu','fa','fi','fr','fy','ga','gd','gl','gn','gom','gu','ha','haw','hi','hmn','hr','ht','hu','hy','id','ig','ilo','is','it','iw','ja','jw','ka','kk','km','kn','ko','kri','ku','ky','la','lb','lg','ln','lo','lt','lus','lv','mai','mg','mi','mk','ml','mn','mni-Mtei','mr','ms','mt','my','ne','nl','no','nso','ny','om','or','pa','pl','ps','pt','qu','ro','ru','rw','sa','sd','si','sk','sl','sm','sn','so','sq','sr','st','su','sv','sw','ta','te','tg','th','ti','tk','tl','tr','ts','tt','ug','uk','ur','uz','vi','xh','yi','yo','zh-CN','zh-TW','zu']}
post_lang={default="",optional=true,explanation="The language you would like to translate to.",example="es-cr",options=['','af','ak','am','ar','as','ay','az','be','bg','bho','bm','bn','bs','ca','ceb','ckb','co','cs','cy','da','de','doi','dv','ee','el','en','en-US','eo','es','et','eu','fa','fi','fr','fy','ga','gd','gl','gn','gom','gu','ha','haw','hi','hmn','hr','ht','hu','hy','id','ig','ilo','is','it','iw','ja','jw','ka','kk','km','kn','ko','kri','ku','ky','la','lb','lg','ln','lo','lt','lus','lv','mai','mg','mi','mk','ml','mn','mni-Mtei','mr','ms','mt','my','ne','nl','no','nso','ny','om','or','pa','pl','ps','pt','qu','ro','ru','rw','sa','sd','si','sk','sl','sm','sn','so','sq','sr','st','su','sv','sw','ta','te','tg','th','ti','tk','tl','tr','ts','tt','ug','uk','ur','uz','vi','xh','yi','yo','zh-CN','zh-TW','zu']}
min_comments={default=20,optional=false,nmin=10,type="int",explanation="The minimum number of comments a post should have to be included. default is 20",example=29,oob_error="the minimum number of comments should be between 15 and 999999"}
min_comments={default=20,optional=false,nmin=10,type="int",explanation="The minimum number of comments a post should have to be included. default is 20",example=29,oob_error="the minimum number of comments should be between 15 and 999999"}
#post_url = { optional = true, default = "", regex = "^https:\\/\\/www\\.reddit\\.com\\/r\\/[a-zA-Z0-9]+\\/comments\\/[a-zA-Z0-9]+\\/[a-zA-Z0-9_]+\\/$", explanation = "Not working currently Use if you want to use a specific post.", example = "https://www.reddit.com/r/buildapc/comments/yzh07p/have_you_switched_to_windows_11/" }
[ai]
[ai]
ai_similarity_enabled={optional=true,option=[true,false],default=false,type="bool",explanation="Threads read from Reddit are sorted based on their similarity to the keywords given below"}
ai_similarity_enabled={optional=true,option=[true,false],default=false,type="bool",explanation="Threads read from Reddit are sorted based on their similarity to the keywords given below"}
@ -25,29 +24,34 @@ allow_nsfw = { optional = false, type = "bool", default = false, example = false
theme={optional=false,default="dark",example="light",options=["dark","light","transparent",],explanation="Sets the Reddit theme, either LIGHT or DARK. For story mode you can also use a transparent background."}
theme={optional=false,default="dark",example="light",options=["dark","light","transparent",],explanation="Sets the Reddit theme, either LIGHT or DARK. For story mode you can also use a transparent background."}
times_to_run={optional=false,default=1,example=2,explanation="Used if you want to run multiple times. Set to an int e.g. 4 or 29 or 1",type="int",nmin=1,oob_error="It's very hard to run something less than once."}
times_to_run={optional=false,default=1,example=2,explanation="Used if you want to run multiple times. Set to an int e.g. 4 or 29 or 1",type="int",nmin=1,oob_error="It's very hard to run something less than once."}
opacity={optional=false,default=0.9,example=0.8,explanation="Sets the opacity of the comments when overlayed over the background",type="float",nmin=0,nmax=1,oob_error="The opacity HAS to be between 0 and 1",input_error="The opacity HAS to be a decimal number between 0 and 1"}
opacity={optional=false,default=0.9,example=0.8,explanation="Sets the opacity of the comments when overlayed over the background",type="float",nmin=0,nmax=1,oob_error="The opacity HAS to be between 0 and 1",input_error="The opacity HAS to be a decimal number between 0 and 1"}
transition={optional=true,default=0.2,example=0.2,explanation="Sets the transition time (in seconds) between the comments. Set to 0 if you want to disable it.", type = "float", nmin = 0, nmax = 2, oob_error = "The transition HAS to be between 0 and 2", input_error = "The opacity HAS to be a decimal number between 0 and 2" }
#transition = { optional = true, default = 0.2, example = 0.2, explanation = "Sets the transition time (in seconds) between the comments. Set to 0 if you want to disable it.", type = "float", nmin = 0, nmax = 2, oob_error = "The transition HAS to be between 0 and 2", input_error = "The opacity HAS to be a decimal number between 0 and 2" }
storymode={optional=true,type="bool",default=false,example=false,options=[true,false,],explanation="Only read out title and post content, great for subreddits with stories"}
storymode={optional=true,type="bool",default=false,example=false,options=[true,false,],explanation="Only read out title and post content, great for subreddits with stories"}
storymodemethod={optional=true,default=1,example=1,explanation="Style that's used for the storymode. Set to 0 for single picture display in whole video, set to 1 for fancy looking video ",type="int",nmin=0,oob_error="It's very hard to run something less than once.",options=[0,1]}
storymodemethod={optional=true,default=1,example=1,explanation="Style that's used for the storymode. Set to 0 for single picture display in whole video, set to 1 for fancy looking video ",type="int",nmin=0,oob_error="It's very hard to run something less than once.",options=[0,1]}
storymode_max_length={optional=true,default=1000,example=1000,explanation="Max length of the storymode video in characters. 200 characters are approximately 50 seconds.",type="int",nmin=1,oob_error="It's very hard to make a video under a second."}
storymode_max_length={optional=true,default=1000,example=1000,explanation="Max length of the storymode video in characters. 200 characters are approximately 50 seconds.",type="int",nmin=1,oob_error="It's very hard to make a video under a second."}
resolution_w={optional=false,default=1080,example=1440,explantation="Sets the width in pixels of the final video"}
resolution_w={optional=false,default=1080,example=1440,explantation="Sets the width in pixels of the final video"}
resolution_h={optional=false,default=1920,example=2560,explantation="Sets the height in pixels of the final video"}
resolution_h={optional=false,default=1920,example=2560,explantation="Sets the height in pixels of the final video"}
zoom={optional=true,default=1,example=1.1,explanation="Sets the browser zoom level. Useful if you want the text larger.",type="float",nmin=0.1,nmax=2,oob_error="The text is really difficult to read at a zoom level higher than 2"}
[settings.background]
[settings.background]
background_choice={optional=true,default="minecraft",example="rocket-league",options=["minecraft","gta","rocket-league","motor-gta","csgo-surf","cluster-truck","minecraft-2","multiversus","fall-guys","steep",""],explanation="Sets the background for the video based on game name"}
background_video={optional=true,default="minecraft",example="rocket-league",options=["minecraft","gta","rocket-league","motor-gta","csgo-surf","cluster-truck","minecraft-2","multiversus","fall-guys","steep",""],explanation="Sets the background for the video based on game name"}
#background_audio = { optional = true, type = "bool", default = false, example = false, options = [true, false,], explanation = "Sets a audio to play in the background (put a background.mp3 file in the assets/backgrounds directory for it to be used.)" }
background_audio={optional=true,default="lofi",example="chill-summer",options=["lofi","lofi-2","chill-summer",""],explanation="Sets the background audio for the video"}
#background_audio_volume = { optional = true, type = "float", default = 0.3, example = 0.1, explanation="Sets the volume of the background audio. only used if the background_audio is also set to true" }
background_audio_volume={optional=true,type="float",nmin=0,nmax=1,default=0.15,example=0.05,explanation="Sets the volume of the background audio. If you don't want background audio, set it to 0.",oob_error="The volume HAS to be between 0 and 1",input_error="The volume HAS to be a float number between 0 and 1"}
enable_extra_audio={optional=true,type="bool",default=false,example=false,explanation="Used if you want to render another video without background audio in a separate folder",input_error="The value HAS to be true or false"}
background_thumbnail={optional=true,type="bool",default=false,example=false,options=[true,false,],explanation="Generate a thumbnail for the video (put a thumbnail.png file in the assets/backgrounds directory.)"}
background_thumbnail={optional=true,type="bool",default=false,example=false,options=[true,false,],explanation="Generate a thumbnail for the video (put a thumbnail.png file in the assets/backgrounds directory.)"}
background_thumbnail_font_family={optional=true,default="arial",example="arial",explanation="Font family for the thumbnail text"}
background_thumbnail_font_family={optional=true,default="arial",example="arial",explanation="Font family for the thumbnail text"}
background_thumbnail_font_size={optional=true,type="int",default=96,example=96,explanation="Font size in pixels for the thumbnail text"}
background_thumbnail_font_size={optional=true,type="int",default=96,example=96,explanation="Font size in pixels for the thumbnail text"}
background_thumbnail_font_color={optional=true,default="255,255,255",example="255,255,255",explanation="Font color in RGB format for the thumbnail text"}
background_thumbnail_font_color={optional=true,default="255,255,255",example="255,255,255",explanation="Font color in RGB format for the thumbnail text"}
[settings.tts]
[settings.tts]
voice_choice={optional=false,default="tiktok",options=["streamlabspolly","tiktok","googletranslate","awspolly","pyttsx",],example="tiktok",explanation="The voice platform used for TTS generation. This can be left blank and you will be prompted to choose at runtime."}
voice_choice={optional=false,default="tiktok",options=["elevenlabs","streamlabspolly","tiktok","googletranslate","awspolly","pyttsx",],example="tiktok",explanation="The voice platform used for TTS generation. "}
random_voice={optional=false,default=true,example=true,options=[true,false,],explanation="Randomizes the voice used for each comment"}
elevenlabs_voice_name={optional=false,default="Bella",example="Bella",explanation="The voice used for elevenlabs",options=["Adam","Antoni","Arnold","Bella","Domi","Elli","Josh","Rachel","Sam",]}
elevenlabs_api_key={optional=true,example="21f13f91f54d741e2ae27d2ab1b99d59",explanation="Elevenlabs API key"}
aws_polly_voice={optional=false,default="Matthew",example="Matthew",explanation="The voice used for AWS Polly"}
aws_polly_voice={optional=false,default="Matthew",example="Matthew",explanation="The voice used for AWS Polly"}
streamlabs_polly_voice={optional=false,default="Matthew",example="Matthew",explanation="The voice used for Streamlabs Polly"}
streamlabs_polly_voice={optional=false,default="Matthew",example="Matthew",explanation="The voice used for Streamlabs Polly"}
tiktok_voice={optional=true,default="en_us_001",example="en_us_006",explanation="The voice used for TikTok TTS"}
tiktok_voice={optional=true,default="en_us_001",example="en_us_006",explanation="The voice used for TikTok TTS"}
tiktok_sessionid={optional=true,example="c76bcc3a7625abcc27b508c7db457ff1",explanation="TikTok sessionid needed for the TTS API request. Check documentation if you don't know how to obtain it." }
tiktok_sessionid={optional=true,example="c76bcc3a7625abcc27b508c7db457ff1",explanation="TikTok sessionid needed if you're using the TikTok TTS. Check documentation if you don't know how to obtain it." }
python_voice={optional=false,default="1",example="1",explanation="The index of the system tts voices (can be downloaded externally, run ptt.py to find value, start from zero)"}
python_voice={optional=false,default="1",example="1",explanation="The index of the system tts voices (can be downloaded externally, run ptt.py to find value, start from zero)"}
py_voice_num={optional=false,default="2",example="2",explanation="The number of system voices (2 are pre-installed in Windows)"}
py_voice_num={optional=false,default="2",example="2",explanation="The number of system voices (2 are pre-installed in Windows)"}
silence_duration={optional=true,example="0.1",explanation="Time in seconds between TTS comments",default=0.3,type="float"}
#silence_duration = { optional = true, example = "0.1", explanation = "Time in seconds between TTS comments", default = 0.3, type = "float" }
no_emojis={optional=false,type="bool",default=false,example=false,options=[true,false,],explanation="Whether to remove emojis from the comments"}
no_emojis={optional=false,type="bool",default=false,example=false,options=[true,false,],explanation="Whether to remove emojis from the comments"}
print('FFmpeg is installed on this system! If you are seeing this error for the second time, restart your computer.')
exceptFileNotFoundErrorase:
exceptFileNotFoundErrorase:
# Check if there's ffmpeg.exe in the current directory
ifos.path.exists("./ffmpeg.exe"):
print('FFmpeg is installed on this system! If you are seeing this error for the second time, restart your computer.')
print('FFmpeg is not installed on this system.')
print('FFmpeg is not installed on this system.')
resp=input("We can try to automatically install it for you. Would you like to do that? (y/n): ")
resp=input(
"We can try to automatically install it for you. Would you like to do that? (y/n): "
)
ifresp.lower()=="y":
ifresp.lower()=="y":
print("Installing FFmpeg...")
print("Installing FFmpeg...")
ifos.name=="nt":
ifos.name=="nt":
@ -73,12 +91,16 @@ def ffmpeg_install():
elifos.name=="mac":
elifos.name=="mac":
ffmpeg_install_mac()
ffmpeg_install_mac()
else:
else:
print("Your OS is not supported. Please install FFmpeg manually and try again.")
print(
"Your OS is not supported. Please install FFmpeg manually and try again."
)
exit()
exit()
else:
else:
print("Please install FFmpeg manually and try again.")
print("Please install FFmpeg manually and try again.")
exit()
exit()
exceptExceptionase:
exceptExceptionase:
print("Welcome fellow traveler! You're one of the few who have made it this far. We have no idea how you got at this error, but we're glad you're here. Please report this error to the developer, and we'll try to fix it as soon as possible. Thank you for your patience!")
print(
"Welcome fellow traveler! You're one of the few who have made it this far. We have no idea how you got at this error, but we're glad you're here. Please report this error to the developer, and we'll try to fix it as soon as possible. Thank you for your patience!"