Fixed media serving

This commit is contained in:
Fergal Moran
2015-07-31 22:53:15 +01:00
parent 0b7d65e716
commit fa9c6ba3d7
8 changed files with 49 additions and 39 deletions

View File

@@ -14,9 +14,12 @@ RUN mkdir /files/tmp
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
RUN apt-get update && apt-get install -y sox lame libboost-program-options-dev libsox-fmt-mp3
RUN apt-get update && apt-get install -y sox lame vim \
libboost-program-options-dev libsox-fmt-mp3 postgresql-client
ADD . /code/
RUN adduser --disabled-password --gecos '' djworker
RUN chown djworker /files -R
RUN chown djworker /srv/logs -R
RUN export PATH=$PATH:/mnt/bin/

View File

@@ -3,7 +3,7 @@ import os
from django.core.exceptions import PermissionDenied, ObjectDoesNotExist
from django.core.files.base import ContentFile
from django.core.files.storage import FileSystemStorage
from django.core.files.storage import FileSystemStorage, default_storage
from django.db.models import Count
from django.http.response import HttpResponse
from rest_framework import viewsets
@@ -17,6 +17,7 @@ from rest_framework.status import HTTP_202_ACCEPTED, HTTP_401_UNAUTHORIZED, HTTP
HTTP_200_OK, HTTP_204_NO_CONTENT
from api import serializers
from core.utils import cdn
from dss import settings
from spa.tasks import create_waveform_task, upload_to_cdn_task
from spa.models.genre import Genre
@@ -120,10 +121,10 @@ class AttachedImageUploadView(views.APIView):
parser_classes = (FileUploadParser,)
def post(self, request):
if request.FILES['file'] is None or request.data.get('data') is None:
if request.data['file'] is None or request.data.get('data') is None:
return Response(status=HTTP_400_BAD_REQUEST)
file_obj = request.FILES['file']
file_obj = request.data['file']
file_hash = request.data.get('data')
try:
mix = Mix.objects.get(uid=file_hash)
@@ -133,6 +134,8 @@ class AttachedImageUploadView(views.APIView):
return Response(HTTP_202_ACCEPTED)
except ObjectDoesNotExist:
return Response(status=HTTP_404_NOT_FOUND)
except Exception, ex:
logger.exception(ex)
return Response(status=HTTP_401_UNAUTHORIZED)
@@ -186,10 +189,10 @@ class PartialMixUploadView(views.APIView):
from celery import group
(create_waveform_task.s(input_file, uid) |
group(
upload_to_cdn_task.s(filetype='mp3', uid=uid, container_name='mixes'),
upload_to_cdn_task.s(filetype='png', uid=uid, container_name='waveforms')
)
group(
upload_to_cdn_task.s(filetype='mp3', uid=uid, container_name='mixes'),
upload_to_cdn_task.s(filetype='png', uid=uid, container_name='waveforms')
)
).delay()
logger.debug("Waveform task started")

View File

@@ -1,34 +1,36 @@
import os
from azure import WindowsAzureMissingResourceError
from azure.storage import BlobService
from core.utils.url import url_path_join
from dss import settings
from dss.storagesettings import AZURE_ACCOUNT_NAME, AZURE_ACCOUNT_KEY, AZURE_CONTAINER
from libcloud.storage.types import Provider
from libcloud.storage.providers import get_driver
from dss import settings
from dss.storagesettings import AZURE_ACCOUNT_NAME, AZURE_ACCOUNT_KEY, AZURE_CONTAINER
def upload_to_azure(in_file, filetype, uid, container_name=settings.AZURE_CONTAINER):
def upload_file_to_azure(in_file, file_name, container_name=settings.AZURE_CONTAINER):
if os.path.isfile(in_file):
print "Uploading file for: %s" % in_file
file_name = "%s.%s" % (uid, filetype)
cls = get_driver(Provider.AZURE_BLOBS)
driver = cls(settings.AZURE_ACCOUNT_NAME, settings.AZURE_ACCOUNT_KEY)
container = driver.get_container(container_name)
with open(in_file, 'rb') as iterator:
obj = driver.upload_object_via_stream(
iterator=iterator,
container=container,
object_name=file_name
)
print "Uploaded"
return obj
return upload_stream_to_azure(iterator, file_name, container_name=container_name)
else:
print "infile not found"
return None
def upload_stream_to_azure(iterator, file_name, container_name=settings.AZURE_CONTAINER):
cls = get_driver(Provider.AZURE_BLOBS)
driver = cls(settings.AZURE_ACCOUNT_NAME, settings.AZURE_ACCOUNT_KEY)
container = driver.get_container(container_name)
obj = driver.upload_object_via_stream(
iterator=iterator,
container=container,
object_name=file_name
)
return obj
def set_azure_details(blob_name, download_name):
try:
blob_service = BlobService(AZURE_ACCOUNT_NAME, AZURE_ACCOUNT_KEY)

