""" Preset endpoints - transcode configuration templates. """ from uuid import UUID from fastapi import APIRouter, Depends, HTTPException from api.deps import get_preset from api.schema import PresetCreate, PresetResponse, PresetUpdate router = APIRouter(prefix="/presets", tags=["presets"]) @router.post("/", response_model=PresetResponse, status_code=201) def create_preset(data: PresetCreate): """Create a custom preset.""" from mpr.media_assets.models import TranscodePreset preset = TranscodePreset.objects.create( name=data.name, description=data.description or "", container=data.container or "mp4", video_codec=data.video_codec or "libx264", video_bitrate=data.video_bitrate, video_crf=data.video_crf, video_preset=data.video_preset, resolution=data.resolution, framerate=data.framerate, audio_codec=data.audio_codec or "aac", audio_bitrate=data.audio_bitrate, audio_channels=data.audio_channels, audio_samplerate=data.audio_samplerate, extra_args=data.extra_args or [], is_builtin=False, ) return preset @router.get("/", response_model=list[PresetResponse]) def list_presets(include_builtin: bool = True): """List all presets.""" from mpr.media_assets.models import TranscodePreset qs = TranscodePreset.objects.all() if not include_builtin: qs = qs.filter(is_builtin=False) return list(qs) @router.get("/{preset_id}", response_model=PresetResponse) def get_preset_detail(preset_id: UUID, preset=Depends(get_preset)): """Get preset details.""" return preset @router.patch("/{preset_id}", response_model=PresetResponse) def update_preset(preset_id: UUID, data: PresetUpdate, preset=Depends(get_preset)): """Update a custom preset. Builtin presets cannot be modified.""" if preset.is_builtin: raise HTTPException(status_code=403, detail="Cannot modify builtin preset") update_fields = [] for field in [ "name", "description", "container", "video_codec", "video_bitrate", "video_crf", "video_preset", "resolution", "framerate", "audio_codec", "audio_bitrate", "audio_channels", "audio_samplerate", "extra_args", ]: value = getattr(data, field, None) if value is not None: setattr(preset, field, value) update_fields.append(field) if update_fields: preset.save(update_fields=update_fields) return preset @router.delete("/{preset_id}", status_code=204) def delete_preset(preset_id: UUID, preset=Depends(get_preset)): """Delete a custom preset. Builtin presets cannot be deleted.""" if preset.is_builtin: raise HTTPException(status_code=403, detail="Cannot delete builtin preset") preset.delete()