from django.http import Http404
from django.views.generic.base import View
from django.views.generic import DetailView, ListView
-from django.views.generic.detail import SingleObjectMixin
-from django.http import HttpResponse
+from django.http import HttpResponse, StreamingHttpResponse
from rest_framework import viewsets
from timeside.server.models import Experience, Item, Result, Processor
from timeside.server.models import Preset, Selection, Task, User
-from timeside.server.models import _PENDING
+from timeside.server.models import _DRAFT
from timeside.server.serializers import ExperienceSerializer, ItemSerializer
from timeside.server.serializers import PresetSerializer
from timeside.server.serializers import ProcessorSerializer
from timeside.server.serializers import TaskSerializer
from timeside.server.serializers import UserSerializer
+import timeside.core
from timeside.analyzer.core import AnalyzerResultContainer
import os
yield chunk
+def stream_from_task(task):
+ for chunk in task.run(streaming=True):
+ yield chunk
+ task.save()
+
+
class SelectionViewSet(viewsets.ModelViewSet):
model = Selection
template_name = 'timeside/item_detail.html'
-class ItemExport(DetailView, SingleObjectMixin):
+class ItemExport(DetailView):
model = Item
def get(self, request, pk, extension):
raise Http404('Unknown export file extension: %s' % extension)
encoder = TS_ENCODERS_EXT[extension]
+ mime_type = timeside.core.get_processor(encoder).mime_type()
# Get or Create Processor = encoder
processor, created = Processor.objects.get_or_create(pid=encoder)
# Get or Create Preset with processor
try:
result = Result.objects.get(item=item, preset=preset)
if not os.path.exists(result.file.path):
+ # Result exists but not file (may have been deleted)
result.delete()
return self.get(request, pk, extension)
+ # Result and file exist --> OK
return HttpResponse(stream_from_file(result.file.path),
- mimetype=result.mime_type)
+ content_type=result.mime_type)
except Result.DoesNotExist:
# Result does not exist
# the corresponding task has to be created and run
- experience = Experience()
- experience.save()
- experience.presets.add(preset)
- selection = Selection()
- selection.save()
- selection.items.add(item)
+ exp_title = "Transcode to %s" % extension
+ exp_description = ("Experience for transcoding an item to %s\n"
+ "Automatically generated by the TimeSide "
+ "application.") % mime_type
+ experience, created = Experience.objects.get_or_create(
+ title=exp_title,
+ description=exp_description)
+ if created:
+ experience.save()
+ experience.presets.add(preset)
+
+ sel_title = "Singleton selection for item %d" % item.id
+ sel_description = ("Singleton selection for item %d\n"
+ "Automatically generated by the TimeSide "
+ "application.") % item.id
+ selection, created = Selection.objects.get_or_create(
+ title=sel_title,
+ description=sel_description)
+ if created:
+ selection.save()
+ selection.items.add(item)
task = Task(experience=experience, selection=selection,
- status=_PENDING)
- task.save() # save task and run
- # TODO : find a way to stream during task ...
- return self.get(request, pk, extension)
+ status=_DRAFT)
+ task.save()
+ # Run task in streaming mode
+ response = StreamingHttpResponse()
+ response['streaming_content'] = task.run(streaming=True)
+ response['content-type'] = mime_type
+ return response