import re, os, urllib.request import tkinter as tk from datetime import datetime from bs4 import BeautifulSoup from tkinter import filedialog, simpledialog, messagebox, scrolledtext from v2cmodules.common import * def extract_version(title): # Use regular expressions to extract the version number from the title match = re.search(r'(\d+\.\d+\.\d+)', title) if match: return match.group(1) return None def fetch_ini(): global INVALID_INI try: with open(CONFIG_FILE, 'w') as file: config_url = 'https://git.rolfsvaag.no/frarol96/Video2Crops/raw/branch/main/config.ini' with urllib.request.urlopen(config_url) as config_template: config_template = config_template.read().decode("utf-8") file.write(config_template) tk.messagebox.showinfo( "Reset config file", f"Config file has been reset" ) debug('DEBUG', f"Config file was reset to default") INVALID_INI = False except: print(f"[ERROR] Unable to fetch the missing config.ini file!\nCheck directory permissions and network connectivity!") exit # Debug function def debug(state, message): if DEBUG: allowed_states = ['LOG EVENT', 'DEBUG', 'ERROR', 'INFO'] if state in allowed_states: debug_message = f"[{state}] {message}" print(f"{debug_message}") debugfile_path = os.path.join(os.getcwd(), 'debugfile.txt') with open(debugfile_path, 'a') as debugfile: log_debug_message = f"{datetime.now().strftime('%m-%d_%H:%M:%S')} | [{state}] {message}\n" debugfile.write(log_debug_message) else: raise ValueError(f"Invalid state '{state}'. Please choose from {', '.join(allowed_states)}.") def checkinifile(): global INVALID_INI # Check for the presence of sections and keys expected_sections = ['settings', 'debug'] expected_settings_keys = { 'frame_step': int, 'contrast_threshold': float, 'duplicate_threshold': int, 'save_output': bool, 'show_playback': bool, 'roi_size': int, 'window_size': str } expected_debug_keys = { 'debug_output': bool } CHECK_SECTIONS = True CHECK_KEYS = True CHECK_VALUES = False # Check for the presence of sections if CHECK_SECTIONS: for section in expected_sections: if section not in config.sections(): INVALID_INI = True print(f"Missing section: [{section}]") # Check for the presence of keys and their types in the 'settings' section if 'settings' in config.sections(): for key, expected_type in expected_settings_keys.items(): if key not in config['settings']: if CHECK_KEYS: INVALID_INI = True print(f"Missing key '{key}' in [settings] section") else: value = config.get('settings', key) if not isinstance(value, expected_type): if CHECK_VALUES: INVALID_INI = True print(f"Value of '{key}' in [settings] section is not of expected type {expected_type}") # Check for the presence of keys and their types in the 'debug' section if 'debug' in config.sections(): for key, expected_type in expected_debug_keys.items(): if key not in config['debug']: if CHECK_KEYS: INVALID_INI = True print(f"Missing key '{key}' in [debug] section") else: value = config.get('debug', key) if not isinstance(value, expected_type): if CHECK_VALUES: INVALID_INI = True print(f"Value of '{key}' in [debug] section is not of expected type {expected_type}") if INVALID_INI: fetch_ini() def write2ini(section, variable, value): config.set(section, str(variable), str(value)) # Save the changes to the INI file with open(CONFIG_FILE, 'w') as configfile: config.write(configfile) def extract_changelog(description): # Parse the HTML content using BeautifulSoup soup = BeautifulSoup(description, 'html.parser') # Find all changelog sections changelog_sections = soup.find_all('h3', id='user-content-changelog') changelogs = [] for changelog_section in changelog_sections: # Extract the changelog text as plain text changelog_text = changelog_section.find_next('ul').get_text() changelogs.append(changelog_text.strip()) # Join the changelogs into a single string changelog_str = '\n'.join(changelogs) return changelog_str if changelog_str else None def toggle_save(): if not processing: global SAVE SAVE = not SAVE write2ini('settings', 'save_output', SAVE) debug('DEBUG', f"Saving output: {SAVE}") else: messagebox.showinfo("Info", "Video2Crops is currently processing files!") def toggle_show(): if not processing: global SHOW SHOW = not SHOW write2ini('settings', 'show_playback', SHOW) debug('DEBUG', f"Displaying output: {SHOW}") else: messagebox.showinfo("Info", "Video2Crops is currently processing files!")