8935196fcd
Deploy / Staging E2E Tests (push) Has been skipped
Deploy / Build Production Runtime Images (push) Has been skipped
Deploy / Deploy Production (push) Has been skipped
Deploy / Production Browser E2E (push) Has been skipped
Deploy / Deploy Staging (push) Failing after 138h4m33s
CI/CD Pipeline / Frontend Lint (push) Failing after 138h4m39s
CI/CD Pipeline / Validate Code Quality And Tests (push) Failing after 138h4m39s
109 lines
3.0 KiB
Python
109 lines
3.0 KiB
Python
"""TTS Job use cases."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import List, Optional
|
|
|
|
from packages.domain.tts_job import TTSJob
|
|
from packages.ports.tts_job_repository import TTSJobRepository
|
|
|
|
|
|
class TTSJobNotFoundError(Exception):
|
|
"""TTS 任务未找到。"""
|
|
|
|
pass
|
|
|
|
|
|
class CreateTTSJobUseCase:
|
|
"""创建 TTS 合成任务。"""
|
|
|
|
def __init__(self, repository: TTSJobRepository) -> None:
|
|
self.repository = repository
|
|
|
|
def execute(
|
|
self,
|
|
user_id: str,
|
|
input_text: str,
|
|
*,
|
|
voice_id: str = "",
|
|
voice_model: str = "",
|
|
project_id: str = "",
|
|
voice_clone_profile_id: str = "",
|
|
sample_rate: int = 22050,
|
|
format: str = "mp3",
|
|
max_retries: int = 3,
|
|
metadata: Optional[dict] = None,
|
|
) -> TTSJob:
|
|
"""创建 TTS 合成任务,状态为 pending。"""
|
|
job = TTSJob.create(
|
|
user_id=user_id,
|
|
input_text=input_text,
|
|
voice_id=voice_id,
|
|
voice_model=voice_model,
|
|
project_id=project_id,
|
|
voice_clone_profile_id=voice_clone_profile_id,
|
|
sample_rate=sample_rate,
|
|
format=format,
|
|
max_retries=max_retries,
|
|
metadata=metadata,
|
|
)
|
|
return self.repository.create(job)
|
|
|
|
|
|
class ListTTSJobsUseCase:
|
|
"""列出用户的 TTS 合成任务。"""
|
|
|
|
def __init__(self, repository: TTSJobRepository) -> None:
|
|
self.repository = repository
|
|
|
|
def execute(
|
|
self,
|
|
user_id: str,
|
|
*,
|
|
status: Optional[str] = None,
|
|
skip: int = 0,
|
|
limit: int = 50,
|
|
) -> tuple[List[TTSJob], int]:
|
|
items = self.repository.list_by_user(user_id, status=status, limit=limit, offset=skip)
|
|
total = self.repository.count_by_user(user_id, status=status)
|
|
return items, total
|
|
|
|
|
|
class GetTTSJobUseCase:
|
|
"""获取 TTS 任务详情。"""
|
|
|
|
def __init__(self, repository: TTSJobRepository) -> None:
|
|
self.repository = repository
|
|
|
|
def execute(self, job_id: str, user_id: str) -> TTSJob:
|
|
job = self.repository.get(job_id)
|
|
if job is None or job.user_id != user_id:
|
|
raise TTSJobNotFoundError(f"TTS job {job_id} not found")
|
|
return job
|
|
|
|
|
|
class GetTTSJobStatusUseCase:
|
|
"""查询 TTS 任务状态(用于轮询)。"""
|
|
|
|
def __init__(self, repository: TTSJobRepository) -> None:
|
|
self.repository = repository
|
|
|
|
def execute(self, job_id: str, user_id: str) -> TTSJob:
|
|
job = self.repository.get(job_id)
|
|
if job is None or job.user_id != user_id:
|
|
raise TTSJobNotFoundError(f"TTS job {job_id} not found")
|
|
return job
|
|
|
|
|
|
class DeleteTTSJobUseCase:
|
|
"""删除 TTS 任务(软删除)。"""
|
|
|
|
def __init__(self, repository: TTSJobRepository) -> None:
|
|
self.repository = repository
|
|
|
|
def execute(self, job_id: str, user_id: str) -> bool:
|
|
job = self.repository.get(job_id)
|
|
if job is None or job.user_id != user_id:
|
|
return False
|
|
return self.repository.delete(job_id)
|