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))