101 lines
2.8 KiB
Python
101 lines
2.8 KiB
Python
"""
|
|
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()
|