|
import aiohttp |
|
import asyncio |
|
from App.TTS.Schemas import TTSGenerateRequest, StatusRequest |
|
from pydantic import BaseModel |
|
|
|
|
|
class PodcastleAPI: |
|
def __init__(self, username, password): |
|
self.base_url = "https://podcastle.ai/api" |
|
self.username = username |
|
self.password = password |
|
self.headers = { |
|
"authority": "podcastle.ai", |
|
"accept": "*/*", |
|
"accept-language": "en-US,en;q=0.9", |
|
"cache-control": "no-cache", |
|
"content-type": "application/json", |
|
|
|
} |
|
self.session = None |
|
self.access_token = None |
|
|
|
async def create_session(self): |
|
self.session = aiohttp.ClientSession(headers=self.headers) |
|
|
|
async def close_session(self): |
|
if self.session: |
|
await self.session.close() |
|
|
|
async def signin(self): |
|
url = f"{self.base_url}/auth/signin" |
|
payload = {"username": self.username, "password": self.password} |
|
|
|
if not self.session: |
|
await self.create_session() |
|
|
|
async with self.session.post(url, json=payload) as response: |
|
response_data = await response.json() |
|
self.access_token = response_data["auth"]["accessToken"] |
|
return response_data |
|
|
|
async def make_request(self, tts_request: TTSGenerateRequest): |
|
if not self.session: |
|
await self.create_session() |
|
|
|
if not self.access_token: |
|
await self.signin() |
|
|
|
headers_with_auth = self.headers.copy() |
|
headers_with_auth["authorization"] = f"Bearer {self.access_token}" |
|
|
|
url = f"{self.base_url}/speech/text-to-speech" |
|
|
|
async with self.session.post( |
|
url, json=tts_request.dict(), headers=headers_with_auth |
|
) as response: |
|
if response.status == 401: |
|
|
|
await self.signin() |
|
|
|
headers_with_auth["authorization"] = f"Bearer {self.access_token}" |
|
async with self.session.post( |
|
url, json=tts_request.dict(), headers=headers_with_auth |
|
) as retry_response: |
|
response_text = await retry_response.json() |
|
return response_text |
|
else: |
|
response_text = await response.json() |
|
return response_text |
|
|
|
async def check_status(self, tts_status: StatusRequest): |
|
if not self.session: |
|
await self.create_session() |
|
|
|
if not self.access_token: |
|
await self.signin() |
|
|
|
headers_with_auth = self.headers.copy() |
|
headers_with_auth["authorization"] = f"Bearer {self.access_token}" |
|
|
|
url = f"{self.base_url}/speech/text-to-speech/{tts_status.requestId}" |
|
|
|
async with self.session.get(url, headers=headers_with_auth) as response: |
|
if response.status == 401: |
|
|
|
await self.signin() |
|
|
|
headers_with_auth["authorization"] = f"Bearer {self.access_token}" |
|
async with self.session.get( |
|
url, headers=headers_with_auth |
|
) as retry_response: |
|
response_text = await retry_response.json() |
|
return response_text |
|
else: |
|
response_text = await response.json() |
|
return response_text |
|
|
|
async def __aenter__(self): |
|
if not self.session: |
|
await self.create_session() |
|
return self |
|
|
|
async def __aexit__(self, exc_type, exc_value, traceback): |
|
await self.close_session() |
|
|