Initial commit: InkFlow — EPUB vers livre audio local (MLX/Kokoro)
This commit is contained in:
0
backend/inkflow/store/__init__.py
Normal file
0
backend/inkflow/store/__init__.py
Normal file
63
backend/inkflow/store/artifacts.py
Normal file
63
backend/inkflow/store/artifacts.py
Normal file
@@ -0,0 +1,63 @@
|
||||
"""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"))
|
||||
Reference in New Issue
Block a user