View File

@@ -29,7 +29,6 @@ DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': DATABASE_NAME,
'ADMINUSER': 'postgres',
'USER': DATABASE_USER,
'PASSWORD': DATABASE_PASSWORD,
'HOST': DATABASE_HOST,
@@ -207,7 +206,8 @@ DEFAULT_USER_TITLE = 'Just another DSS lover'
SITE_NAME = 'Deep South Sounds'
THUMBNAIL_PREFIX = '_tn/'
THUMBNAIL_STORAGE = 'storages.backends.azure_storage.AzureStorage'
# THUMBNAIL_STORAGE = 'storages.backends.azure_storage.AzureStorage'
JWT_AUTH = {
'JWT_EXPIRATION_DELTA': timedelta(seconds=900),

View File

@@ -1,6 +1,6 @@
from django.core.management.base import NoArgsCommand, BaseCommand
from django.core.management.base import BaseCommand
from core.utils.cdn import upload_to_azure
from core.utils import cdn
from spa.models import Mix
@@ -18,7 +18,7 @@ class Command(BaseCommand):
mixes = Mix.objects.filter(archive_updated=False)
for mix in mixes:
blob_name, download_name = mix.get_cdn_details()
upload_to_azure(blob_name, "mp3", download_name)
cdn.upload_file_to_azure(blob_name, "mp3", download_name)
mix.archive_updated = True
mix.save()

View File

@@ -33,11 +33,8 @@ class BaseModel(models.Model):
def get_image_url(self, image, default):
try:
if os.path.isfile(image.path):
images_root = localsettings.IMAGE_URL if hasattr(localsettings,
'IMAGE_URL') else "%s" % settings.MEDIA_URL
ret = "%s/%s/%s" % (settings.STATIC_URL, images_root, image)
ret = "{0}/{1}/{2}".format(settings.STATIC_URL, settings.MEDIA_URL, image)
return url.urlclean(ret)
except Exception, ex:
pass

View File

@@ -166,11 +166,13 @@ class Mix(BaseModel):
def get_image_url(self, size='200x200', default=''):
try:
filename = os.path.basename(self.mix_image.name)
if cdn.file_exists('{0}{1}'.format(localsettings.MIXIMAGE_URL, filename)):
return "{0}{1}".format(settings.MIXIMAGE_URL, filename)
if self.mix_image.name and self.mix_image.storage.exists(self.mix_image.name):
ret = get_thumbnail(self.mix_image, size, crop='center')
return url.urlclean("%s/%s" % (settings.MEDIA_URL, ret.name))
else:
return self.user.get_sized_avatar_image(170, 170)
except Exception, ex:
self.logger.exception(ex)
pass
return super(Mix, self).get_image_url(self.mix_image, settings.DEFAULT_TRACK_IMAGE)

View File

@@ -3,7 +3,7 @@ from celery.task import task
import os
import logging
from core.utils.cdn import upload_to_azure
from core.utils import cdn
from spa.signals import waveform_generated_signal
try:
@@ -16,6 +16,7 @@ from dss import settings
logger = logging.getLogger('dss')
@task(time_limit=3600)
def create_waveform_task(in_file, uid):
out_file = os.path.join(settings.CACHE_ROOT, 'waveforms/%s.png' % uid)
@@ -34,11 +35,13 @@ def upload_to_cdn_task(in_file, filetype, uid, container_name):
source_file = os.path.join(settings.CACHE_ROOT, '{0}/{1}.{2}'.format(container_name, uid, filetype))
logger.info("Sending {0} to azure".format(uid))
try:
upload_to_azure(source_file, filetype, uid, container_name)
file_name = "{0}.{1}".format(uid, filetype)
cdn.upload_file_to_azure(source_file, file_name, container_name)
return source_file
except Exception, ex:
logger.error("Unable to upload: {0}".format(ex.message))
@task
def update_geo_info_task(ip_address, profile_id):
try: