From d53c90486e94bc38cd7bc1d8c536749159ba9006 Mon Sep 17 00:00:00 2001 From: Fergal Moran Date: Sun, 1 Nov 2015 17:02:43 +0000 Subject: [PATCH 1/8] Settings changes --- .gitignore | 4 +- dss/localsettings.initial.py | 41 --------- dss/localsettings.py | 55 +++++++++++ dss/pipelinesettings.py | 91 ------------------- dss/settings.py | 7 +- dss/storagesettings.py | 6 ++ dss/test_settings.py | 10 -- .../__init__.cpython-34.pyc.139657446244720 | 0 spa/models/blog.py | 10 ++ 9 files changed, 73 insertions(+), 151 deletions(-) delete mode 100755 dss/localsettings.initial.py create mode 100644 dss/localsettings.py delete mode 100755 dss/pipelinesettings.py create mode 100644 dss/storagesettings.py delete mode 100755 dss/test_settings.py delete mode 100644 spa/models/__pycache__/__init__.cpython-34.pyc.139657446244720 create mode 100644 spa/models/blog.py diff --git a/.gitignore b/.gitignore index b68b21f..4558bcb 100644 --- a/.gitignore +++ b/.gitignore @@ -11,9 +11,7 @@ media/* build/* _working/* static/CACHE/* -dss/localsettings.py -dss/storagesettings.py -dss/celery_settings.py +dss/devsettings.py dss.conf dss/debugsettings.py mysql diff --git a/dss/localsettings.initial.py b/dss/localsettings.initial.py deleted file mode 100755 index 0867673..0000000 --- a/dss/localsettings.initial.py +++ /dev/null @@ -1,41 +0,0 @@ -import os - -DEBUG = True -if os.name == 'posix': - DSS_TEMP_PATH = "/tmp/" - DSS_LAME_PATH = "sox" - DSS_WAVE_PATH = "wav2png" -else: - DSS_TEMP_PATH = "d:\\temp\\" - DSS_LAME_PATH = "D:\\Apps\\lame\\lame.exe" - DSS_WAVE_PATH = "d:\\Apps\\waveformgen.exe" - -DATABASE_NAME = 'deepsouthsounds' -DATABASE_USER = 'deepsouthsounds' -DATABASE_PASSWORD = '' -# DATABASE_HOST = '' - -PIPELINE_YUI_BINARY = "" -FACEBOOK_APP_SECRET = '' - -JS_SETTINGS = { - 'CHAT_HOST': "ext-test.deepsouthsounds.com:8081", - 'API_URL': "/api/v1/", - 'LIVE_STREAM_URL': "radio.deepsouthsounds.com", - 'LIVE_STREAM_PORT': "8000", - 'LIVE_STREAM_MOUNT': "mp3", - 'DEFAULT_AUDIO_VOLUME': "50", - 'SM_DEBUG_MODE': DEBUG, - 'LIVE_STREAM_INFO_URL': "radio.deepsouthsounds.com:8000/mp3" -} -""" -WAVEFORM_URL = 'http://waveforms.podnoms.com/' -IMAGE_URL = 'http://images.podnoms.com/' -STATIC_URL = 'http://static.podnoms.com/' -""" -IMAGE_URL = 'http://ext-test.deepsouthsounds.com:8000/media/' -GOOGLE_ANALYTICS_CODE = '' -SENDFILE_BACKEND = 'sendfile.backends.development' -#SENDFILE_BACKEND = 'sendfile.backends.xsendfile' -#SENDFILE_BACKEND = 'sendfile.backends.nginx' - diff --git a/dss/localsettings.py b/dss/localsettings.py new file mode 100644 index 0000000..e14e7b0 --- /dev/null +++ b/dss/localsettings.py @@ -0,0 +1,55 @@ +import os +from dss import devsettings + +DEBUG = True +DSS_TEMP_PATH = os.environ.get('DSS_TEMP_PATH', '/tmp/') +DSS_LAME_PATH = os.environ.get('DSS_LAME_PATH', '/usr/bin/sox') +DSS_WAVE_PATH = os.environ.get('DSS_WAVE_PATH', + '/home/fergalm/Dropbox/development/deepsouthsounds.com/dss.lib/wav2png/bin/Linux/wav2png') +GEOIP_PATH = os.environ.get('GEOIP_PATH', '/home/fergalm/Dropbox/Private/deepsouthsounds.com/working/geolite') + +DATABASE_PASSWORD = os.environ.get('DATABASE_PASSWORD', 'deepsouthsounds') +DATABASE_NAME = os.environ.get('DATABASE_NAME', 'deepsouthsounds') +DATABASE_USER = os.environ.get('DATABASE_USER', 'deepsouthsounds') +DATABASE_HOST = os.environ.get('DATABASE_HOST', 'localhost') + +STATIC_URL = '/assets/' +MEDIA_ROOT = os.environ.get('MEDIA_ROOT', '/files/media') +STATIC_ROOT = os.environ.get('STATIC_ROOT', '/files/static') +CACHE_ROOT = os.environ.get('CACHE_ROOT', '/files/cache') + +MEDIA_URL = os.environ.get('MEDIA_URL', 'http://deepsouthsounds.com/media/') # '{0}media/'.format(CDN_URL) + +REDIS_HOST = os.environ.get('REDIS_HOST', 'localhost') +BROKER_URL = os.environ.get('BROKER_URL', 'amqp://guest:guest@localhost:5672//') +CELERY_ACCEPT_CONTENT = ['pickle', 'msgpack', 'json'] + +SECRET_KEY = os.environ.get('SECRET_KEY', devsettings.SECRET_KEY) +LIVE_ENABLED = os.environ.get('LIVE_ENABLED', False) + +ICE_HOST = os.environ.get('ICE_HOST', 'localhost') +ICE_MOUNT = os.environ.get('ICE_MOUNT =', 'dss') +ICE_PORT = os.environ.get('ICE_PORT', 8000) + +RADIO_HOST = os.environ.get('RADIO_HOST', 'localhost') +RADIO_PORT = os.environ.get('RADIO_PORT', 8888) + +MANDRILL_API_KEY = os.environ.get('MANDRILL_API_KEY', '') + +SOCIAL_AUTH_FACEBOOK_KEY = os.environ.get('SOCIAL_AUTH_FACEBOOK_KEY', '') +SOCIAL_AUTH_FACEBOOK_SECRET = os.environ.get('SOCIAL_AUTH_FACEBOOK_SECRET', '') + +SOCIAL_AUTH_TWITTER_KEY = os.environ.get('SOCIAL_AUTH_TWITTER_KEY', '') +SOCIAL_AUTH_TWITTER_SECRET = os.environ.get('SOCIAL_AUTH_TWITTER_SECRET', '') + +SOCIAL_AUTH_GOOGLE_OAUTH_KEY = os.environ.get('SOCIAL_AUTH_GOOGLE_OAUTH_KEY', '') +SOCIAL_AUTH_GOOGLE_OAUTH_SECRET = os.environ.get('SOCIAL_AUTH_GOOGLE_OAUTH_SECRET', '') + +SOCIAL_AUTH_GOOGLE_PLUS_KEY = os.environ.get('SOCIAL_AUTH_GOOGLE_PLUS_KEY', '') +SOCIAL_AUTH_GOOGLE_PLUS_SECRET = os.environ.get('SOCIAL_AUTH_GOOGLE_PLUS_SECRET', '') + +DSS_DB_BACKUP_KEY = os.environ.get('DSS_DB_BACKUP_KEY', '') +DSS_DB_BACKUP_SECRET = os.environ.get('DSS_DB_BACKUP_SECRET', '') +DSS_DB_BACKUP_TOKEN = os.environ.get('DSS_DB_BACKUP_TOKEN', '') + +AZURE_ACCOUNT_KEY = os.environ.get('AZURE_ACCOUNT_KEY', '') diff --git a/dss/pipelinesettings.py b/dss/pipelinesettings.py deleted file mode 100755 index e107b52..0000000 --- a/dss/pipelinesettings.py +++ /dev/null @@ -1,91 +0,0 @@ -iPIPELINE_TEMPLATE_FUNC = "_.template" - -PIPELINE_COMPILERS = ( - 'pipeline.compilers.coffee.CoffeeScriptCompiler', -) - -PIPELINE_CSS = { - 'css': { - 'source_filenames': ( - 'css/dss.overrides.css', - - 'css/ace/dropzone.css', - 'css/ace/uncompressed/jquery.gritter.css', - 'css/ace/uncompressed/bootstrap.css', - 'css/ace/uncompressed/ace.css', - 'css/ace/uncompressed/ace-ie.css', - 'css/ace/uncompressed/ace-skins.css', - 'css/ace/uncompressed/font-awesome.css', - 'css/ace/uncompressed/fullcalendar.css', - 'css/ace/uncompressed/bootstrap-editable.css', - - 'css/jasny-bootstrap.css', - 'css/select2.css', - 'css/jquery.fileupload-ui.css', - 'css/peneloplay.css', - 'css/toastr.css', - 'css/dss.main.css', - ), - 'output_filename': 'css/site.css' - } -} - -PIPELINE_JS = { - 'templates': { - 'source_filenames': ( - 'js/dss/templates/*.jst', - ), - 'variant': 'datauri', - 'output_filename': 'js/t.js', - }, - - 'lib': { - 'source_filenames': ( - 'js/lib/jquery.js', - 'js/lib/jquery-ui.js', - - 'js/lib/moment.js', - 'js/lib/typeahead.js', - - 'js/lib/sm/soundmanager2.js', - - 'js/lib/underscore.js', - 'js/lib/underscore.templatehelpers.js', - 'js/lib/backbone.js', - 'js/lib/backbone.syphon.js', - 'js/lib/backbone.associations.js', - 'js/lib/backbone.marionette.js', - - 'js/lib/ace/uncompressed/bootstrap.js', - 'js/lib/ace/uncompressed/ace.js', - 'js/lib/ace/uncompressed/ace-elements.js', - 'js/lib/ace/uncompressed/select2.js', - 'js/lib/ace/uncompressed/fuelux/fuelux.wizard.js', - 'js/lib/ace/ace/elements.wizard.js', - 'js/lib/ace/uncompressed/bootstrap-wysiwyg.js', - 'js/lib/ace/uncompressed/jquery.gritter.js', - 'js/lib/ace/uncompressed/dropzone.js', - 'js/lib/ace/uncompressed/fullcalendar.js', - 'js/lib/ace/uncompressed/x-editable/bootstrap-editable.js', - 'js/lib/ace/uncompressed/x-editable/ace-editable.js', - - 'js/lib/ajaxfileupload.js', - 'js/lib/jasny.fileinput.js', - 'js/lib/jquery.fileupload.js', - 'js/lib/jquery.fileupload-process.js', - 'js/lib/jquery.fileupload-audio.js', - 'js/lib/jquery.fileupload-video.js', - 'js/lib/jquery.fileupload-validate.js', - 'js/lib/jquery.fileupload-ui.js', - 'js/lib/jquery.fileupload-image.js', - 'js/lib/jquery.iframe-transport.js', - 'js/lib/jquery.ui.widget.js', - 'js/lib/toastr.js', - - 'js/dss/*.coffee', - 'js/dss/**/*.coffee', - 'js/dss/apps/**/**/*.coffee', - ), - 'output_filename': 'js/a.js', - }, -} diff --git a/dss/settings.py b/dss/settings.py index 305ee76..fd0f69a 100755 --- a/dss/settings.py +++ b/dss/settings.py @@ -168,12 +168,7 @@ if DEBUG: REALTIME_HEADERS = { 'content-type': 'application/json' } -TEST_RUNNER = 'django_nose.NoseTestSuiteRunner' -if 'test' in sys.argv: - try: - from .test_settings import * - except ImportError: - pass + REST_FRAMEWORK = { # Use hyperlinked styles by default. diff --git a/dss/storagesettings.py b/dss/storagesettings.py new file mode 100644 index 0000000..2e30c6b --- /dev/null +++ b/dss/storagesettings.py @@ -0,0 +1,6 @@ +from dss import localsettings + +AZURE_ACCOUNT_NAME = 'dsscdn' +AZURE_CONTAINER = 'media' +AZURE_ACCOUNT_KEY = localsettings.AZURE_ACCOUNT_KEY +AZURE_ITEM_BASE_URL = 'https://dsscdn.blob.core.windows.net/' diff --git a/dss/test_settings.py b/dss/test_settings.py deleted file mode 100755 index 5fc6de2..0000000 --- a/dss/test_settings.py +++ /dev/null @@ -1,10 +0,0 @@ -DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': 'dss_test.db', - 'USER': '', - 'PASSWORD': '', - 'HOST': '', - 'PORT': '', - } -} diff --git a/spa/models/__pycache__/__init__.cpython-34.pyc.139657446244720 b/spa/models/__pycache__/__init__.cpython-34.pyc.139657446244720 deleted file mode 100644 index e69de29..0000000 diff --git a/spa/models/blog.py b/spa/models/blog.py new file mode 100644 index 0000000..641e93b --- /dev/null +++ b/spa/models/blog.py @@ -0,0 +1,10 @@ +from spa.models import BaseModel, UserProfile +from django.db import models + + +class Blog(BaseModel): + user = models.ForeignKey(UserProfile, null=True, blank=True) + date_created = models.DateField(auto_now=True) + + title = models.CharField(max_length=1024) + body = models.TextField() From fcfc1044c0284fccaaecc1e8a8474d51c6f2846c Mon Sep 17 00:00:00 2001 From: Fergal Moran Date: Sun, 1 Nov 2015 17:19:51 +0000 Subject: [PATCH 2/8] Initial scaffolding --- api/serializers.py | 5 +++++ api/urls.py | 1 + api/views.py | 6 ++++++ dss/localsettings.py | 37 +++++++++++++++---------------------- spa/migrations/0017_blog.py | 29 +++++++++++++++++++++++++++++ spa/models/__init__.py | 1 + 6 files changed, 57 insertions(+), 22 deletions(-) create mode 100644 spa/migrations/0017_blog.py diff --git a/api/serializers.py b/api/serializers.py index ab65b0b..a26cba4 100755 --- a/api/serializers.py +++ b/api/serializers.py @@ -6,6 +6,7 @@ from dss import settings from spa import models from spa.models import Activity, Message from spa.models.activity import ActivityDownload, ActivityPlay +from spa.models.blog import Blog from spa.models.genre import Genre from spa.models.notification import Notification from spa.models.show import Show @@ -509,3 +510,7 @@ class ShowSerializer(serializers.ModelSerializer): ) """ + +class BlogSerializer(serializers.ModelSerializer): + class Meta: + model = Blog diff --git a/api/urls.py b/api/urls.py index 2bee4ff..8d6c68b 100755 --- a/api/urls.py +++ b/api/urls.py @@ -23,6 +23,7 @@ router.register(r'activity', views.ActivityViewSet, base_name='activity') router.register(r'genre', views.GenreViewSet, base_name='genre') router.register(r'messages', views.MessageViewSet, base_name='messages') router.register(r'shows', views.ShowViewSet, base_name='shows') +router.register(r'blog', views.BlogViewSet, base_name='shows') class DebugView(APIView): diff --git a/api/views.py b/api/views.py index fae35c7..f8c3d4d 100755 --- a/api/views.py +++ b/api/views.py @@ -20,6 +20,7 @@ from api import serializers from dss import settings from spa import tasks from spa.models import Message +from spa.models.blog import Blog from spa.models.genre import Genre from spa.models.activity import ActivityPlay from spa.models.mix import Mix @@ -348,3 +349,8 @@ class ShowViewSet(viewsets.ModelViewSet): return Response(status=HTTP_400_BAD_REQUEST, data='Performer not found') except Exception as ex: return Response(status=HTTP_500_INTERNAL_SERVER_ERROR, data=ex) + + +class BlogViewSet(viewsets.ModelViewSet): + queryset = Blog.objects.all() + serializer_class = serializers.BlogSerializer() \ No newline at end of file diff --git a/dss/localsettings.py b/dss/localsettings.py index 798cb03..5940763 100644 --- a/dss/localsettings.py +++ b/dss/localsettings.py @@ -1,8 +1,5 @@ import os -<<<<<<< HEAD from dss import devsettings -======= ->>>>>>> master DEBUG = True DSS_TEMP_PATH = os.environ.get('DSS_TEMP_PATH', '/tmp/') @@ -17,9 +14,9 @@ DATABASE_USER = os.environ.get('DATABASE_USER', 'deepsouthsounds') DATABASE_HOST = os.environ.get('DATABASE_HOST', 'localhost') STATIC_URL = '/assets/' -MEDIA_ROOT = os.environ.get('MEDIA_ROOT', '/files/media') -STATIC_ROOT = os.environ.get('STATIC_ROOT', '/files/static') -CACHE_ROOT = os.environ.get('CACHE_ROOT', '/files/cache') +MEDIA_ROOT = os.environ.get('MEDIA_ROOT', '/home/fergalm/Dropbox/development/deepsouthsounds.com/cache/media') +STATIC_ROOT = os.environ.get('STATIC_ROOT', '/home/fergalm/Dropbox/development/deepsouthsounds.com/cache/static') +CACHE_ROOT = os.environ.get('CACHE_ROOT', '/home/fergalm/Dropbox/development/deepsouthsounds.com/cache/cache') MEDIA_URL = os.environ.get('MEDIA_URL', 'http://deepsouthsounds.com/media/') # '{0}media/'.format(CDN_URL) @@ -27,11 +24,7 @@ REDIS_HOST = os.environ.get('REDIS_HOST', 'localhost') BROKER_URL = os.environ.get('BROKER_URL', 'amqp://guest:guest@localhost:5672//') CELERY_ACCEPT_CONTENT = ['pickle', 'msgpack', 'json'] -<<<<<<< HEAD SECRET_KEY = os.environ.get('SECRET_KEY', devsettings.SECRET_KEY) -======= -SECRET_KEY = os.environ.get('SECRET_KEY', 'AAA') ->>>>>>> master LIVE_ENABLED = os.environ.get('LIVE_ENABLED', False) ICE_HOST = os.environ.get('ICE_HOST', 'localhost') @@ -43,20 +36,20 @@ RADIO_PORT = os.environ.get('RADIO_PORT', 8888) MANDRILL_API_KEY = os.environ.get('MANDRILL_API_KEY', '') -SOCIAL_AUTH_FACEBOOK_KEY = os.environ.get('SOCIAL_AUTH_FACEBOOK_KEY', '') -SOCIAL_AUTH_FACEBOOK_SECRET = os.environ.get('SOCIAL_AUTH_FACEBOOK_SECRET', '') +SOCIAL_AUTH_FACEBOOK_KEY = os.environ.get('SOCIAL_AUTH_FACEBOOK_KEY', devsettings.SOCIAL_AUTH_FACEBOOK_KEY) +SOCIAL_AUTH_FACEBOOK_SECRET = os.environ.get('SOCIAL_AUTH_FACEBOOK_SECRET', devsettings.SOCIAL_AUTH_FACEBOOK_SECRET) -SOCIAL_AUTH_TWITTER_KEY = os.environ.get('SOCIAL_AUTH_TWITTER_KEY', '') -SOCIAL_AUTH_TWITTER_SECRET = os.environ.get('SOCIAL_AUTH_TWITTER_SECRET', '') +SOCIAL_AUTH_TWITTER_KEY = os.environ.get('SOCIAL_AUTH_TWITTER_KEY', devsettings.SOCIAL_AUTH_TWITTER_KEY) +SOCIAL_AUTH_TWITTER_SECRET = os.environ.get('SOCIAL_AUTH_TWITTER_SECRET', devsettings.SOCIAL_AUTH_TWITTER_SECRET) -SOCIAL_AUTH_GOOGLE_OAUTH_KEY = os.environ.get('SOCIAL_AUTH_GOOGLE_OAUTH_KEY', '') -SOCIAL_AUTH_GOOGLE_OAUTH_SECRET = os.environ.get('SOCIAL_AUTH_GOOGLE_OAUTH_SECRET', '') +SOCIAL_AUTH_GOOGLE_OAUTH_KEY = os.environ.get('SOCIAL_AUTH_GOOGLE_OAUTH_KEY', devsettings.SOCIAL_AUTH_GOOGLE_OAUTH_KEY) +SOCIAL_AUTH_GOOGLE_OAUTH_SECRET = os.environ.get('SOCIAL_AUTH_GOOGLE_OAUTH_SECRET', devsettings.SOCIAL_AUTH_GOOGLE_OAUTH_SECRET) -SOCIAL_AUTH_GOOGLE_PLUS_KEY = os.environ.get('SOCIAL_AUTH_GOOGLE_PLUS_KEY', '') -SOCIAL_AUTH_GOOGLE_PLUS_SECRET = os.environ.get('SOCIAL_AUTH_GOOGLE_PLUS_SECRET', '') +SOCIAL_AUTH_GOOGLE_PLUS_KEY = os.environ.get('SOCIAL_AUTH_GOOGLE_PLUS_KEY', devsettings.SOCIAL_AUTH_GOOGLE_PLUS_KEY) +SOCIAL_AUTH_GOOGLE_PLUS_SECRET = os.environ.get('SOCIAL_AUTH_GOOGLE_PLUS_SECRET', devsettings.SOCIAL_AUTH_GOOGLE_PLUS_SECRET) -DSS_DB_BACKUP_KEY = os.environ.get('DSS_DB_BACKUP_KEY', '') -DSS_DB_BACKUP_SECRET = os.environ.get('DSS_DB_BACKUP_SECRET', '') -DSS_DB_BACKUP_TOKEN = os.environ.get('DSS_DB_BACKUP_TOKEN', '') +DSS_DB_BACKUP_KEY = os.environ.get('DSS_DB_BACKUP_KEY', devsettings.DSS_DB_BACKUP_KEY) +DSS_DB_BACKUP_SECRET = os.environ.get('DSS_DB_BACKUP_SECRET', devsettings.DSS_DB_BACKUP_SECRET) +DSS_DB_BACKUP_TOKEN = os.environ.get('DSS_DB_BACKUP_TOKEN', devsettings.DSS_DB_BACKUP_TOKEN) -AZURE_ACCOUNT_KEY = os.environ.get('AZURE_ACCOUNT_KEY', '') +AZURE_ACCOUNT_KEY = os.environ.get('AZURE_ACCOUNT_KEY', devsettings.AZURE_ACCOUNT_KEY) diff --git a/spa/migrations/0017_blog.py b/spa/migrations/0017_blog.py new file mode 100644 index 0000000..180474c --- /dev/null +++ b/spa/migrations/0017_blog.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('spa', '0016_remove_show_recurrence_rrule'), + ] + + operations = [ + migrations.CreateModel( + name='Blog', + fields=[ + ('id', models.AutoField(auto_created=True, verbose_name='ID', primary_key=True, serialize=False)), + ('object_created', models.DateTimeField(auto_now_add=True)), + ('object_updated', models.DateTimeField(auto_now=True, db_index=True)), + ('date_created', models.DateField(auto_now=True)), + ('title', models.CharField(max_length=1024)), + ('body', models.TextField()), + ('user', models.ForeignKey(blank=True, to='spa.UserProfile', null=True)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/spa/models/__init__.py b/spa/models/__init__.py index 338e671..221098c 100755 --- a/spa/models/__init__.py +++ b/spa/models/__init__.py @@ -16,3 +16,4 @@ from .release import Release from .playlist import Playlist from .message import Message from .show import Show +from .blog import Blog From 2c38baf18a74f73a555fd95f94e00649cff95056 Mon Sep 17 00:00:00 2001 From: Fergal Moran Date: Sun, 8 Nov 2015 19:17:18 +0000 Subject: [PATCH 3/8] Stuff --- api/serializers.py | 3 ++ api/views.py | 6 ++- core/radio/ice_scrobbler.py | 1 - dss/localsettings.py | 2 +- dss/psa.py | 1 - dss/urls.py | 3 +- spa/blog/__init__.py | 0 spa/blog/urls.py | 7 ++++ spa/blog/views.py | 58 +++++++++++++++++++++++++++ spa/migrations/0018_blog_published.py | 19 +++++++++ spa/migrations/0019_blog_slug.py | 20 +++++++++ spa/migrations/0020_blogcomment.py | 29 ++++++++++++++ spa/models/blog.py | 16 ++++++++ spa/pipeline.py | 34 ---------------- templates/blog/entry.html | 18 +++++++++ templates/blog/index.html | 19 +++++++++ 16 files changed, 197 insertions(+), 39 deletions(-) create mode 100644 spa/blog/__init__.py create mode 100755 spa/blog/urls.py create mode 100755 spa/blog/views.py create mode 100644 spa/migrations/0018_blog_published.py create mode 100644 spa/migrations/0019_blog_slug.py create mode 100644 spa/migrations/0020_blogcomment.py delete mode 100755 spa/pipeline.py create mode 100644 templates/blog/entry.html create mode 100644 templates/blog/index.html diff --git a/api/serializers.py b/api/serializers.py index a26cba4..2e295de 100755 --- a/api/serializers.py +++ b/api/serializers.py @@ -512,5 +512,8 @@ class ShowSerializer(serializers.ModelSerializer): class BlogSerializer(serializers.ModelSerializer): + slug = serializers.ReadOnlyField(required=False) + user = InlineUserProfileSerializer(read_only=True) + class Meta: model = Blog diff --git a/api/views.py b/api/views.py index f8c3d4d..84c30c6 100755 --- a/api/views.py +++ b/api/views.py @@ -353,4 +353,8 @@ class ShowViewSet(viewsets.ModelViewSet): class BlogViewSet(viewsets.ModelViewSet): queryset = Blog.objects.all() - serializer_class = serializers.BlogSerializer() \ No newline at end of file + serializer_class = serializers.BlogSerializer + lookup_field = 'slug' + + def perform_create(self, serializer): + serializer.save(user=self.request.user.userprofile) diff --git a/core/radio/ice_scrobbler.py b/core/radio/ice_scrobbler.py index 9be7b93..5e7d591 100644 --- a/core/radio/ice_scrobbler.py +++ b/core/radio/ice_scrobbler.py @@ -1,6 +1,5 @@ import requests from bs4 import BeautifulSoup -from requests.packages.urllib3.connection import ConnectionError from dss import settings diff --git a/dss/localsettings.py b/dss/localsettings.py index 5940763..e94c5de 100644 --- a/dss/localsettings.py +++ b/dss/localsettings.py @@ -18,7 +18,7 @@ MEDIA_ROOT = os.environ.get('MEDIA_ROOT', '/home/fergalm/Dropbox/development/dee STATIC_ROOT = os.environ.get('STATIC_ROOT', '/home/fergalm/Dropbox/development/deepsouthsounds.com/cache/static') CACHE_ROOT = os.environ.get('CACHE_ROOT', '/home/fergalm/Dropbox/development/deepsouthsounds.com/cache/cache') -MEDIA_URL = os.environ.get('MEDIA_URL', 'http://deepsouthsounds.com/media/') # '{0}media/'.format(CDN_URL) +MEDIA_URL = os.environ.get('MEDIA_URL', 'http://localhost/DSSMedia/') # '{0}media/'.format(CDN_URL) REDIS_HOST = os.environ.get('REDIS_HOST', 'localhost') BROKER_URL = os.environ.get('BROKER_URL', 'amqp://guest:guest@localhost:5672//') diff --git a/dss/psa.py b/dss/psa.py index dff67ff..1b72895 100755 --- a/dss/psa.py +++ b/dss/psa.py @@ -19,7 +19,6 @@ SOCIAL_AUTH_PIPELINE = ( 'social.pipeline.user.get_username', 'social.pipeline.social_auth.associate_by_email', 'social.pipeline.user.create_user', - 'spa.pipeline.save_profile', 'social.pipeline.social_auth.associate_user', 'social.pipeline.social_auth.load_extra_data', 'social.pipeline.user.user_details' diff --git a/dss/urls.py b/dss/urls.py index 78fdc2f..c6c308a 100755 --- a/dss/urls.py +++ b/dss/urls.py @@ -11,7 +11,8 @@ urlpatterns = patterns( url(r'^admin/', include(admin.site.urls)), url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')), (r'^grappelli/', include('grappelli.urls')), - (r'^social/', include('spa.social.urls')), + (r'^__redir/blog/', include('spa.blog.urls')), + (r'^__redir/social/', include('spa.social.urls')), (r'^arges/', include('spa.social.urls')), url(r'', include('user_sessions.urls', 'user_sessions')), url(r'^', include('api.urls')), diff --git a/spa/blog/__init__.py b/spa/blog/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/spa/blog/urls.py b/spa/blog/urls.py new file mode 100755 index 0000000..d4eb282 --- /dev/null +++ b/spa/blog/urls.py @@ -0,0 +1,7 @@ +from django.conf.urls import patterns, url + +urlpatterns = patterns( + '', + url(r'^blog/(?P[\w\d_.-]+)/?$', 'spa.blog.views.entry', name='blog_entry_slug'), + url(r'^$', 'spa.blog.views.index', name='blog_index') +) diff --git a/spa/blog/views.py b/spa/blog/views.py new file mode 100755 index 0000000..478f108 --- /dev/null +++ b/spa/blog/views.py @@ -0,0 +1,58 @@ +import urllib.request, urllib.error, urllib.parse +import logging + +from django.conf.urls import url +from django.contrib.sites.models import Site +from django.core.urlresolvers import resolve +from django.http import Http404 +from django.shortcuts import render_to_response +from django.template.context import RequestContext +import requests +from allauth.socialaccount.models import SocialToken +from core.utils.url import wrap_full + +from dss import settings +from spa.models import Playlist, Blog +from spa.models.mix import Mix +from spa.models.userprofile import UserProfile + +logger = logging.getLogger(__name__) + +""" + Handles callbacks from non javascript browsers +""" + + +def _getPayload(request): + return { + "app_id": settings.FACEBOOK_APP_ID, + "site_url": 'http://%s' % Site.objects.get_current().domain, + "site_image_url": '%s/img/dss-large.png' % settings.STATIC_URL, + } + + +def entry(request, slug): + try: + blog = Blog.objects.get(slug=slug) + extras = { + "content": blog.body, + } + payload = dict(list(_getPayload(request).items()) + list(extras.items())) + response = render_to_response( + 'blog/entry.html', + payload, + context_instance=RequestContext(request) + ) + return response + except Blog.DoesNotExist: + raise Http404 + except Exception as ex: + logger.error(ex) + + +def index(request): + response = render_to_response( + "blog/index.html", + _getPayload(request), + context_instance=RequestContext(request)) + return response diff --git a/spa/migrations/0018_blog_published.py b/spa/migrations/0018_blog_published.py new file mode 100644 index 0000000..af98541 --- /dev/null +++ b/spa/migrations/0018_blog_published.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('spa', '0017_blog'), + ] + + operations = [ + migrations.AddField( + model_name='blog', + name='published', + field=models.BooleanField(default=False), + ), + ] diff --git a/spa/migrations/0019_blog_slug.py b/spa/migrations/0019_blog_slug.py new file mode 100644 index 0000000..2879276 --- /dev/null +++ b/spa/migrations/0019_blog_slug.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('spa', '0018_blog_published'), + ] + + operations = [ + migrations.AddField( + model_name='blog', + name='slug', + field=models.SlugField(default='arse'), + preserve_default=False, + ), + ] diff --git a/spa/migrations/0020_blogcomment.py b/spa/migrations/0020_blogcomment.py new file mode 100644 index 0000000..bef0d7d --- /dev/null +++ b/spa/migrations/0020_blogcomment.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('spa', '0019_blog_slug'), + ] + + operations = [ + migrations.CreateModel( + name='BlogComment', + fields=[ + ('id', models.AutoField(primary_key=True, auto_created=True, serialize=False, verbose_name='ID')), + ('object_created', models.DateTimeField(auto_now_add=True)), + ('object_updated', models.DateTimeField(auto_now=True, db_index=True)), + ('comment', models.CharField(max_length=1024)), + ('date_created', models.DateField(auto_now_add=True)), + ('blog', models.ForeignKey(to='spa.Blog')), + ('user', models.ForeignKey(null=True, to='spa.UserProfile', blank=True)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/spa/models/blog.py b/spa/models/blog.py index 641e93b..90543b3 100644 --- a/spa/models/blog.py +++ b/spa/models/blog.py @@ -1,3 +1,4 @@ +from core.utils.url import unique_slugify from spa.models import BaseModel, UserProfile from django.db import models @@ -5,6 +6,21 @@ from django.db import models class Blog(BaseModel): user = models.ForeignKey(UserProfile, null=True, blank=True) date_created = models.DateField(auto_now=True) + published = models.BooleanField(default=False) + slug = models.SlugField() title = models.CharField(max_length=1024) body = models.TextField() + + def save(self, force_insert=False, force_update=False, using=None, update_fields=None): + if not self.id: + self.slug = unique_slugify(self, self.title) + + super(Blog, self).save(force_insert, force_update, using, update_fields) + + +class BlogComment(BaseModel): + blog = models.ForeignKey(Blog) + user = models.ForeignKey(UserProfile, null=True, blank=True) + comment = models.CharField(max_length=1024) + date_created = models.DateField(auto_now_add=True) diff --git a/spa/pipeline.py b/spa/pipeline.py deleted file mode 100755 index d46d4be..0000000 --- a/spa/pipeline.py +++ /dev/null @@ -1,34 +0,0 @@ -from django.core.files.base import ContentFile -from requests import request, ConnectionError - - -def save_profile(backend, user, response, is_new, *args, **kwargs): - if backend.name == 'google-oauth2': - if response.get('image') and response['image'].get('url'): - url = response['image'].get('url') - profile = user.userprofile - - try: - response = request('GET', url) - response.raise_for_status() - except ConnectionError: - pass - else: - profile.avatar_image.save('', - ContentFile(response.content), - save=False) - profile.save() - elif backend.name == 'facebook': - profile = user.userprofile - url = 'http://graph.facebook.com/{0}/picture'.format(response['id']) - try: - response = request('GET', url, params={'type': 'large'}) - response.raise_for_status() - except ConnectionError: - pass - else: - profile.avatar_image.save('', - ContentFile(response.content), - save=False - ) - profile.save() diff --git a/templates/blog/entry.html b/templates/blog/entry.html new file mode 100644 index 0000000..02556c8 --- /dev/null +++ b/templates/blog/entry.html @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + {{ content }} + + \ No newline at end of file diff --git a/templates/blog/index.html b/templates/blog/index.html new file mode 100644 index 0000000..7b259f0 --- /dev/null +++ b/templates/blog/index.html @@ -0,0 +1,19 @@ + + + + + + + + + + + + + +

Blog Index

+{{ content }} + + \ No newline at end of file From 82494e4b237a69ffcb47723b31fc2209f67e9192 Mon Sep 17 00:00:00 2001 From: Fergal Moran Date: Sun, 8 Nov 2015 19:39:19 +0000 Subject: [PATCH 4/8] Pre-merge --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index b68b21f..6cd76bb 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,7 @@ static/CACHE/* dss/localsettings.py dss/storagesettings.py dss/celery_settings.py +dss/devsettings.py dss.conf dss/debugsettings.py mysql From 1d284cf4dc369eb71ba8ac98146ba2e5804d56c8 Mon Sep 17 00:00:00 2001 From: Fergal Moran Date: Sun, 8 Nov 2015 21:06:54 +0000 Subject: [PATCH 5/8] ? --- dss/localsettings.py | 1 + 1 file changed, 1 insertion(+) diff --git a/dss/localsettings.py b/dss/localsettings.py index 16909b8..c43a3af 100644 --- a/dss/localsettings.py +++ b/dss/localsettings.py @@ -1,4 +1,5 @@ import os + from dss import devsettings DEBUG = True From 60559a55c4e644b3d3ca7149929778f444402593 Mon Sep 17 00:00:00 2001 From: Fergal Moran Date: Sun, 8 Nov 2015 21:30:32 +0000 Subject: [PATCH 6/8] Changes --- dss/urls.py | 2 +- spa/embedding/views.py | 2 +- templates/embedding/mix.html | 10 ++++++++++ 3 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 templates/embedding/mix.html diff --git a/dss/urls.py b/dss/urls.py index c6c308a..4297d82 100755 --- a/dss/urls.py +++ b/dss/urls.py @@ -11,9 +11,9 @@ urlpatterns = patterns( url(r'^admin/', include(admin.site.urls)), url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')), (r'^grappelli/', include('grappelli.urls')), + (r'^_embed/', include('spa.embedding.urls')), (r'^__redir/blog/', include('spa.blog.urls')), (r'^__redir/social/', include('spa.social.urls')), - (r'^arges/', include('spa.social.urls')), url(r'', include('user_sessions.urls', 'user_sessions')), url(r'^', include('api.urls')), ) diff --git a/spa/embedding/views.py b/spa/embedding/views.py index fd381aa..7db1edb 100755 --- a/spa/embedding/views.py +++ b/spa/embedding/views.py @@ -25,7 +25,7 @@ def mix(request, **args): "mix_url": 'http://%s%s' % (Site.objects.get_current().domain, mix_url) } response = render_to_response( - 'inc/embed/mix.html', + 'embedding/mix.html', payload, context_instance=RequestContext(request) ) diff --git a/templates/embedding/mix.html b/templates/embedding/mix.html new file mode 100644 index 0000000..566549b --- /dev/null +++ b/templates/embedding/mix.html @@ -0,0 +1,10 @@ + + + + + Title + + + + + \ No newline at end of file From 9153ec8d22c3d5cdc946f2e25db64263b45b96c5 Mon Sep 17 00:00:00 2001 From: Fergal Moran Date: Sun, 8 Nov 2015 21:56:09 +0000 Subject: [PATCH 7/8] Mods --- static/css/audio_player.css | 0 templates/embedding/master.html | 13 +++++++++++++ templates/embedding/mix.html | 14 ++++---------- 3 files changed, 17 insertions(+), 10 deletions(-) create mode 100644 static/css/audio_player.css create mode 100644 templates/embedding/master.html diff --git a/static/css/audio_player.css b/static/css/audio_player.css new file mode 100644 index 0000000..e69de29 diff --git a/templates/embedding/master.html b/templates/embedding/master.html new file mode 100644 index 0000000..1237723 --- /dev/null +++ b/templates/embedding/master.html @@ -0,0 +1,13 @@ + + + + + {{ title }} + + + +{% block content %} +{% endblock %} + + + \ No newline at end of file diff --git a/templates/embedding/mix.html b/templates/embedding/mix.html index 566549b..231660c 100644 --- a/templates/embedding/mix.html +++ b/templates/embedding/mix.html @@ -1,10 +1,4 @@ - - - - - Title - - - - - \ No newline at end of file +{% extends 'embedding/master.html' %} +{% block content %} +

Hello Sailor

+{% endblock %} \ No newline at end of file From 4a98536ddbe059c2e1917be8edc61d2f85854aa5 Mon Sep 17 00:00:00 2001 From: Fergal Moran Date: Wed, 11 Nov 2015 00:10:33 +0000 Subject: [PATCH 8/8] Embed kinda done --- spa/embedding/views.py | 1 + static/css/audio_player.css | 0 static/css/player.css | 1 + static/css/player.light.css | 1 + static/img/Jplayer.swf | Bin 0 -> 13714 bytes static/img/playerUI.light.png | Bin 0 -> 2744 bytes static/img/playerUI.png | Bin 0 -> 2709 bytes static/img/preimg.light.png | Bin 0 -> 3266 bytes static/img/preimg.png | Bin 0 -> 11780 bytes static/js/jplayer.cleanskin.js | 172 ++++++++++++++++++++++++++++++++ templates/embedding/master.html | 4 + templates/embedding/mix.html | 28 +++++- 12 files changed, 206 insertions(+), 1 deletion(-) delete mode 100644 static/css/audio_player.css create mode 100644 static/css/player.css create mode 100644 static/css/player.light.css create mode 100644 static/img/Jplayer.swf create mode 100644 static/img/playerUI.light.png create mode 100644 static/img/playerUI.png create mode 100644 static/img/preimg.light.png create mode 100644 static/img/preimg.png create mode 100644 static/js/jplayer.cleanskin.js diff --git a/spa/embedding/views.py b/spa/embedding/views.py index 7db1edb..28fb057 100755 --- a/spa/embedding/views.py +++ b/spa/embedding/views.py @@ -20,6 +20,7 @@ def mix(request, **args): payload = { "description": mix.description.replace('
', '\n'), "title": mix.title, + "theme": "light", "image_url": image, "audio_url": audio_url, "mix_url": 'http://%s%s' % (Site.objects.get_current().domain, mix_url) diff --git a/static/css/audio_player.css b/static/css/audio_player.css deleted file mode 100644 index e69de29..0000000 diff --git a/static/css/player.css b/static/css/player.css new file mode 100644 index 0000000..571f3a3 --- /dev/null +++ b/static/css/player.css @@ -0,0 +1 @@ +.webPlayer{display:inline-block;position:relative;font-family:'Segoe UI',Verdana,sans-serif;clear:both;margin-bottom:10px;line-height:1.4;font-size:13px;box-shadow:0 0 1px rgba(0,0,0,0.5);-webkit-box-shadow:0 0 1px rgba(0,0,0,0.5);text-align:center}.webPlayer a.smooth{transition:all 0.1s linear;-webkit-transition:all 0.1s linear;-moz-transition:all 0.1s linear;-o-transition:all 0.1s linear}.webPlayer *{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.webPlayer.jp-video-full>.controls{position:absolute;left:0;right:0;bottom:0;opacity:0.8;z-index:1000}.webPlayer.jp-video-full,.webPlayer.jp-video-full object,.webPlayer.jp-video-full video{position:fixed;top:0;left:0;right:0;bottom:0;display:block;z-index:999}.webPlayer.jp-video-full>.playerScreen,.webPlayer.jp-video-full>.playerScreen>.video-play{z-index:1000}.webPlayer .playerScreen{cursor:pointer}.webPlayer .playerScreen .video-play{display:block;position:absolute;z-index:990;width:100%;top:0;left:0;right:0;bottom:50px;background:url('./../img/preimg.png') no-repeat center center;opacity:0.4;background-color:rgba(0,0,0,0.4)}.webPlayer .controls{display:block;position:relative;height:40px;background:#0b0b0b;color:#969696;padding:5px 10px;z-index:996;border:1px solid #000000}.webPlayer .controls .leftblock{position:absolute;left:3px;width:50px}.webPlayer .controls .leftblock .play{display:block;margin:0 auto;width:40px;height:40px;background:url('./../img/playerUI.png') no-repeat 0 1px;opacity:0.8}.webPlayer .controls .leftblock .play:hover{opacity:1}.webPlayer .controls .leftblock .pause{display:block;margin:0 auto;width:40px;height:40px;background:url('./../img/playerUI.png') no-repeat -40px 1px;opacity:0.8}.webPlayer .controls .leftblock .pause:hover{opacity:1}.webPlayer .controls .play-progress{position:relative;display:block;margin:0 130px 0 50px;text-align:left}.webPlayer .controls .play-progress span{font-size:12px;margin-left:1px;color:#f0f0f0}.webPlayer .controls .play-progress .progressbar{display:block;height:4px;background-color:#3C3C3C;background:rgba(255,255,255,0.05);margin:2.5px 0}.webPlayer .controls .play-progress .progressbar .seekBar{position:relative;display:block;cursor:pointer;padding:1px;background:rgba(255,255,255,0.1)}.webPlayer .controls .play-progress .progressbar .seekBar .playBar{display:block;height:2px;padding:0;background:#FFFFFF}.webPlayer .controls .play-progress .progressbar .seekBar a{display:block;position:absolute;top:-2px;width:8px;height:8px;border-radius:5px;background:#ffffff;margin-left:-3px}.webPlayer .controls .play-progress .progressbar .seekBar a div{width:8px;height:8px}.webPlayer .controls .play-progress .time{display:block;position:absolute;width:50px;font-size:11px}.webPlayer .controls .play-progress .time.current{left:1px;text-align:left;color:#f0f0f0}.webPlayer .controls .play-progress .time.duration{right:0px;text-align:right}.webPlayer .controls .rightblock{position:absolute;right:10px;width:110px;top:5px}.webPlayer .controls .rightblock .volumeText{display:block;position:absolute;bottom:-12px;text-align:center;width:80px;font-size:11px}.webPlayer .controls .rightblock .volumeBar{display:block;position:absolute;height:4px;background-color:#3C3C3C;background:rgba(255,255,255,0.05);width:80px;top:19px;left:0;cursor:pointer}.webPlayer .controls .rightblock .volumeBar .currentVolume{position:relative;height:2px;padding:1px}.webPlayer .controls .rightblock .volumeBar .currentVolume .curvol{display:block;height:2px;padding:0;background:#FFFFFF}.webPlayer .controls .rightblock .volumeBar .currentVolume a{display:block;position:absolute;top:-2px;margin-left:-3px;width:8px;height:8px;border-radius:5px;background:#ffffff}.webPlayer .controls .rightblock .volumeBar .currentVolume a div{display:block;width:8px;height:8px}.webPlayer .controls .rightblock .fullScreen{display:block;float:right;width:16px;height:16px;background:url('./../img/playerUI.png') no-repeat 0 -50px;margin-top:12px;opacity:0.4}.webPlayer .controls .rightblock .fullScreen:hover{opacity:0.8}.webPlayer .controls .rightblock .fullScreenOFF{display:block;float:right;width:16px;height:16px;background:url('./../img/playerUI.png') no-repeat 0 -68px;margin-top:12px;opacity:0.4}.webPlayer .controls .rightblock .fullScreenOFF:hover{opacity:0.8}.webPlayer.audioPlayer .progress{margin-right:100px}.webPlayer.audioPlayer .rightblock{width:85px}.webPlayer.audioPlayer .rightblock .volumeText{bottom:-42px}.webPlayer.audioPlayer .fullScreen{display:none}.webPlayer.audioPlayer .fullScreenOFF{display:none} \ No newline at end of file diff --git a/static/css/player.light.css b/static/css/player.light.css new file mode 100644 index 0000000..2f5900f --- /dev/null +++ b/static/css/player.light.css @@ -0,0 +1 @@ +.webPlayer.light{display:inline-block;position:relative;font-family:'Segoe UI',Verdana,sans-serif;clear:both;margin-bottom:10px;line-height:1.4;font-size:13px;box-shadow:0 0 1px rgba(255,255,255,0.5);-webkit-box-shadow:0 0 1px rgba(255,255,255,0.5);text-align:center}.webPlayer.light a.smooth{transition:all 0.1s linear;-webkit-transition:all 0.1s linear;-moz-transition:all 0.1s linear;-o-transition:all 0.1s linear}.webPlayer.light *{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.webPlayer.light.jp-video-full>.controls{position:absolute;left:0;right:0;bottom:0;opacity:0.8;z-index:1000}.webPlayer.light.jp-video-full,.webPlayer.light.jp-video-full object,.webPlayer.light.jp-video-full video{position:fixed;top:0;left:0;right:0;bottom:0;display:block;z-index:999}.webPlayer.light.jp-video-full>.playerScreen,.webPlayer.light.jp-video-full>.playerScreen>.video-play{z-index:1000}.webPlayer.light .playerScreen{cursor:pointer}.webPlayer.light .playerScreen .video-play{display:block;position:absolute;z-index:990;width:100%;top:0;left:0;right:0;bottom:50px;background:url('./../img/preimg.light.png') no-repeat center center;opacity:0.8;background-color:rgba(255,255,255,0.1)}.webPlayer.light .controls{display:block;position:relative;height:40px;background:#FAFAFA;color:#646464;padding:5px 10px;z-index:996;border:1px solid #e6e6e6}.webPlayer.light .controls .leftblock{position:absolute;left:3px;width:50px}.webPlayer.light .controls .leftblock .play{display:block;margin:0 auto;width:40px;height:40px;background:url('./../img/playerUI.light.png') no-repeat 0 1px;opacity:0.8}.webPlayer.light .controls .leftblock .play:hover{opacity:1}.webPlayer.light .controls .leftblock .pause{display:block;margin:0 auto;width:40px;height:40px;background:url('./../img/playerUI.light.png') no-repeat -40px 1px;opacity:0.8}.webPlayer.light .controls .leftblock .pause:hover{opacity:1}.webPlayer.light .controls .play-progress{position:relative;display:block;margin:0 130px 0 50px;text-align:left}.webPlayer.light .controls .play-progress span{font-size:12px;margin-left:1px;color:#282828}.webPlayer.light .controls .play-progress .progressbar{display:block;height:4px;background-color:#3C3C3C;background:rgba(0,0,0,0.1);margin:2.5px 0}.webPlayer.light .controls .play-progress .progressbar .seekBar{position:relative;display:block;cursor:pointer;padding:1px;background:rgba(0,0,0,0.05)}.webPlayer.light .controls .play-progress .progressbar .seekBar .playBar{display:block;height:2px;padding:0;background:#191919}.webPlayer.light .controls .play-progress .progressbar .seekBar a{display:block;position:absolute;top:-2px;width:8px;height:8px;border-radius:5px;background:#191919;margin-left:-3px}.webPlayer.light .controls .play-progress .progressbar .seekBar a div{width:8px;height:8px}.webPlayer.light .controls .play-progress .time{display:block;position:absolute;width:50px;font-size:11px}.webPlayer.light .controls .play-progress .time.current{left:1px;text-align:left;color:#282828}.webPlayer.light .controls .play-progress .time.duration{right:0px;text-align:right}.webPlayer.light .controls .rightblock{position:absolute;right:10px;width:110px;top:5px}.webPlayer.light .controls .rightblock .volumeText{display:block;position:absolute;bottom:-12px;text-align:center;width:80px;font-size:11px}.webPlayer.light .controls .rightblock .volumeBar{display:block;position:absolute;height:4px;background-color:#EBEBEB;background:rgba(0,0,0,0.1);width:80px;top:19px;left:0;cursor:pointer}.webPlayer.light .controls .rightblock .volumeBar .currentVolume{position:relative;height:2px;padding:1px}.webPlayer.light .controls .rightblock .volumeBar .currentVolume .curvol{display:block;height:2px;padding:0;background:#191919}.webPlayer.light .controls .rightblock .volumeBar .currentVolume a{display:block;position:absolute;top:-2px;margin-left:-3px;width:8px;height:8px;border-radius:5px;background:#191919}.webPlayer.light .controls .rightblock .volumeBar .currentVolume a div{display:block;width:8px;height:8px}.webPlayer.light .controls .rightblock .fullScreen{display:block;float:right;width:16px;height:16px;background:url('./../img/playerUI.light.png') no-repeat 0 -50px;margin-top:12px;opacity:0.4}.webPlayer.light .controls .rightblock .fullScreen:hover{opacity:0.8}.webPlayer.light .controls .rightblock .fullScreenOFF{display:block;float:right;width:16px;height:16px;background:url('./../img/playerUI.light.png') no-repeat 0 -68px;margin-top:12px;opacity:0.4}.webPlayer.light .controls .rightblock .fullScreenOFF:hover{opacity:0.8}.webPlayer.light.audioPlayer .progress{margin-right:100px}.webPlayer.light.audioPlayer .rightblock{width:85px}.webPlayer.light.audioPlayer .rightblock .volumeText{bottom:-42px}.webPlayer.light.audioPlayer .fullScreen{display:none}.webPlayer.light.audioPlayer .fullScreenOFF{display:none} \ No newline at end of file diff --git a/static/img/Jplayer.swf b/static/img/Jplayer.swf new file mode 100644 index 0000000000000000000000000000000000000000..340f7f98d0d363bafa787e2bcc7422e15fb7f41c GIT binary patch literal 13714 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 Kh=yOW5&svT>H|gq literal 0 HcmV?d00001 diff --git a/static/img/playerUI.light.png b/static/img/playerUI.light.png new file mode 100644 index 0000000000000000000000000000000000000000..ef541bb8909098c29b803dcd22ff00a942148168 GIT binary patch literal 2744 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 literal 0 HcmV?d00001 diff --git a/static/img/playerUI.png b/static/img/playerUI.png new file mode 100644 index 0000000000000000000000000000000000000000..d949de17c6b6a18937b1f4cb6e9083d47707b832 GIT binary patch literal 2709 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 M(}+{0C%xkT0OGRGbN~PV literal 0 HcmV?d00001 diff --git a/static/img/preimg.light.png b/static/img/preimg.light.png new file mode 100644 index 0000000000000000000000000000000000000000..ce685d227e397bab92354d743dcbc15429b1e811 GIT binary patch literal 3266 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 literal 0 HcmV?d00001 diff --git a/static/img/preimg.png b/static/img/preimg.png new file mode 100644 index 0000000000000000000000000000000000000000..0c6405c68b01741329afa9e4f46f7c701685ba08 GIT binary patch literal 11780 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[1]?range[0]-range[1]:range[1]-range[0])}};function correct(proposal,slider,handle){var setup=slider.data("setup"),handles=setup.handles,settings=setup.settings,pos=setup.pos;proposal=proposal<0?0:proposal>100?100:proposal;if(settings.handles==2){if(handle.is(":first-child")){var other=parseFloat(handles[1][0].style[pos])-settings.margin;proposal=proposal>other?other:proposal}else{var other=parseFloat(handles[0][0].style[pos])+settings.margin;proposal=proposal
",slider=$(this).data("_isnS_",true),handles=[],pos,orientation,classes="",num=function(e){return !isNaN(parseFloat(e))&&isFinite(e)},split=(settings.serialization.resolution=settings.serialization.resolution||0.01).toString().split("."),res=split[0]==1?0:split[1].length;settings.start=num(settings.start)?[settings.start,0]:settings.start;$.each(settings,function(a,b){if(num(b)){settings[a]=parseFloat(b)}else{if(typeof b=="object"&&num(b[0])){b[0]=parseFloat(b[0]);if(num(b[1])){b[1]=parseFloat(b[1])}}}var e=false;b=typeof b=="undefined"?"x":b;switch(a){case"range":case"start":e=b.length!=2||!num(b[0])||!num(b[1]);break;case"handles":e=(b<1||b>2||!num(b));break;case"connect":e=b!="lower"&&b!="upper"&&typeof b!="boolean";break;case"orientation":e=(b!="vertical"&&b!="horizontal");break;case"margin":case"step":e=typeof b!="undefined"&&!num(b);break;case"serialization":e=typeof b!="object"||!num(b.resolution)||(typeof b.to=="object"&&b.to.length1?(currentClick[orientation]<(handles[0].offset()[pos]+handles[1].offset()[pos])/2?handles[0]:handles[1]):handles[0];setHandle(handle,correct(proposal,slider,handle),slider);call(settings.slide,slider);slider.change()}})}for(var i=0;i').find("input:last").val(val).change(function(a){a.stopPropagation()}))}else{if(settings.serialization.to[i]==false){handles[i].data("input",{val:function(a){if(typeof a!="undefined"){this.handle.data("noUiVal",a)}else{return this.handle.data("noUiVal")}},handle:handles[i]})}else{handles[i].data("input",settings.serialization.to[i].data("handleNR",i).val(val).change(function(){var arr=[null,null];arr[$(this).data("handleNR")]=$(this).val();slider.val(arr)}))}}}$(this).data("setup",{settings:settings,handles:handles,pos:pos,res:res})})},val:function(){if(typeof arguments[0]!=="undefined"){var val=typeof arguments[0]=="number"?[arguments[0]]:arguments[0];return this.each(function(){var setup=$(this).data("setup");for(var i=0;i\ +\ +\ +
\ +
\ +\ +\ +
\ +
\ +' + settings.name + '\ +
\ +
\ +
\ +
\ +
\ +
00:00
\ +
00:00
\ +
\ +
\ +
\ +
\ +
\ +
Volume: 50
\ +\ +\ +
'); + + if ($(this).hasClass('audioPlayer')) { + $(this).find('.fullScreen').remove(); + $(this).find('.fullScreenOFF').remove(); + } + + createPlayer(playerGUI, playerID, settings, extras); + + } + + + function createPlayer(playerGUI, mainPlayer, settings, extras) { + + // Get supplied media from MEDIA array + var supplied = new Array; + $.each(settings.media, function(key, value) { if (key != 'poster') {supplied.push(key);}}); + formats = supplied.join(', '); + + var options = { + + ready: function () { + $(this).jPlayer("setMedia", settings.media); + if (settings.autoplay != null) { + $(mainPlayer).jPlayer('play'); + } + }, + + // Extra Settings + swfPath: "/projects/clean-jplayer-skin/Jplayer.swf", + supplied: formats, + solution: 'html, flash', + volume: 0.5, + size: settings.size, + smoothPlayBar: false, + keyEnabled: true, + + // CSS Selectors + cssSelectorAncestor: playerGUI, + cssSelector: { + videoPlay: ".video-play", + play: ".play", + pause: ".pause", + seekBar: ".seekBar", + playBar: ".playBar", + volumeBar: ".currentVolume", + volumeBarValue: ".currentVolume .curvol", + currentTime: ".time.current", + duration: ".time.duration", + fullScreen: ".fullScreen", + restoreScreen: ".fullScreenOFF", + gui: ".controls", + noSolution: ".noSolution" + }, + + error: function(event) { + if(event.jPlayer.error.type === $.jPlayer.error.URL_NOT_SET) { + // Setup the media stream again and play it. + $(this).jPlayer("setMedia", settings.media).jPlayer('play'); + } + }, + + play: function() { + $(playerGUI + ' .video-play').fadeOut(); + $(this).on('click', function() { $(mainPlayer).jPlayer('pause');}); + $(this).jPlayer("pauseOthers"); + }, + + pause: function() { + $(playerGUI + ' .video-play').fadeIn(); + $(playerGUI + ' .playerScreen').unbind('click'); + }, + + volumechange: function(event) { + if(event.jPlayer.options.muted) { + $(playerGUI + ' .currentVolume').val(0); + } else { + $(playerGUI + ' .currentVolume').val(event.jPlayer.options.volume); + } + }, + + timeupdate: function(event) { + $(playerGUI + ' .seekBar').val(event.jPlayer.status.currentPercentRelative); + }, + + progress: function(event) { + $(playerGUI + ' .seekBar').val(event.jPlayer.status.currentPercentRelative); + }, + + ended: function() { + $(this).jPlayer("setMedia", settings.media); + } + + + }; + + // Create the volume slider control + $(playerGUI + ' .currentVolume').slider({ + range: [0, 1], + step: 0.01, + start : 0.5, + handles: 1, + slide: function() { + var value = $(this).val(); + $(mainPlayer).jPlayer("option", "muted", false); + $(mainPlayer).jPlayer("option", "volume", value); + $(playerGUI + ' .volumeText').html('Volume: ' + (value * 100).toFixed(0) + ''); + } + }); + + $(playerGUI + ' .seekBar').slider({ + range: [0,100], + step: 0.01, + start: 0, + handles: 1, + slide: function() { + var value = $(this).val(); + $(mainPlayer).jPlayer("playHead", value); + } + + }); + + // Initialize Player + $.extend(options, extras); + $(mainPlayer).jPlayer(options); + + } + + +})(jQuery); \ No newline at end of file diff --git a/templates/embedding/master.html b/templates/embedding/master.html index 1237723..1359789 100644 --- a/templates/embedding/master.html +++ b/templates/embedding/master.html @@ -4,10 +4,14 @@ {{ title }} + {% block css %} + {% endblock %} {% block content %} {% endblock %} +{% block scripts %} +{% endblock %} \ No newline at end of file diff --git a/templates/embedding/mix.html b/templates/embedding/mix.html index 231660c..94ff5b3 100644 --- a/templates/embedding/mix.html +++ b/templates/embedding/mix.html @@ -1,4 +1,30 @@ {% extends 'embedding/master.html' %} +{% block css %} + + +{% endblock %} {% block content %} -

Hello Sailor

+
+
+
+{% endblock %} + +{% block scripts %} + + + + + {% endblock %} \ No newline at end of file