Skip to content

Commit

Permalink
redis stuff
Browse files Browse the repository at this point in the history
  • Loading branch information
tpetr committed Feb 2, 2011
1 parent bc2e001 commit 6abbfeb
Show file tree
Hide file tree
Showing 23 changed files with 3,759 additions and 23 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
*.pyc
nohup.out
*.rdb
1 change: 1 addition & 0 deletions lib/redis
3 changes: 2 additions & 1 deletion muxlist/mix/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

urlpatterns = patterns('muxlist.mix.views',
(r'^(?P<group_name>.*)/add/$', 'add_message'),
(r'^(?P<group_name>.*)/song/$', 'add_song'),
(r'^(?P<group_name>.*)/next/$', 'next_song'),
(r'^(?P<group_name>.*)/current/$', 'current_song'),
(r'^(?P<group_name>.*)/$', 'index'),
)
111 changes: 99 additions & 12 deletions muxlist/mix/views.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from django.http import HttpResponse, HttpResponseRedirect
from django.http import HttpResponse, HttpResponseRedirect, Http404
from django.shortcuts import render_to_response, get_object_or_404
from muxlist.mix.models import Group
from muxlist.music.forms import UploadForm
Expand All @@ -9,6 +9,104 @@
import stomp
import json
import time
import redis

from django.contrib.auth.models import User

from muxlist.music.signals import track_uploaded
from django.dispatch import receiver

def debug_enqueue(group_name, user, track):
conn = stomp.Connection()
conn.start()
conn.connect()
conn.subscribe(destination='/mix/%s' % group_name, ack='auto')
msg = json.dumps({'type': 'debug', 'msg': '%s enqueued %s' % (user, track)})
conn.send(msg, destination='/mix/%s' % group_name)

def send_current_song(group_name, user):
print "send current song to %s" % user
r = redis.Redis(host='localhost', port=6379, db=0)

track = Track.objects.get(id=r.get('%s_current' % group_name))
playing_user = User.objects.get(id=r.get('%s_current_user' % group_name))
print "it's %s" % track

conn = stomp.Connection()
conn.start()
conn.connect()
conn.subscribe(destination='/user/%s' % user.id, ack='auto')
msg = json.dumps({'type': 'song', 'user': playing_user.username, 'artist': track.artist.name, 'title': track.title, 'url': track.get_location().url})
conn.send(msg, destination='/user/%s' % user.id)

def send_next_song(group_name):
print "send next song"
r = redis.Redis(host='localhost', port=6379, db=0)
user_count = r.scard('%s_users' % group_name)
if user_count == 0:
print "no tracks to enqueue"
return

user_id = None
track_id = None

# loop until we find a track
while track_id == None:
user_id = r.spop('%s_users' % group_name)
print "Got user id %s, has %s queued" % (user_id, r.llen('%s_%s_queue' % (group_name, user_id)))
if user_id == None:
return # no more users, we're kaput

track_id = r.lpop('%s_%s_queue' % (group_name, user_id))
print "Got track id %s" % track_id
if track_id != None:
r.sadd('%s_users' % group_name, user_id)

r.set('%s_current' % group_name, track_id)
r.set('%s_current_user' % group_name, user_id)
r.expire('%s_current' % group_name, 30)

user = User.objects.get(id=user_id)
track = Track.objects.get(id=track_id)
print "Going with %s from %s" % (track, user)

conn = stomp.Connection()
conn.start()
conn.connect()
conn.subscribe(destination='/mix/%s' % group_name, ack='auto')
msg = json.dumps({'type': 'song', 'user': user.username, 'artist': track.artist.name, 'title': track.title, 'url': track.get_location().url})
conn.send(msg, destination='/mix/%s' % group_name)

@receiver(track_uploaded, sender=None)
def tu(sender, **kwargs):
group_name = 'test'
user = kwargs['user']
track = kwargs['track']

r = redis.Redis(host='localhost', port=6379, db=0)
r.rpush('%s_%s_queue' % (group_name, user.id), track.id)
debug_enqueue(group_name, user, track)
r.sadd('%s_users' % group_name, user.id)
if (not r.exists('%s_current' % group_name)):
send_next_song(group_name)

def next_song(request, group_name):
r = redis.Redis(host='localhost', port=6379, db=0)
if r.ttl('%s_current' % group_name) > 0:
print "ttl = %s" % r.ttl('%s_current' % group_name)
raise Http404()

send_next_song(group_name)

return HttpResponse()

def current_song(request, group_name):
r = redis.Redis(host='localhost', port=6379, db=0)
send_current_song(group_name, request.user)
return HttpResponse()

def force_next(request, group_name):
pass

def index(request, group_name):
group = get_object_or_404(Group, name=group_name)
Expand All @@ -26,14 +124,3 @@ def add_message(request, group_name):
msg = json.dumps({"type": "chat", "user": request.user.username,"message":request.REQUEST.get('msg', '(blank)'), "time":time.strftime("%H:%S-%d/%m/%Y")})
conn.send(msg, destination='/mix/%s' % group_name)
return HttpResponse('ok')

