diff --git a/Dockerfile b/Dockerfile index 9179e4b..b5db2af 100644 --- a/Dockerfile +++ b/Dockerfile @@ -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/ \ No newline at end of file diff --git a/api/views.py b/api/views.py index 63cdc3f..81823a0 100755 --- a/api/views.py +++ b/api/views.py @@ -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") diff --git a/core/utils/cdn.py b/core/utils/cdn.py index 55da434..5852349 100755 --- a/core/utils/cdn.py +++ b/core/utils/cdn.py @@ -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) diff --git a/dss/settings.py b/dss/settings.py index 6dc6b9d..f651b78 100755 --- a/dss/settings.py +++ b/dss/settings.py @@ -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), diff --git a/spa/management/commands/azure_util.py b/spa/management/commands/azure_util.py index d86f2b2..40a22ab 100755 --- a/spa/management/commands/azure_util.py +++ b/spa/management/commands/azure_util.py @@ -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() diff --git a/spa/models/basemodel.py b/spa/models/basemodel.py index dcf593e..0f9fc00 100755 --- a/spa/models/basemodel.py +++ b/spa/models/basemodel.py @@ -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 diff --git a/spa/models/mix.py b/spa/models/mix.py index 59a3add..f5a6201 100755 --- a/spa/models/mix.py +++ b/spa/models/mix.py @@ -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) diff --git a/spa/tasks.py b/spa/tasks.py index ad1fffb..633aed0 100755 --- a/spa/tasks.py +++ b/spa/tasks.py @@ -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: