|
from pathlib import Path |
|
|
|
from PIL import Image as PILImage |
|
|
|
try: |
|
from trackio.utils import TRACKIO_DIR |
|
except ImportError: |
|
from utils import TRACKIO_DIR |
|
|
|
|
|
class FileStorage: |
|
@staticmethod |
|
def get_project_media_path( |
|
project: str, |
|
run: str | None = None, |
|
step: int | None = None, |
|
filename: str | None = None, |
|
) -> Path: |
|
if filename is not None and step is None: |
|
raise ValueError("filename requires step") |
|
if step is not None and run is None: |
|
raise ValueError("step requires run") |
|
|
|
path = TRACKIO_DIR / "media" / project |
|
if run: |
|
path /= run |
|
if step is not None: |
|
path /= str(step) |
|
if filename: |
|
path /= filename |
|
return path |
|
|
|
@staticmethod |
|
def init_project_media_path( |
|
project: str, run: str | None = None, step: int | None = None |
|
) -> Path: |
|
path = FileStorage.get_project_media_path(project, run, step) |
|
path.mkdir(parents=True, exist_ok=True) |
|
return path |
|
|
|
@staticmethod |
|
def save_image( |
|
image: PILImage.Image, |
|
project: str, |
|
run: str, |
|
step: int, |
|
filename: str, |
|
format: str = "PNG", |
|
) -> Path: |
|
path = FileStorage.init_project_media_path(project, run, step) / filename |
|
image.save(path, format=format) |
|
return path |
|
|
|
@staticmethod |
|
def get_image(project: str, run: str, step: int, filename: str) -> PILImage.Image: |
|
path = FileStorage.get_project_media_path(project, run, step, filename) |
|
if not path.exists(): |
|
raise FileNotFoundError(f"Image file not found: {path}") |
|
return PILImage.open(path).convert("RGBA") |
|
|