91 lines
2.3 KiB
Python
91 lines
2.3 KiB
Python
"""
|
|
Asset endpoints - media file registration and metadata.
|
|
"""
|
|
|
|
from typing import Optional
|
|
from uuid import UUID
|
|
|
|
from fastapi import APIRouter, Depends, HTTPException, Query
|
|
|
|
from api.deps import get_asset
|
|
from api.schemas import AssetCreate, AssetResponse, AssetUpdate
|
|
|
|
router = APIRouter(prefix="/assets", tags=["assets"])
|
|
|
|
|
|
@router.post("/", response_model=AssetResponse, status_code=201)
|
|
def create_asset(data: AssetCreate):
|
|
"""
|
|
Register a media file as an asset.
|
|
|
|
The file must exist on disk. A probe task will be queued
|
|
to extract metadata asynchronously.
|
|
"""
|
|
from pathlib import Path
|
|
|
|
from mpr.media_assets.models import MediaAsset
|
|
|
|
# Validate file exists
|
|
path = Path(data.file_path)
|
|
if not path.exists():
|
|
raise HTTPException(status_code=400, detail="File not found")
|
|
|
|
# Create asset
|
|
asset = MediaAsset.objects.create(
|
|
filename=data.filename or path.name,
|
|
file_path=str(path.absolute()),
|
|
file_size=path.stat().st_size,
|
|
)
|
|
|
|
# TODO: Queue probe task via gRPC/Celery
|
|
|
|
return asset
|
|
|
|
|
|
@router.get("/", response_model=list[AssetResponse])
|
|
def list_assets(
|
|
status: Optional[str] = Query(None, description="Filter by status"),
|
|
limit: int = Query(50, ge=1, le=100),
|
|
offset: int = Query(0, ge=0),
|
|
):
|
|
"""List assets with optional filtering."""
|
|
from mpr.media_assets.models import MediaAsset
|
|
|
|
qs = MediaAsset.objects.all()
|
|
|
|
if status:
|
|
qs = qs.filter(status=status)
|
|
|
|
return list(qs[offset : offset + limit])
|
|
|
|
|
|
@router.get("/{asset_id}", response_model=AssetResponse)
|
|
def get_asset_detail(asset_id: UUID, asset=Depends(get_asset)):
|
|
"""Get asset details."""
|
|
return asset
|
|
|
|
|
|
@router.patch("/{asset_id}", response_model=AssetResponse)
|
|
def update_asset(asset_id: UUID, data: AssetUpdate, asset=Depends(get_asset)):
|
|
"""Update asset metadata (comments, tags)."""
|
|
update_fields = []
|
|
|
|
if data.comments is not None:
|
|
asset.comments = data.comments
|
|
update_fields.append("comments")
|
|
|
|
if data.tags is not None:
|
|
asset.tags = data.tags
|
|
update_fields.append("tags")
|
|
|
|
if update_fields:
|
|
asset.save(update_fields=update_fields)
|
|
|
|
return asset
|
|
|
|
|
|
@router.delete("/{asset_id}", status_code=204)
|
|
def delete_asset(asset_id: UUID, asset=Depends(get_asset)):
|
|
"""Delete an asset."""
|
|
asset.delete()
|