diff --git a/pandora/item/urls.py b/pandora/item/urls.py index 162ad2e3..98dc5c3b 100644 --- a/pandora/item/urls.py +++ b/pandora/item/urls.py @@ -16,6 +16,7 @@ urlpatterns = [ #download url(r'^(?P[A-Z0-9].*)/download$', views.download), url(r'^(?P[A-Z0-9].*)/download/$', views.download), + url(r'^(?P[A-Z0-9].*)/download/source/(?P\d+)?$', views.download_source), url(r'^(?P[A-Z0-9].*)/download/(?P\d+)p\.(?Pwebm|ogv|mp4)$', views.download), #video diff --git a/pandora/item/views.py b/pandora/item/views.py index 2d0cc4ad..15ca45bd 100644 --- a/pandora/item/views.py +++ b/pandora/item/views.py @@ -892,6 +892,31 @@ def timeline(request, id, size, position=-1, format='jpg', mode=None): response.allow_access() return response +def download_source(request, id, part=None): + item = get_object_or_404(models.Item, public_id=id) + if not item.access(request.user): + return HttpResponseForbidden() + if part: + part = int(part) - 1 + else: + part = 0 + if not item.files.all().count() > part: + raise Http404 + f = item.files.all()[part] + if not f.data: + raise Http404 + + parts = ['%s - %s ' % (item.get('title'), settings.SITENAME), item.public_id] + parts.append('.') + parts.append(f.extension) + filename = ''.join(parts) + + path = f.data.path + content_type = mimetypes.guess_type(path)[0] + response = HttpFileResponse(path, content_type=content_type) + response['Content-Disposition'] = "attachment; filename*=UTF-8''%s" % quote(filename.encode('utf-8')) + return response + def download(request, id, resolution=None, format='webm'): item = get_object_or_404(models.Item, public_id=id) if not resolution or int(resolution) not in settings.CONFIG['video']['resolutions']: