import os from django.http import HttpResponse from django.urls import path from drf_yasg.utils import swagger_auto_schema from rest_framework import status from rest_framework.decorators import api_view, permission_classes, authentication_classes from rest_framework.response import Response from core.settings import MEDIA_ROOT from files.models import File @swagger_auto_schema(method='GET', auto_schema=None) @api_view(['GET']) @permission_classes([]) @authentication_classes([]) def media_urls(request, hash): try: file = File.objects.get(hash=hash) hash_path = file.file return HttpResponse(status=status.HTTP_200_OK, content_type=file.mime_type, headers={ 'X-Accel-Redirect': f'/redirect_media/{hash_path}', 'Access-Control-Allow-Origin': '*', }) # TODO Expires and Cache-Control except File.DoesNotExist: return Response(status=status.HTTP_404_NOT_FOUND) @swagger_auto_schema(method='GET', auto_schema=None) @api_view(['GET']) @permission_classes([]) @authentication_classes([]) def thumbnail_urls(request, hash): size = 200 try: file = File.objects.get(hash=hash) hash_path = file.file if not os.path.exists(MEDIA_ROOT + f'/thumbnails/{size}/{hash_path}'): from PIL import Image image = Image.open(file.file) image.thumbnail((size, size)) rgb_image = image.convert('RGB') thumb_dir = os.path.dirname(MEDIA_ROOT + f'/thumbnails/{size}/{hash_path}') if not os.path.exists(thumb_dir): os.makedirs(thumb_dir) rgb_image.save(MEDIA_ROOT + f'/thumbnails/{size}/{hash_path}', 'jpeg', quality=90) return HttpResponse(status=status.HTTP_200_OK, content_type="image/jpeg", headers={ 'X-Accel-Redirect': f'/redirect_thumbnail/{size}/{hash_path}', 'Access-Control-Allow-Origin': '*', }) # TODO Expires and Cache-Control except File.DoesNotExist: return Response(status=status.HTTP_404_NOT_FOUND) urlpatterns = [ path('thumbs/', thumbnail_urls), path('images/', media_urls), ]