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):