Some checks failed
Build and Publish Docker Images / build (server.Dockerfile, ${{ vars.IMAGE_NAME_SERVER }}) (push) Has been cancelled
Build and Publish Docker Images / build (server.Dockerfile, ${{ vars.IMAGE_NAME_WORKER }}) (push) Has been cancelled
Build and Publish Docker Images / build (worker.Dockerfile, ${{ vars.IMAGE_NAME_SERVER }}) (push) Has been cancelled
Build and Publish Docker Images / build (worker.Dockerfile, ${{ vars.IMAGE_NAME_WORKER }}) (push) Has been cancelled
Build and Publish Docker Images / setup (push) Has been cancelled
49 lines
1.8 KiB
Python
49 lines
1.8 KiB
Python
import os
|
|
from pathlib import Path
|
|
|
|
import asyncio
|
|
from celery import Celery
|
|
from celery.signals import worker_init, worker_shutdown
|
|
from celery.utils.log import get_task_logger
|
|
|
|
from auto_transcoder.model import MediaDAO, RedisManager
|
|
from auto_transcoder.services import transcode_media
|
|
|
|
redis_manager: RedisManager | None = None
|
|
logger = get_task_logger(__name__)
|
|
|
|
celery_app = Celery('auto_transcoder', config_source='auto_transcoder.celeryconfig')
|
|
|
|
@worker_init.connect
|
|
def setup_worker(**kwargs):
|
|
global redis_manager
|
|
redis_manager = RedisManager(os.environ.get("REDIS_URL", "redis://localhost:6379/0"))
|
|
|
|
@worker_shutdown.connect
|
|
def teardown_worker(**kwargs):
|
|
asyncio.run(__teardown_worker())
|
|
|
|
async def __teardown_worker():
|
|
global redis_manager
|
|
if redis_manager:
|
|
await redis_manager.close()
|
|
redis_manager = None
|
|
|
|
@celery_app.task(ignore_result=True)
|
|
def transcode_media_task(inode: int, recycle_bin_path: str | None = None):
|
|
async def process(inode: int, recycle_bin_path: str | None = None):
|
|
global redis_manager
|
|
if not redis_manager:
|
|
raise RuntimeError("RedisManager is not initialized")
|
|
async with redis_manager as manager:
|
|
media_dao = MediaDAO(manager)
|
|
media_dto = await media_dao.get_media_by_inode(inode)
|
|
if not media_dto.is_transcoded:
|
|
logger.info(f"Transcoding media with inode {inode}")
|
|
new_medias = await transcode_media(media_dto, Path.from_uri(recycle_bin_path) if recycle_bin_path else None)
|
|
if new_medias:
|
|
await asyncio.gather(
|
|
media_dao.batch_set_media(new_medias),
|
|
media_dao.delete_media(media_dto),
|
|
)
|
|
asyncio.run(process(inode, recycle_bin_path))
|