mirror of
https://github.com/fergalmoran/dss.api.git
synced 2025-12-28 12:18:52 +00:00
Fixed media serving
This commit is contained in:
@@ -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/
|
||||
17
api/views.py
17
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")
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user