Files
InkFlow/backend/inkflow/store/artifacts.py

64 lines
2.0 KiB
Python

"""Lecture/ecriture des artefacts du pipeline dans data/<slug>/.
Chaque etape ecrit un JSON ; les etapes suivantes les relisent. C'est aussi ce
qui rend le pipeline reprenable : on peut detecter qu'un artefact existe deja.
"""
from __future__ import annotations
from pathlib import Path
from ..config import book_data_dir
from ..models import Cast, ChapterAnalysis, Pronunciation
def analysis_path(slug: str, chapter_index: int) -> Path:
return book_data_dir(slug) / "analysis" / f"ch{chapter_index:02d}.json"
def cast_path(slug: str) -> Path:
return book_data_dir(slug) / "cast.json"
def pronunciation_path(slug: str) -> Path:
return book_data_dir(slug) / "pronunciation.json"
def save_analysis(slug: str, analysis: ChapterAnalysis) -> Path:
path = analysis_path(slug, analysis.index)
path.parent.mkdir(parents=True, exist_ok=True)
path.write_text(analysis.model_dump_json(indent=2), encoding="utf-8")
return path
def load_analysis(slug: str, chapter_index: int) -> ChapterAnalysis:
path = analysis_path(slug, chapter_index)
return ChapterAnalysis.model_validate_json(path.read_text(encoding="utf-8"))
def save_cast(slug: str, cast: Cast) -> Path:
path = cast_path(slug)
path.parent.mkdir(parents=True, exist_ok=True)
path.write_text(cast.model_dump_json(indent=2), encoding="utf-8")
return path
def load_cast(slug: str) -> Cast:
path = cast_path(slug)
if not path.exists():
return Cast()
return Cast.model_validate_json(path.read_text(encoding="utf-8"))
def save_pronunciation(slug: str, pron: Pronunciation) -> Path:
path = pronunciation_path(slug)
path.parent.mkdir(parents=True, exist_ok=True)
path.write_text(pron.model_dump_json(indent=2), encoding="utf-8")
return path
def load_pronunciation(slug: str) -> Pronunciation:
path = pronunciation_path(slug)
if not path.exists():
return Pronunciation()
return Pronunciation.model_validate_json(path.read_text(encoding="utf-8"))