diff --git a/pandora/item/models.py b/pandora/item/models.py index 9ae93c78..47c68fa4 100644 --- a/pandora/item/models.py +++ b/pandora/item/models.py @@ -1613,7 +1613,7 @@ class Item(models.Model): self.add_empty_clips() return False - def srt(self, layer, language=None): + def srt(self, layer, language=None, encoder=ox.srt): def format_value(value): value = value.replace('
', '
').replace('
\n', '\n').replace('
', '\n') value = value.replace('\n\n', '
\n') @@ -1621,7 +1621,8 @@ class Item(models.Model): annotations = self.annotations.filter(layer=layer).exclude(value='') if language: annotations = annotations.filter(languages__contains=language) - return ox.srt.encode([{ + + return encoder.encode([{ 'in': a.start, 'out': a.end, 'value': format_value(a.value) diff --git a/pandora/item/urls.py b/pandora/item/urls.py index 45cc8c44..162ad2e3 100644 --- a/pandora/item/urls.py +++ b/pandora/item/urls.py @@ -31,10 +31,7 @@ urlpatterns = [ url(r'^(?P[A-Z0-9].*)/xml$', views.item_xml), #srt export - url(r'^(?P[A-Z0-9].*)/(?P.+)\.(?P.{2})\.srt$', views.srt), - - #srt export - url(r'^(?P[A-Z0-9].*)/(?P.+)\.srt$', views.srt), + url(r'^(?P[A-Z0-9].*)/(?P.+)\.(?:(?P.{2})\.)?(?Psrt|vtt)$', views.srt), #icon url(r'^(?P[A-Z0-9].*)/icon(?P\d*)\.jpg$', views.icon), diff --git a/pandora/item/views.py b/pandora/item/views.py index c3296c9b..b00ec8ff 100644 --- a/pandora/item/views.py +++ b/pandora/item/views.py @@ -968,19 +968,27 @@ def video(request, id, resolution, format, index=None, track=None): response['Cache-Control'] = 'public' return response -def srt(request, id, layer, language=None, index=None): + +_subtitle_formats = { + 'srt': ('text/x-srt', ox.srt), + 'vtt': ('text/vtt', ox.vtt), +} + + +def srt(request, id, layer, language=None, index=None, ext='srt'): item = get_object_or_404(models.Item, public_id=id) if not item.access(request.user): response = HttpResponseForbidden() else: + content_type, encoder = _subtitle_formats[ext] response = HttpResponse() if language: - filename = u"%s.%s.srt" % (item.get('title'), language) + filename = u"%s.%s.%s" % (item.get('title'), language, ext) else: - filename = u"%s.srt" % item.get('title') + filename = u"%s.%s" % (item.get('title'), ext) response['Content-Disposition'] = "attachment; filename*=UTF-8''%s" % quote(filename.encode('utf-8')) - response['Content-Type'] = 'text/x-srt' - response.write(item.srt(layer, language)) + response['Content-Type'] = content_type + response.write(item.srt(layer, language, encoder=encoder)) return response def random_annotation(request):