sound stuff
This commit is contained in:
parent
309c47e0a7
commit
ae03b61dca
22 changed files with 487 additions and 105 deletions
|
|
@ -43,7 +43,7 @@ from django.views.decorators.http import require_http_methods
|
|||
|
||||
from . import blobs, extraction
|
||||
from .consumers import broadcast
|
||||
from .models import Analysis, Block, Blob, Clip, Extraction, Footage, Leaf, Project, Revision, Source
|
||||
from .models import Analysis, Block, Blob, Clip, Extraction, Footage, Leaf, Project, Revision, Sound, Source
|
||||
|
||||
KEY_LENGTH = 71 # "sha256:" + 64 hex
|
||||
|
||||
|
|
@ -225,6 +225,41 @@ def sources(request):
|
|||
return JsonResponse({"error": str(exc)}, status=400)
|
||||
|
||||
|
||||
def _sound_json(row):
|
||||
return {"id": str(row.id), "label": row.filename, "duration": row.duration,
|
||||
"audio": f"/blob/{row.blob_id}"}
|
||||
|
||||
|
||||
@require_http_methods(["GET", "POST"])
|
||||
def sounds(request):
|
||||
if request.method == "GET":
|
||||
return JsonResponse({"sounds": [_sound_json(row)
|
||||
for row in Sound.objects.order_by("-created")]})
|
||||
upload = request.FILES.get("file")
|
||||
if upload is None:
|
||||
return JsonResponse({"error": "upload a sound as the file field"}, status=400)
|
||||
try:
|
||||
digest, size = blobs.write_stream(upload.chunks())
|
||||
duration = extraction.probe_audio(blobs.path_for(digest))
|
||||
blob, _ = Blob.objects.get_or_create(
|
||||
digest=digest, defaults={"size": size,
|
||||
"media_type": upload.content_type or "audio/mpeg"})
|
||||
row, created = Sound.objects.get_or_create(
|
||||
blob=blob, defaults={"filename": Path(upload.name).name[:255],
|
||||
"duration": duration})
|
||||
return JsonResponse(_sound_json(row), status=201 if created else 200)
|
||||
except (ValueError, OSError) as exc:
|
||||
return JsonResponse({"error": str(exc)}, status=400)
|
||||
|
||||
|
||||
@require_http_methods(["GET"])
|
||||
def sound_detail(request, sound_id):
|
||||
try:
|
||||
return JsonResponse(_sound_json(Sound.objects.get(id=sound_id)))
|
||||
except Sound.DoesNotExist:
|
||||
return JsonResponse({"error": "no such sound"}, status=404)
|
||||
|
||||
|
||||
def _extraction_json(row):
|
||||
return {"key": row.key, "source": str(row.source_id), "state": row.state,
|
||||
"progress": row.progress, "error": row.error,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue