From 4ec49ecf29042214e82499707c806f314ed09d09 Mon Sep 17 00:00:00 2001 From: Guillaume Pellerin Date: Mon, 4 Jun 2018 00:47:15 +0200 Subject: [PATCH] Fix video streaming, remove phpmyadmin by default, --- docker-compose.yml | 10 +----- etc/nginx/conf.d/default.conf | 6 ++-- .../telemeta/inc/mediaitem_video.html | 22 ++++++------- telemeta/urls.py | 1 + telemeta/views/core.py | 20 ++++++++---- telemeta/views/item.py | 32 ++++++------------- 6 files changed, 38 insertions(+), 53 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 47d88e97..ad0ed98c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -86,13 +86,5 @@ nginx: - data links: - app - - phpmyadmin -phpmyadmin: - image: nazarpc/phpmyadmin - ports: - - "1234:80" - links: - - db:mysql - environment: - - ABSOLUTE_URI=http://localhost:8000/phpmyadmin/ + diff --git a/etc/nginx/conf.d/default.conf b/etc/nginx/conf.d/default.conf index 5f79aa64..3a3cd870 100644 --- a/etc/nginx/conf.d/default.conf +++ b/etc/nginx/conf.d/default.conf @@ -33,14 +33,14 @@ server { } # phpmyadmin - location /phpmyadmin/ { - proxy_pass http://phpmyadmin/; + #location /phpmyadmin/ { + #proxy_pass http://phpmyadmin/; #proxy_set_header Host $http_host; #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #proxy_set_header X-Forwarded-Server $http_host; #proxy_redirect / /phpmyadmin/; #proxy_cookie_path / /phpmyadmin/; - } + #} location / { uwsgi_pass app:8000; diff --git a/telemeta/templates/telemeta/inc/mediaitem_video.html b/telemeta/templates/telemeta/inc/mediaitem_video.html index f124ac63..0c018eba 100644 --- a/telemeta/templates/telemeta/inc/mediaitem_video.html +++ b/telemeta/templates/telemeta/inc/mediaitem_video.html @@ -1,16 +1,16 @@ {% load telemeta_tags %} {% load i18n %} -
- -
+
+ +
{% comment %}
@@ -20,7 +20,7 @@ {% endif %} {% endfor %} - +
{% endcomment %} diff --git a/telemeta/urls.py b/telemeta/urls.py index 26b17236..3a9c704c 100644 --- a/telemeta/urls.py +++ b/telemeta/urls.py @@ -69,6 +69,7 @@ urlpatterns = patterns('', url(r'^archives/items/(?P[A-Za-z0-9._-]+)/dc/xml/$', item_view.item_detail, {'format': 'dublin_core_xml'}, name="telemeta-item-dublincore-xml"), url(r'^archives/items/download/(?P[A-Za-z0-9._-]+)\.(?P' + export_extensions + ')$', item_view.item_export, name="telemeta-item-export"), url(r'^archives/items/download/(?P[A-Za-z0-9._-]+)\.(?P' + export_extensions + ')/isAvailable$', item_view.item_export_available, name="telemeta-item-export-available"), + url(r'^archives/items/(?P[A-Za-z0-9._-]+)/stream', item_view.item_export, name="telemeta-item-stream"), url(r'^archives/items/(?P[A-Za-z0-9._-]+)/visualize/(?P[0-9a-z_]+)/(?P[0-9A-Z]+)x(?P[0-9A-Z]+)/$', item_view.item_visualize, name="telemeta-item-visualize"), url(r'^archives/items/(?P[A-Za-z0-9._-]+)/analyze/xml/$', item_view.item_analyze_xml, name="telemeta-item-analyze-xml"), diff --git a/telemeta/views/core.py b/telemeta/views/core.py index 24427e6a..8c6e4c5a 100644 --- a/telemeta/views/core.py +++ b/telemeta/views/core.py @@ -95,23 +95,29 @@ class TelemetaBaseMixin(object): cache_tmp = TelemetaCache(getattr(settings, 'FILE_UPLOAD_TEMP_DIR', os.path.join(MEDIA_ROOT, 'tmp'))) -def serve_media(filename, content_type="", buffering=True): +def serve_media(media_path, content_type="", buffering=True, streaming=False): if not settings.DEBUG: - return nginx_media_accel(filename, content_type=content_type, - buffering=buffering) + return nginx_media_accel(media_path, content_type=content_type, + buffering=buffering, streaming=streaming) else: - response = StreamingHttpResponse(stream_from_file(filename), content_type=content_type) - response['Content-Disposition'] = 'attachment; ' + 'filename=' + filename + try: + response = FileResponse(open(media_path, 'rb')) + except: + response = StreamingHttpResponse(stream_from_file(filename), content_type=content_type) + filename = os.path.basename(media_path) + if not streaming: + response['Content-Disposition'] = 'attachment; ' + 'filename=' + filename return response -def nginx_media_accel(media_path, content_type="", buffering=True): +def nginx_media_accel(media_path, content_type="", buffering=True, streaming=False): """Send a protected media file through nginx with X-Accel-Redirect""" response = HttpResponse() url = settings.MEDIA_URL + os.path.relpath(media_path, settings.MEDIA_ROOT) filename = os.path.basename(media_path) - response['Content-Disposition'] = "attachment; filename=%s" % (filename) + if not streaming: + response['Content-Disposition'] = "attachment; filename=%s" % (filename) response['Content-Type'] = content_type response['X-Accel-Redirect'] = url diff --git a/telemeta/views/item.py b/telemeta/views/item.py index 28d32a11..dfe3c18d 100644 --- a/telemeta/views/item.py +++ b/telemeta/views/item.py @@ -388,14 +388,16 @@ class ItemView(ItemBaseMixin): return (media, mime_type) - def item_export(self, request, public_id, extension, return_availability=False): + def item_export(self, request, public_id, extension=None, mime_type=None, return_availability=False): """Export a given media item in the specified format (OGG, FLAC, ...)""" item = MediaItem.objects.get(public_id=public_id) public_access = get_item_access(item, request.user) + raw = False if not extension: extension = item.file.path.split('.')[-1] + raw = True if (not public_access == 'full' or not extension in settings.TELEMETA_STREAMING_FORMATS) and \ not (request.user.has_perm('telemeta.can_play_all_items') or request.user.is_superuser): @@ -405,33 +407,17 @@ class ItemView(ItemBaseMixin): messages.error(request, title) return render(request, 'telemeta/messages.html', {'description': description}) - # FIXME: MP4 handling in TimeSide - if 'mp4' in extension: - mime_type = 'video/mp4' - video = item.file.path - response = serve_media(video, content_type=mime_type) - # response['Content-Disposition'] = 'attachment' - # TF : I don't know why empty attachment was set - # TODO: remove if useless + if raw: + media = item.file.path + response = serve_media(media, content_type=item.mimetype) if return_availability: data = json.dumps({'available': True}) return HttpResponse(data, content_type='application/json') return response - if 'webm' in extension: - mime_type = 'video/webm' - video = item.file.path - response = serve_media(video, content_type=mime_type) - # response['Content-Disposition'] = 'attachment' - # TF : I don't know why empty attachment was set, - # TODO: remove if useless - if return_availability: - data = json.dumps({'available': True}) - return HttpResponse(data, content_type='application/json') - return response (media, mime_type) = self.item_transcode(item, extension) - #media = None + if media: if return_availability: data = json.dumps({'available': True}) @@ -453,8 +439,8 @@ class ItemView(ItemBaseMixin): #patch_cache_control(response, no_cache=True, no_store=True, must_revalidate=True) return response - def item_export_available(self, request, public_id, extension): - return self.item_export(request, public_id, extension, return_availability=True) + def item_export_available(self, request, public_id, extension=None, mime_type=None): + return self.item_export(request, public_id, extension, mime_type, return_availability=True) def item_playlist(self, request, public_id, template, mimetype): try: -- 2.39.5