Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ export function extractMetadata(file, preset = null) {
const mediaElement = document.createElement(isVideo ? 'video' : 'audio');
// Add a listener to read the metadata once it has loaded.
mediaElement.addEventListener('loadedmetadata', () => {
metadata.duration = mediaElement.duration;
metadata.duration = Math.ceil(mediaElement.duration);
// Override preset based off video resolution
if (isVideo) {
metadata.preset =
Expand Down
13 changes: 13 additions & 0 deletions contentcuration/contentcuration/tests/viewsets/test_file.py
Original file line number Diff line number Diff line change
Expand Up @@ -390,6 +390,7 @@ def setUp(self):
"name": "le_studio",
"file_format": file_formats.MP3,
"preset": format_presets.AUDIO,
"duration": 10.123
}

def test_required_keys(self):
Expand All @@ -402,6 +403,16 @@ def test_required_keys(self):

self.assertEqual(response.status_code, 400)

def test_duration_invalid(self):
self.file["duration"] = '1.23'

self.client.force_authenticate(user=self.user)
response = self.client.post(
reverse("file-upload-url"), self.file, format="json",
)

self.assertEqual(response.status_code, 400)

def test_insufficient_storage(self):
self.file["size"] = 100000000000000

Expand All @@ -414,3 +425,5 @@ def test_upload_url(self):
self.client.force_authenticate(user=self.user)
response = self.client.post(reverse("file-upload-url"), self.file, format="json",)
self.assertEqual(response.status_code, 200)
file = models.File.objects.get(checksum=self.file["checksum"])
self.assertEqual(11, file.duration)
9 changes: 8 additions & 1 deletion contentcuration/contentcuration/viewsets/file.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import codecs
import math

from django.core.exceptions import PermissionDenied
from django.http import HttpResponseBadRequest
Expand Down Expand Up @@ -142,6 +143,12 @@ def upload_url(self, request):
reason="Must specify: size, checksum, name, file_format, and preset"
)

duration = request.data.get("duration")
if duration is not None:
if not isinstance(duration, (int, float)):
return HttpResponseBadRequest(reason="File duration must be a number")
duration = math.ceil(duration)

try:
request.user.check_space(float(size), checksum)
except PermissionDenied:
Expand All @@ -165,7 +172,7 @@ def upload_url(self, request):
file_format_id=file_format,
preset_id=preset,
uploaded_by=request.user,
duration=request.data.get("duration"),
duration=duration,
)

# Avoid using our file_on_disk attribute for checks
Expand Down