def add_song(request, group_name):
conn = stomp.Connection()
conn.start()
conn.connect()
conn.subscribe(destination='/mix/%s' % group_name, ack='auto')
track = Track.objects.get(id=request.REQUEST['id'])
msg = json.dumps({'type': 'song', 'user': request.user.username, 'artist': track.artist.name, 'title': track.title, 'url': track.get_location().url})
conn.send(msg, destination='/mix/%s' % group_name)
#r.lpush('mix_%s' % group_name, json.dumps([track.id, str(track.__unicode__())]))
return HttpResponse('ok')
3 changes: 3 additions & 0 deletions muxlist/music/signals.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import django.dispatch

track_uploaded = django.dispatch.Signal(providing_args=['track', 'group', 'user'])
14 changes: 10 additions & 4 deletions muxlist/music/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
from muxlist.music.decorators import move_rawdata_to_files
from muxlist.music.models import TrackLocation

from muxlist.music.signals import track_uploaded

@login_required
def index(request):
profile = request.user.get_profile()
Expand All @@ -25,7 +27,8 @@ def begin_slice(request):
try:
tl = TrackLocation.objects.get(begin_hash=begin_hash, size=request.META['HTTP_X_FILE_SIZE'])
if request.user in tl.track.uploaded_by.all():
return HttpResponse(tl.track.id)
track_uploaded.send(sender=None, track=tl.track, group=form.cleaned_data['group'], user=request.user)
return HttpResponse()
except TrackLocation.DoesNotExist:
return HttpResponse(status=404)
request.session['begin_hash'] = begin_hash
Expand All @@ -46,7 +49,8 @@ def middle_slice(request):
try:
tl = TrackLocation.objects.get(begin_hash=begin_hash, middle_hash=middle_hash, size=request.META['HTTP_X_FILE_SIZE'])
if request.user in tl.track.uploaded_by.all():
return HttpResponse(tl.track.id)
track_uploaded.send(sender=None, track=tl.track, group=form.cleaned_data['group'], user=request.user)
return HttpResponse()
except TrackLocation.DoesNotExist:
return HttpResponse(status=404)
request.session['middle_hash'] = middle_hash
Expand All @@ -67,7 +71,8 @@ def end_slice(request):
print "size = %s, begin_hash=%s, middle_hash = %s, end_hash = %s" % (request.META['HTTP_X_FILE_SIZE'], begin_hash, middle_hash, end_hash)
try:
tl = TrackLocation.objects.get(begin_hash=begin_hash, middle_hash=middle_hash, end_hash=end_hash, size=request.META['HTTP_X_FILE_SIZE'])
return HttpResponse(tl.track.id)
track_uploaded.send(sender=None, track=tl.track, group=form.cleaned_data['group'], user=request.user)
return HttpResponse()
except TrackLocation.DoesNotExist: pass
return HttpResponse(status=404)
else:
Expand All @@ -81,7 +86,8 @@ def upload(request):
form = UploadForm(data=request.POST, files=request.FILES)
if form.is_valid():
track = form.save(user=request.user)
return HttpResponse(track.id)
track_uploaded.send(sender=None, track=track, group=form.cleaned_data['group'], user=request.user)
return HttpResponse()
else:
return HttpResponse("invalid: %s" % (', '.join(form.errors)), status=500)
else:
Expand Down
5 changes: 5 additions & 0 deletions src/andymccurdy-redis-py-7112f5b/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
*.pyc
redis.egg-info
build/
dist/
dump.rdb
19 changes: 19 additions & 0 deletions src/andymccurdy-redis-py-7112f5b/CHANGES
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
* 2.2.2
* Fixed a bug in ZREVRANK where retriving the rank of a value not in
the zset would raise an error.
* Fixed a bug in Connection.send where the errno import was getting
overwritten by a local variable.
* Fixed a bug in SLAVEOF when promoting an existing slave to a master.
* Reverted change of download URL back to redis-VERSION.tar.gz. 2.2.1's
change of this actually broke Pypi for Pip installs. Sorry!
* 2.2.1
* Changed archive name to redis-py-VERSION.tar.gz to not conflict
with the Redis server archive.
* 2.2.0
* Implemented SLAVEOF
* Implemented CONFIG as config_get and config_set
* Implemented GETBIT/SETBIT
* Implemented BRPOPLPUSH
* Implemented STRLEN
* Implemented PERSIST
* Implemented SETRANGE
6 changes: 6 additions & 0 deletions src/andymccurdy-redis-py-7112f5b/INSTALL
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@

Please use
python setup.py install

and report errors to Andy McCurdy ([email protected])

22 changes: 22 additions & 0 deletions src/andymccurdy-redis-py-7112f5b/LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
Copyright (c) 2010 Andy McCurdy

Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
4 changes: 4 additions & 0 deletions src/andymccurdy-redis-py-7112f5b/MANIFEST.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
include CHANGES
include INSTALL
include LICENSE
include README.md
Loading

0 comments on commit 6abbfeb

Please sign in to comment.