import shutil import os from PIL import Image import cv2 import numpy as np import yt_dlp import re from pathlib import Path # Dimensions of the entire page hT = 1100 wT = 1035 # Dimensions of a panel hP = hT/3 wP = wT/4 # Defining types types = { '1': { "width" : wP, "height" : hP, "aspect_ratio" : wP/hP }, '2': { "width" : wP, "height" : 2*hP, "aspect_ratio" : wP/(2*hP) }, '3': { "width" : 3*wP, "height" : hP, "aspect_ratio" : (3*wP)/hP }, '4': { "width" : 2*wP, "height" : hP, "aspect_ratio" : (2*wP)/hP }, '5':{ "width" : 4*wP, "height" : 3*hP, "aspect_ratio" : (4*wP)/(3*hP) }, '6':{ "width" : 4*wP, "height" : hP, "aspect_ratio" : (4*wP)/hP }, '7':{ "width" : 4*wP, "height" : 2*hP, "aspect_ratio" : (4*wP)/(2*hP) }, '8':{ "width" : 2*wP, "height" : 2*hP, "aspect_ratio" : (2*wP)/(2*hP) } } def get_panel_type(left,right,top,bottom): w = right - left h = bottom - top aspect_ratio = w/h if 0 <= aspect_ratio < 0.7: return '2' elif 0.7 <= aspect_ratio < 1.4: return '1' elif 1.4 <= aspect_ratio < 2: return '4' else: return '3' def copy_and_rename_file(source_file, destination_folder, new_file_name): destination_path = os.path.join(destination_folder, new_file_name) try: # Check if the file already exists in the destination folder if os.path.exists(destination_path): os.remove(destination_path) # Remove the existing file # Copy the file from source to destination shutil.copy(source_file, destination_path) os.rename(destination_path, os.path.join(destination_folder, new_file_name)) print(f"File '{source_file}' copied and renamed to '{new_file_name}' in '{destination_folder}'.") except FileNotFoundError: print("File not found.") except PermissionError: print("Permission denied.") except Exception as e: print(f"An error occurred: {e}") def get_black_bar_coordinates(img_path): image = cv2.imread(img_path) image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) _, thresh = cv2.threshold(image_gray, 1, 255, cv2.THRESH_BINARY) contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # Find the largest contour with four corners largest_contour = np.array([]) max_area = 0 for cntrs in contours: area = cv2.contourArea(cntrs) peri = cv2.arcLength(cntrs, True) approx = cv2.approxPolyDP(cntrs, 0.02 * peri, True) if area > max_area: largest_contour = approx max_area = area # Extract bounding box x, y, w, h = cv2.boundingRect(largest_contour) print("Black bar coords : ", x,y,w,h) return x, y, w, h def crop_image(img_path, left, right, top, bottom): img = Image.open(img_path) width, height = img.size # Reposition if it exceeds image boundary new_left, new_right, new_top, new_bottom = left, right, top, bottom if(left < 0): new_left = left + (-left) new_right = right + -(left) if(right > width): new_left = left - (right-width) new_right = right - (right-width) if(top < 0): new_top = top + -(top) new_bottom = bottom + -(top) if(bottom > height): new_top = top - (bottom-height) new_bottom = bottom - (bottom-height) # Crop the image wrt the 4 coordinates box = (new_left, new_top, new_right, new_bottom) img2 = img.crop(box) # Save the cropped image img2.save(img_path) return (new_left, new_right, new_top, new_bottom) # img2.show() # return img2 def convert_to_css_pixel(x,y,crop_coord): #Scaling the image to CSS pixels. DPI : (1px/1 css px) left, right, top, bottom = crop_coord panel_type = get_panel_type(left, right, top, bottom) panel_width = types[panel_type]['width'] image_width = right-left dpi_width = image_width/panel_width panel_height = types[panel_type]['height'] # print("Panel Height:",panel_height) image_height = bottom-top dpi_height = image_height/panel_height # print("DPI Height",dpi_height) x /= dpi_width y /= dpi_height return x,y def clear_folder(folder_path): """Delete all contents of a folder but not the folder itself.""" for filename in os.listdir(folder_path): file_path = os.path.join(folder_path, filename) try: if os.path.isfile(file_path) or os.path.islink(file_path): os.unlink(file_path) elif os.path.isdir(file_path): shutil.rmtree(file_path) except Exception as e: print(f'Failed to delete {file_path}. Reason: {e}') def delete_other_folders(base_path, exclude_folder): """Delete all folders within base_path except the exclude_folder.""" for folder_name in os.listdir(base_path): folder_path = os.path.join(base_path, folder_name) if os.path.isdir(folder_path) and folder_name != exclude_folder: try: shutil.rmtree(folder_path) except Exception as e: print(f'Failed to delete {folder_path}. Reason: {e}') def cleanup(): frames_path = 'frames' final_folder_name = 'final' final_folder_path = os.path.join(frames_path, final_folder_name) uploaded_video_path = os.path.join('video', 'uploaded.mp4') os.makedirs(final_folder_path, exist_ok=True) # If folders does not exist, create: os.makedirs('video', exist_ok=True) # Clear the contents of the final folder if os.path.exists(final_folder_path): clear_folder(final_folder_path) print("Deleting previous frames") else: print(f'The folder {final_folder_path} does not exist.') # Delete all other folders in the frames folder delete_other_folders(frames_path, final_folder_name) # Deleting the uploaded.mp4 if os.path.exists(uploaded_video_path): os.remove(uploaded_video_path) print(f"Previous video deleted successfully") print("Deleted previous sub folders") def download_video(url): print("Downloading video") ydl_opts = { 'outtmpl': f'video/uploaded.%(ext)s', 'format': f'bestvideo[ext=mp4][height<=1080]+bestaudio[ext=m4a]/best[ext=mp4][height<=1080]/best[height<=1080]' } with yt_dlp.YoutubeDL(ydl_opts) as ydl: ydl.download([url]) def convert_to_embed(url): # Regular expression to capture the video ID from the YouTube URL video_id_pattern = re.compile(r"(?:v=|\/)([0-9A-Za-z_-]{11}).*") match = video_id_pattern.search(url) if not match: return None # Return None if no video ID is found video_id = match.group(1) embed_url = f"https://www.youtube.com/embed/{video_id}" return embed_url def copy_template(): src_path = Path('output_template') dest_path = Path('output') if not src_path.is_dir(): print("Source folder does not exist.") return if not dest_path.exists(): dest_path.mkdir(parents=True) # Copy contents of src_folder to dest_folder, overwriting if necessary for item in src_path.iterdir(): s = src_path / item.name d = dest_path / item.name if s.is_dir(): shutil.copytree(s, d, dirs_exist_ok=True) else: shutil.copy2(s, d) # copy2 preserves metadata