diff --git a/utils/imagenarator.py b/utils/imagenarator.py index 2fc8571..1b5ccf3 100644 --- a/utils/imagenarator.py +++ b/utils/imagenarator.py @@ -1,7 +1,6 @@ from PIL import Image, ImageDraw,ImageFont import textwrap import re - def draw_multiple_line_text(image, text, font, text_color,padding): ''' Draw multiline text over given image @@ -10,7 +9,7 @@ def draw_multiple_line_text(image, text, font, text_color,padding): Fontperm= font.getsize(text) image_width, image_height = image.size lines = textwrap.wrap(text, width=50) - y=(image_height/2)-(((Fontperm[1]+(len(lines)*padding)/len(lines))*len(lines))/2) #dont touch it + 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) draw.text(((image_width - line_width) / 2, y), @@ -18,24 +17,24 @@ def draw_multiple_line_text(image, text, font, text_color,padding): y += line_height + padding -def imagemaker(text, - reddit_obj, - idx='NoName', +def imagemaker( theme,reddit_obj, + txtclr, padding=5 ): + texts=reddit_obj['thread_post'] id = re.sub(r"[^\w\s-]", "", reddit_obj["thread_id"]) font=ImageFont.truetype("arial.ttf", 20) - Fontperm= font.getsize(text) - # print(Fontperm[1]) size=(500,176) - - textcolor=(240,240,240) + textcolor=txtclr - image =Image.new('RGBA',size,(33,33,36,255)) - - draw = ImageDraw.Draw(image) - if len(text)>50: - draw_multiple_line_text(image, text,font, textcolor,padding) - else: - draw.text(((image.size[0]-Fontperm[0])/2,(image.size[1]-Fontperm[1])/2),font=font,text=text,align='center') #(image.size[1]/2)-(Fontperm[1]/2) - image.save(f'assets/temp/{id}/png/img{idx}.png') \ No newline at end of file + for idx,text in enumerate(texts): + image =Image.new('RGBA',size,theme) + draw = ImageDraw.Draw(image) + if len(text)>50: + draw_multiple_line_text(image, text,font, textcolor,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 diff --git a/video_creation/screenshot_downloader.py b/video_creation/screenshot_downloader.py index 5e9bfb3..54c2797 100644 --- a/video_creation/screenshot_downloader.py +++ b/video_creation/screenshot_downloader.py @@ -1,16 +1,21 @@ import json -import re from pathlib import Path +import re from typing import Dict +from utils import settings +from playwright.async_api import async_playwright # pylint: disable=unused-import + +# do not remove the above line -import translators as ts from playwright.sync_api import sync_playwright, ViewportSize from rich.progress import track import translators as ts -from utils import settings from utils.imagenarator import imagemaker from utils.console import print_step, print_substep + + + def download_screenshots_of_reddit_posts(reddit_object: dict, screenshot_num: int): """Downloads screenshots of reddit posts as seen on the web. Downloads to assets/temp/png @@ -22,94 +27,108 @@ 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) - - with sync_playwright() as p: - print_substep("Launching Headless Browser...") - - browser = p.chromium.launch() # add headless=False for debug - - context = browser.new_context() - - if settings.config["settings"]["theme"] == "dark": - cookie_file = open("./video_creation/data/cookie-dark-mode.json", encoding="utf-8") - else: - cookie_file = open("./video_creation/data/cookie-light-mode.json", encoding="utf-8") - cookies = json.load(cookie_file) - context.add_cookies(cookies) # load preference cookies - # 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)) - if page.locator('[data-testid="content-gate"]').is_visible(): - # This means the post is NSFW and requires to click the proceed button. - - print_substep("Post is NSFW. You are spicy...") - page.locator('[data-testid="content-gate"] button').click() - page.wait_for_load_state() # Wait for page to fully load - - if page.locator('[data-click-id="text"] button').is_visible(): - page.locator('[data-click-id="text"] button').click() # Remove "Click to see nsfw" Button in Screenshot - - # translate code - - if settings.config["reddit"]["thread"]["post_lang"]: - print_substep("Translating post...") - texts_in_tl = ts.google( - reddit_object["thread_title"], - to_language=settings.config["reddit"]["thread"]["post_lang"], - ) - - page.evaluate( - "tl_content => document.querySelector('[data-test-id=\"post-content\"] > div:nth-child(3) > div > div').textContent = tl_content", - texts_in_tl, - ) - else: - print_substep("Skipping translation...") - - postcontentpath = f"assets/temp/{id}/png/title.png" - page.locator('[data-test-id="post-content"]').screenshot(path=postcontentpath) - - if settings.config["settings"]["storymode"] : - if settings.config["settings"]["storymodemethod"] == 0: + def download(cookie_file): + with sync_playwright() as p: + print_substep("Launching Headless Browser...") + + browser = p.chromium.launch(headless=False) # #to check for chrome view + context = browser.new_context() + + + cookies = json.load(cookie_file) + + context.add_cookies(cookies) # load preference cookies + # 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)) + if page.locator('[data-testid="content-gate"]').is_visible(): + # This means the post is NSFW and requires to click the proceed button. + + print_substep("Post is NSFW. You are spicy...") + page.locator('[data-testid="content-gate"] button').click() + page.wait_for_load_state() # Wait for page to fully load + + if page.locator('[data-click-id="text"] button').is_visible(): + page.locator( + '[data-click-id="text"] button' + ).click() # Remove "Click to see nsfw" Button in Screenshot + + # translate code + + if settings.config["reddit"]["thread"]["post_lang"]: + print_substep("Translating post...") + texts_in_tl = ts.google( + reddit_object["thread_title"], + to_language=settings.config["reddit"]["thread"]["post_lang"], + ) + + page.evaluate( + "tl_content => document.querySelector('[data-test-id=\"post-content\"] > div:nth-child(3) > div > div').textContent = tl_content", + texts_in_tl, + ) + else: + print_substep("Skipping translation...") + postcontentpath = f"assets/temp/{id}/png/title.png" + page.locator('[data-test-id="post-content"]').screenshot(path=postcontentpath) + + if not settings.config["settings"]["storymodemethode"]and settings.config["settings"]["storymode"]: + try : #new change page.locator('[data-click-id="text"]').first.screenshot( path=f"assets/temp/{id}/png/story_content.png" ) except: exit - elif settings.config["settings"]["storymodemethod"] == 1: - for idx,item in enumerate(reddit_object["thread_post"]): - imagemaker(item,idx=idx,reddit_obj=reddit_object) - - - - else: - for idx, comment in enumerate(track(reddit_object["comments"], "Downloading screenshots...")): - # Stop if we have reached the screenshot_num - if idx >= screenshot_num: - break - - if page.locator('[data-testid="content-gate"]').is_visible(): - page.locator('[data-testid="content-gate"] button').click() - - page.goto(f'https://reddit.com{comment["comment_url"]}', timeout=0) - - # translate code - - if settings.config["reddit"]["thread"]["post_lang"]: - comment_tl = ts.google( - comment["comment_body"], - to_language=settings.config["reddit"]["thread"]["post_lang"], - ) - page.evaluate( - '([tl_content, tl_id]) => document.querySelector(`#t1_${tl_id} > div:nth-child(2) > div > div[data-testid="comment"] > div`).textContent = tl_content', - [comment_tl, comment["comment_id"]], - ) - try: - page.locator(f"#t1_{comment['comment_id']}").screenshot(path=f"assets/temp/{id}/png/comment_{idx}.png") - except TimeoutError: - del reddit_object["comments"] - screenshot_num += 1 - print("TimeoutError: Skipping screenshot...") - continue + if not settings.config["settings"]["storymode"] : + for idx, comment in enumerate( + track(reddit_object["comments"], "Downloading screenshots...") + ): + # Stop if we have reached the screenshot_num + if idx >= screenshot_num: + break + + if page.locator('[data-testid="content-gate"]').is_visible(): + page.locator('[data-testid="content-gate"] button').click() + + page.goto(f'https://reddit.com{comment["comment_url"]}', timeout=0) + + # translate code + + if settings.config["reddit"]["thread"]["post_lang"]: + comment_tl = ts.google( + comment["comment_body"], + to_language=settings.config["reddit"]["thread"]["post_lang"], + ) + page.evaluate( + '([tl_content, tl_id]) => document.querySelector(`#t1_${tl_id} > div:nth-child(2) > div > div[data-testid="comment"] > div`).textContent = tl_content', + [comment_tl, comment["comment_id"]], + ) + try: + page.locator(f"#t1_{comment['comment_id']}").screenshot( + path=f"assets/temp/{id}/png/comment_{idx}.png" + ) + except TimeoutError: + del reddit_object["comments"] + screenshot_num += 1 + print("TimeoutError: Skipping screenshot...") + continue print_substep("Screenshots downloaded Successfully.", style="bold green") + + theme=settings.config["settings"]["theme"] + if theme == "dark": + cookie_file = open("./video_creation/data/cookie-dark-mode.json", encoding="utf-8") + bgcolor=(33,33,36,255) + txtcolor=(240,240,240) + else: + cookie_file = open("./video_creation/data/cookie-light-mode.json", encoding="utf-8") + bgcolor=(255,255,255,255) + txtcolor=(0,0,0) + if settings.config["settings"]["storymode"] : + # if settings.config["settings"]["storymodemethode"] == 0: + # story=True + + if settings.config["settings"]["storymodemethode"] : + # 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