from coverage.annotate 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 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']) 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']) def thumbnail_urls(request, size, hash): if size not in [32, 64, 256]: return Response(status=status.HTTP_404_NOT_FOUND) 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)) image.save(MEDIA_ROOT + f'/media/thumbnails/{size}/{hash_path}', quality=90) return HttpResponse(status=status.HTTP_200_OK, content_type=file.mime_type, 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('//', thumbnail_urls), path('/', media_urls), ]