12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- from __future__ import annotations
- import os
- import numpy as np
- import validators
- from typing import TYPE_CHECKING
- if TYPE_CHECKING:
- from typing import Iterable
- def add_extension_if_not_present(file_name: str, extension: str) -> str:
- # This could conceivably be smarter about handling existing differing extensions
- if(file_name[-len(extension):] != extension):
- return file_name + extension
- else:
- return file_name
- def guarantee_existence(path: str) -> str:
- if not os.path.exists(path):
- os.makedirs(path)
- return os.path.abspath(path)
- def find_file(
- file_name: str,
- directories: Iterable[str] | None = None,
- extensions: Iterable[str] | None = None
- ) -> str:
- # Check if this is a file online first, and if so, download
- # it to a temporary directory
- if validators.url(file_name):
- import urllib.request
- from manimlib.utils.directories import get_downloads_dir
- stem, name = os.path.split(file_name)
- folder = get_downloads_dir()
- path = os.path.join(folder, name)
- urllib.request.urlretrieve(file_name, path)
- return path
- # Check if what was passed in is already a valid path to a file
- if os.path.exists(file_name):
- return file_name
- # Otherwise look in local file system
- directories = directories or [""]
- extensions = extensions or [""]
- possible_paths = (
- os.path.join(directory, file_name + extension)
- for directory in directories
- for extension in extensions
- )
- for path in possible_paths:
- if os.path.exists(path):
- return path
- raise IOError(f"{file_name} not Found")
- def get_sorted_integer_files(
- directory: str,
- min_index: float = 0,
- max_index: float = np.inf,
- remove_non_integer_files: bool = False,
- remove_indices_greater_than: float | None = None,
- extension: str | None = None,
- ) -> list[str]:
- indexed_files = []
- for file in os.listdir(directory):
- if '.' in file:
- index_str = file[:file.index('.')]
- else:
- index_str = file
- full_path = os.path.join(directory, file)
- if index_str.isdigit():
- index = int(index_str)
- if remove_indices_greater_than is not None:
- if index > remove_indices_greater_than:
- os.remove(full_path)
- continue
- if extension is not None and not file.endswith(extension):
- continue
- if index >= min_index and index < max_index:
- indexed_files.append((index, file))
- elif remove_non_integer_files:
- os.remove(full_path)
- indexed_files.sort(key=lambda p: p[0])
- return list(map(lambda p: os.path.join(directory, p[1]), indexed_files))
|