import logging import os import subprocess from datetime import datetime logger = logging.getLogger() def launch_url(url): if subprocess.run(['which', 'xdg-open'], capture_output=True).returncode == 0: subprocess.run(['xdg-open', url]) # linux elif subprocess.run(['which', 'open'], capture_output=True).returncode == 0: subprocess.run(['open', url]) # macos elif subprocess.run(['which', 'start'], capture_output=True).returncode == 0: subprocess.run(['start', url]) # windows - need to validate this works else: logger.error(f"No valid launchers found to launch url: {url}") def file_exists_in_mounts(filepath): """ Check if a file exists in any mounted directory. It searches for the file in common mount points like '/Volumes', '/mnt', and '/media'. Returns the path to the file in the mount if found, otherwise returns None. Example: Before: filepath = '/path/to/file.txt' After: '/Volumes/ExternalDrive/path/to/file.txt' """ def get_path_components(path): path = os.path.normpath(path) components = [] while True: path, component = os.path.split(path) if component: components.append(component) else: if path: components.append(path) break components.reverse() return components # Get path components of the directory of the file path_components = get_path_components(os.path.dirname(filepath).strip('/')) # Iterate over possible root paths - this may need to be rethought for Windows support for root in ['/Volumes', '/mnt', '/media']: if os.path.exists(root): # Iterate over mounts in the root path for mount in os.listdir(root): # Since we don't know the home directory, we iterate until we find matching parts of the path matching_components = [s for s in path_components if s in mount] for component in matching_components: possible_mount_path = os.path.join(root, mount, filepath.split(component)[-1].lstrip('/')) if os.path.exists(possible_mount_path): return possible_mount_path def get_time_elapsed(start_time=None, end_time=None): from string import Template class DeltaTemplate(Template): delimiter = "%" def strfdelta(tdelta, fmt='%H:%M:%S'): d = {"D": tdelta.days} hours, rem = divmod(tdelta.seconds, 3600) minutes, seconds = divmod(rem, 60) d["H"] = '{:02d}'.format(hours) d["M"] = '{:02d}'.format(minutes) d["S"] = '{:02d}'.format(seconds) t = DeltaTemplate(fmt) return t.substitute(**d) # calculate elapsed time elapsed_time = None if start_time: if end_time: elapsed_time = end_time - start_time else: elapsed_time = datetime.now() - start_time elapsed_time_string = strfdelta(elapsed_time) if elapsed_time else None return elapsed_time_string