diff --git a/.gitignore b/.gitignore index d0582bc..ea8e861 100644 --- a/.gitignore +++ b/.gitignore @@ -12,8 +12,8 @@ build/* _working/* static/CACHE/* dss/devsettings.py ->>>>>>> release/2.13.01 dss/celery_settings.py +dss/devsettings.py dss.conf dss/debugsettings.py mysql diff --git a/api/serializers.py b/api/serializers.py index ab65b0b..2e295de 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,10 @@ 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/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..84c30c6 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,12 @@ 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 + 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.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 old mode 100755 new mode 100644 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/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/settings.py b/dss/settings.py index fdf40c1..4e17913 100755 --- a/dss/settings.py +++ b/dss/settings.py @@ -171,12 +171,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 old mode 100755 new mode 100644 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/dss/urls.py b/dss/urls.py index 78fdc2f..4297d82 100755 --- a/dss/urls.py +++ b/dss/urls.py @@ -11,8 +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'^social/', include('spa.social.urls')), - (r'^arges/', include('spa.social.urls')), + (r'^_embed/', include('spa.embedding.urls')), + (r'^__redir/blog/', include('spa.blog.urls')), + (r'^__redir/social/', include('spa.social.urls')), url(r'', include('user_sessions.urls', 'user_sessions')), url(r'^', include('api.urls')), ) diff --git a/spa/models/__pycache__/__init__.cpython-34.pyc.139657446244720 b/spa/blog/__init__.py similarity index 100% rename from spa/models/__pycache__/__init__.cpython-34.pyc.139657446244720 rename to spa/blog/__init__.py 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/embedding/views.py b/spa/embedding/views.py index fd381aa..28fb057 100755 --- a/spa/embedding/views.py +++ b/spa/embedding/views.py @@ -20,12 +20,13 @@ 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) } response = render_to_response( - 'inc/embed/mix.html', + 'embedding/mix.html', payload, context_instance=RequestContext(request) ) 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/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/__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 diff --git a/spa/models/blog.py b/spa/models/blog.py new file mode 100644 index 0000000..90543b3 --- /dev/null +++ b/spa/models/blog.py @@ -0,0 +1,26 @@ +from core.utils.url import unique_slugify +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) + 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/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 0000000..340f7f9 Binary files /dev/null and b/static/img/Jplayer.swf differ diff --git a/static/img/playerUI.light.png b/static/img/playerUI.light.png new file mode 100644 index 0000000..ef541bb Binary files /dev/null and b/static/img/playerUI.light.png differ diff --git a/static/img/playerUI.png b/static/img/playerUI.png new file mode 100644 index 0000000..d949de1 Binary files /dev/null and b/static/img/playerUI.png differ diff --git a/static/img/preimg.light.png b/static/img/preimg.light.png new file mode 100644 index 0000000..ce685d2 Binary files /dev/null and b/static/img/preimg.light.png differ diff --git a/static/img/preimg.png b/static/img/preimg.png new file mode 100644 index 0000000..0c6405c Binary files /dev/null and b/static/img/preimg.png differ diff --git a/static/js/jplayer.cleanskin.js b/static/js/jplayer.cleanskin.js new file mode 100644 index 0000000..d963d57 --- /dev/null +++ b/static/js/jplayer.cleanskin.js @@ -0,0 +1,172 @@ +(function ($) { $.fn.slider=function(options,flag){var EVENT=window.navigator.msPointerEnabled?2:"ontouchend" in document?3:1;if(window.debug&&console){console.log(EVENT)}function call(f,scope,args){if(typeof f==="function"){f.call(scope,args)}}var percentage={to:function(range,value){value=range[0]<0?value+Math.abs(range[0]):value-range[0];return(value*100)/this._length(range)},from:function(range,value){return(value*100)/this._length(range)},is:function(range,value){return((value*this._length(range))/100)+range[0]},_length:function(range){return(range[0]>range[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/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 diff --git a/templates/embedding/master.html b/templates/embedding/master.html new file mode 100644 index 0000000..1359789 --- /dev/null +++ b/templates/embedding/master.html @@ -0,0 +1,17 @@ + + + + + {{ 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 new file mode 100644 index 0000000..94ff5b3 --- /dev/null +++ b/templates/embedding/mix.html @@ -0,0 +1,30 @@ +{% extends 'embedding/master.html' %} +{% block css %} + + +{% endblock %} +{% block content %} +
+
+
+{% endblock %} + +{% block scripts %} + + + + + +{% endblock %} \ No newline at end of file