auto-transcoder/src/auto_transcoder/tasks.py
Ben Martin 68f6e85c78
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
Initial commit
2025-05-11 23:12:17 +01:00

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