Thought I had staged it
This commit is contained in:
93
app/services/impl/third_parties/heygen/__init__.py
Normal file
93
app/services/impl/third_parties/heygen/__init__.py
Normal file
@@ -0,0 +1,93 @@
|
||||
import asyncio
|
||||
import os
|
||||
import logging
|
||||
import random
|
||||
from copy import deepcopy
|
||||
|
||||
import aiofiles
|
||||
|
||||
from httpx import AsyncClient
|
||||
|
||||
from app.dtos.video import Task, TaskStatus
|
||||
from app.services.abc import IVideoGeneratorService
|
||||
|
||||
|
||||
class Heygen(IVideoGeneratorService):
|
||||
|
||||
_GET_VIDEO_URL = 'https://api.heygen.com/v1/video_status.get'
|
||||
|
||||
def __init__(self, client: AsyncClient, token: str, avatars: dict):
|
||||
super().__init__(deepcopy(avatars))
|
||||
self._get_header = {
|
||||
'X-Api-Key': token
|
||||
}
|
||||
self._post_header = {
|
||||
'X-Api-Key': token,
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
self._http_client = client
|
||||
self._logger = logging.getLogger(__name__)
|
||||
|
||||
async def create_video(self, text: str, avatar: str):
|
||||
if not avatar:
|
||||
random_avatar_name = random.choice(list(self._avatars.keys()))
|
||||
avatar = self._avatars[random_avatar_name]["id"]
|
||||
#["id"]
|
||||
else:
|
||||
avatar = self._avatars[avatar]["id"]
|
||||
|
||||
create_video_url = f'https://api.heygen.com/v2/template/{avatar}/generate'
|
||||
data = {
|
||||
"test": False,
|
||||
"caption": False,
|
||||
"title": "video_title",
|
||||
"variables": {
|
||||
"script_here": {
|
||||
"name": "script_here",
|
||||
"type": "text",
|
||||
"properties": {
|
||||
"content": text
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
response = await self._http_client.post(create_video_url, headers=self._post_header, json=data)
|
||||
self._logger.info(response.status_code)
|
||||
self._logger.info(response.json())
|
||||
video_id = response.json()["data"]["video_id"]
|
||||
|
||||
return Task(
|
||||
result=video_id,
|
||||
status=TaskStatus.STARTED,
|
||||
)
|
||||
|
||||
|
||||
async def pool_status(self, video_id: str) -> Task:
|
||||
response = await self._http_client.get(self._GET_VIDEO_URL, headers=self._get_header, params={
|
||||
'video_id': video_id
|
||||
})
|
||||
response_data = response.json()
|
||||
|
||||
status = response_data["data"]["status"]
|
||||
error = response_data["data"]["error"]
|
||||
|
||||
if status != "completed" and error is None:
|
||||
self._logger.info(f"Status: {status}")
|
||||
return Task(
|
||||
status=TaskStatus.IN_PROGRESS,
|
||||
result=video_id
|
||||
)
|
||||
|
||||
if error:
|
||||
self._logger.error('Video creation failed.')
|
||||
return Task(
|
||||
status=TaskStatus.ERROR,
|
||||
result=response_data.get('url')
|
||||
)
|
||||
|
||||
url = response.json()['data']['video_url']
|
||||
self._logger.info(f'Successfully generated video: {url}')
|
||||
return Task(
|
||||
status=TaskStatus.COMPLETED,
|
||||
result=url
|
||||
)
|
||||
30
app/services/impl/third_parties/heygen/avatars.json
Normal file
30
app/services/impl/third_parties/heygen/avatars.json
Normal file
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"Matthew Noah": {
|
||||
"id": "5912afa7c77c47d3883af3d874047aaf",
|
||||
"avatar_gender": "male"
|
||||
},
|
||||
"Vera Cerise": {
|
||||
"id": "9e58d96a383e4568a7f1e49df549e0e4",
|
||||
"avatar_gender": "female"
|
||||
},
|
||||
"Edward Tony": {
|
||||
"id": "d2cdd9c0379a4d06ae2afb6e5039bd0c",
|
||||
"avatar_gender": "male"
|
||||
},
|
||||
"Tanya Molly": {
|
||||
"id": "045cb5dcd00042b3a1e4f3bc1c12176b",
|
||||
"avatar_gender": "female"
|
||||
},
|
||||
"Kayla Abbi": {
|
||||
"id": "1ae1e5396cc444bfad332155fdb7a934",
|
||||
"avatar_gender": "female"
|
||||
},
|
||||
"Jerome Ryan": {
|
||||
"id": "0ee6aa7cc1084063a630ae514fccaa31",
|
||||
"avatar_gender": "male"
|
||||
},
|
||||
"Tyler Christopher": {
|
||||
"id": "5772cff935844516ad7eeff21f839e43",
|
||||
"avatar_gender": "male"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user