diff --git a/fonts/LICENSE.txt b/fonts/LICENSE.txt new file mode 100644 index 0000000..75b5248 --- /dev/null +++ b/fonts/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/fonts/Roboto-Black.ttf b/fonts/Roboto-Black.ttf new file mode 100644 index 0000000..0112e7d Binary files /dev/null and b/fonts/Roboto-Black.ttf differ diff --git a/fonts/Roboto-Bold.ttf b/fonts/Roboto-Bold.ttf new file mode 100644 index 0000000..43da14d Binary files /dev/null and b/fonts/Roboto-Bold.ttf differ diff --git a/fonts/Roboto-Medium.ttf b/fonts/Roboto-Medium.ttf new file mode 100644 index 0000000..ac0f908 Binary files /dev/null and b/fonts/Roboto-Medium.ttf differ diff --git a/fonts/Roboto-Regular.ttf b/fonts/Roboto-Regular.ttf new file mode 100644 index 0000000..ddf4bfa Binary files /dev/null and b/fonts/Roboto-Regular.ttf differ diff --git a/main.py b/main.py index 02964fc..7094d93 100755 --- a/main.py +++ b/main.py @@ -1,4 +1,5 @@ #!/usr/bin/env python +from logging import error import math import sys from os import name @@ -22,7 +23,7 @@ from video_creation.final_video import make_final_video from video_creation.screenshot_downloader import download_screenshots_of_reddit_posts from video_creation.voices import save_text_to_mp3 -__VERSION__ = "2.4.2" +__VERSION__ = "2.5.0" print( """ @@ -102,5 +103,8 @@ if __name__ == "__main__": print_markdown("Please check your credentials in the config.toml file") shutdown() - + except Exception as err : + + print_step('looks like some thing gone wrong in testing builts it happens report on us discord') + raise err # todo error diff --git a/utils/imagenarator.py b/utils/imagenarator.py index d08bd5e..9b81233 100644 --- a/utils/imagenarator.py +++ b/utils/imagenarator.py @@ -1,16 +1,18 @@ -from PIL import Image, ImageDraw,ImageFont -import textwrap import re +import textwrap +from PIL import Image, ImageDraw, ImageFont from rich.progress import track -def draw_multiple_line_text(image, text, font, text_color,padding): + + +def draw_multiple_line_text(image, text, font, text_color,padding ,wrap=50): ''' Draw multiline text over given image ''' draw = ImageDraw.Draw(image) Fontperm= font.getsize(text) image_width, image_height = image.size - lines = textwrap.wrap(text, width=50) + lines = textwrap.wrap(text, width=wrap) y=(image_height/2)-(((Fontperm[1]+(len(lines)*padding)/len(lines))*len(lines))/2) for line in lines: line_width, line_height = font.getsize(line) @@ -18,25 +20,48 @@ def draw_multiple_line_text(image, text, font, text_color,padding): line, font=font, fill=text_color) y += line_height + padding - -def imagemaker( theme,reddit_obj, +#theme=bgcolor,reddit_obj=reddit_object,txtclr=txtcolor +def imagemaker( theme, + reddit_obj:dict, txtclr, padding=5 ): + ''' + Render Images for video + ''' + title=reddit_obj['thread_title'] texts=reddit_obj['thread_post'] id = re.sub(r"[^\w\s-]", "", reddit_obj["thread_id"]) - font=ImageFont.truetype("arial.ttf", 20) + tfont=ImageFont.truetype("fonts\Roboto-Bold.ttf",27) # for title + font=ImageFont.truetype("fonts\Roboto-Regular.ttf", 20)# for despcription|comments size=(500,176) - textcolor=txtclr + + + image =Image.new('RGBA',size,theme) + draw = ImageDraw.Draw(image) + + # for titlw + if len(title)>40: + draw_multiple_line_text(image, title,tfont,txtclr ,padding,wrap=30) + else: + + Fontperm= tfont.getsize(title) + draw.text(((image.size[0]-Fontperm[0])/2,(image.size[1]-Fontperm[1])/2),font=tfont,text=title) #(image.size[1]/2)-(Fontperm[1]/2) + + image.save(f'assets/temp/{id}/png/title.png') + + # for comment|description + + for idx,text in track(enumerate(texts),"Rendering Image"): - for idx,text in track(enumerate(texts),'Rendering Imaging..'): image =Image.new('RGBA',size,theme) draw = ImageDraw.Draw(image) + if len(text)>50: - draw_multiple_line_text(image, text,font, textcolor,padding) + draw_multiple_line_text(image, text,font, txtclr,padding) + else: - image =Image.new('RGBA',size,theme) - draw = ImageDraw.Draw(image) + Fontperm= font.getsize(text) - draw.text((((image.size[0]-Fontperm[0])/2),((image.size[1]-Fontperm[1])/2)),font=font,text=text,align='center') - image.save(f'assets/temp/{id}/png/img{idx}.png') \ No newline at end of file + draw.text(((image.size[0]-Fontperm[0])/2,(image.size[1]-Fontperm[1])/2),font=font,text=text) #(image.size[1]/2)-(Fontperm[1]/2) + image.save(f'assets/temp/{id}/png/img{idx}.png') diff --git a/utils/version.py b/utils/version.py index 8cad1d8..6ba4218 100644 --- a/utils/version.py +++ b/utils/version.py @@ -3,12 +3,15 @@ import requests from utils.console import print_step -def checkversion(__VERSION__): +def checkversion(__VERSION__:str): response = requests.get("https://api.github.com/repos/elebumm/RedditVideoMakerBot/releases/latest") latestversion = response.json()["tag_name"] if __VERSION__ == latestversion: print_step(f"You are using the newest version ({__VERSION__}) of the bot") return True + #FOR ERROR HANDLING, SO VERSION CAN EASILY BE DETECTED + elif __VERSION__> latestversion: + print_step(f"You are using the test version ({__VERSION__}) of the bot from AMAN RAZA") else: print_step( f"You are using an older version ({__VERSION__}) of the bot. Download the newest version ({latestversion}) from https://github.com/elebumm/RedditVideoMakerBot/releases/latest" diff --git a/video_creation/final_video.py b/video_creation/final_video.py index 589e3a0..3b28ce6 100644 --- a/video_creation/final_video.py +++ b/video_creation/final_video.py @@ -83,7 +83,8 @@ def make_final_video( audio_clips.insert(1,AudioFileClip(f"assets/temp/{id}/mp3/postaudio.mp3")) elif settings.config["settings"]["storymodemethod"] == 1: #here work is not done14 - audio_clips = [AudioFileClip(f"assets/temp/{id}/mp3/postaudio-{i}.mp3") for i in track(range(number_of_clips+1),"Collecting the audio files...")] + audio_clips = [AudioFileClip(f"assets/temp/{id}/mp3/postaudio-{i}.mp3") \ + for i in track(range(number_of_clips+1),"Collecting the audio files...")] audio_clips.insert(0, AudioFileClip(f"assets/temp/{id}/mp3/title.mp3")) else: @@ -164,7 +165,7 @@ def make_final_video( # # lowered_audio = audio_background.multiply_volume( # todo get this to work # # VOLUME_MULTIPLIER) # lower volume by background_audio_volume, use with fx # final.set_audio(final_audio) - + # if final = Video(final).add_watermark( text=f"Background credit: {background_config[2]}", opacity=0.4, redditid=reddit_obj ) diff --git a/video_creation/screenshot_downloader.py b/video_creation/screenshot_downloader.py index 855308e..850aa32 100644 --- a/video_creation/screenshot_downloader.py +++ b/video_creation/screenshot_downloader.py @@ -1,17 +1,20 @@ import json -from pathlib import Path import re +from pathlib import Path from typing import Dict + +import translators as ts +from playwright.async_api import \ + async_playwright # pylint: disable=unused-import +from playwright.sync_api import ViewportSize, sync_playwright +from rich.progress import track + from utils import settings -from playwright.async_api import async_playwright # pylint: disable=unused-import +from utils.console import print_step, print_substep +from utils.imagenarator import imagemaker # do not remove the above line -from playwright.sync_api import sync_playwright, ViewportSize -from rich.progress import track -import translators as ts -from utils.imagenarator import imagemaker -from utils.console import print_step, print_substep @@ -27,11 +30,12 @@ def download_screenshots_of_reddit_posts(reddit_object: dict, screenshot_num: in id = re.sub(r"[^\w\s-]", "", reddit_object["thread_id"]) # ! Make sure the reddit screenshots folder exists Path(f"assets/temp/{id}/png").mkdir(parents=True, exist_ok=True) - def download(cookie_file): + def download(cookie_file,num=None): + screenshot_num=num with sync_playwright() as p: print_substep("Launching Headless Browser...") - browser = p.chromium.launch(headless=False) # #to check for chrome view + browser = p.chromium.launch() #headless=False #to check for chrome view context = browser.new_context() @@ -41,7 +45,7 @@ def download_screenshots_of_reddit_posts(reddit_object: dict, screenshot_num: in # Get the thread screenshot page = context.new_page() page.goto(reddit_object["thread_url"], timeout=0) - page.set_viewport_size(ViewportSize(width=1920, height=1080)) + page.set_viewport_size(ViewportSize(width=1080, height=1920)) if page.locator('[data-testid="content-gate"]').is_visible(): # This means the post is NSFW and requires to click the proceed button. @@ -72,7 +76,7 @@ def download_screenshots_of_reddit_posts(reddit_object: dict, screenshot_num: in postcontentpath = f"assets/temp/{id}/png/title.png" page.locator('[data-test-id="post-content"]').screenshot(path=postcontentpath) - if not settings.config["settings"]["storymodemethod"]and settings.config["settings"]["storymode"]: + if settings.config["settings"]["storymode"]: try : #new change page.locator('[data-click-id="text"]').first.screenshot( @@ -110,11 +114,11 @@ def download_screenshots_of_reddit_posts(reddit_object: dict, screenshot_num: in ) except TimeoutError: del reddit_object["comments"] - screenshot_num += 1 + screenshot_num -= 1 print("TimeoutError: Skipping screenshot...") continue print_substep("Screenshots downloaded Successfully.", style="bold green") - + # story=False theme=settings.config["settings"]["theme"] if theme == "dark": cookie_file = open("./video_creation/data/cookie-dark-mode.json", encoding="utf-8") @@ -125,10 +129,12 @@ def download_screenshots_of_reddit_posts(reddit_object: dict, screenshot_num: in bgcolor=(255,255,255,255) txtcolor=(0,0,0) if settings.config["settings"]["storymode"] : - # if settings.config["settings"]["storymodemethod"] == 0: + # if settings.config["settings"]["storymodemethode"] == 0: # story=True if settings.config["settings"]["storymodemethod"] : # for idx,item in enumerate(reddit_object["thread_post"]): imagemaker(theme=bgcolor,reddit_obj=reddit_object,txtclr=txtcolor) - download(cookie_file) \ No newline at end of file + + if settings.config["settings"]["storymodemethod"] == 0 or not settings.config["settings"]["storymode"] : + download(cookie_file, screenshot_num) \ No newline at end of file