Skip to content

Commit

Permalink
New Random resouce added to generate and add random tracks into queue
Browse files Browse the repository at this point in the history
  • Loading branch information
radeklos committed Apr 1, 2015
1 parent 64e75fe commit 7157707
Show file tree
Hide file tree
Showing 5 changed files with 98 additions and 8 deletions.
37 changes: 35 additions & 2 deletions fm/logic/player.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
"""
fm.logic.player
===========
Classes for handling and wrapping basic player logic like queuing and
generating random content.
"""

import json

from fm.ext import config, redis
Expand All @@ -6,9 +13,21 @@


class Queue(object):

"""
A class wraps a player queue logic. Class provides simple and atomic
operations to a redis instance.
"""
@staticmethod
def add(track, user):
""" Add a track into a redis queue
Parameters
----------
track: fm.models.spotify.Track
intance of Track which is added into queue
user: fm.models.user.User
user who adds a track into queue
"""
redis.rpush(
config.PLAYLIST_REDIS_KEY,
json.dumps({
Expand All @@ -25,7 +44,21 @@ def add(track, user):


class Random(object):

"""
A class generates random content
"""
@staticmethod
def get_tracks(count=1):
""" Returns a list of random tracks from already played ones
Parameters
----------
count: int
Length of generated list of tracks. Default is 1.
Returns
-------
list
Random tracks of fm.models.spotify.Track
"""
return Track.query.order_by(func.random()).limit(count).all()
2 changes: 1 addition & 1 deletion fm/routes/player.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,12 @@
from flask.ext.via.routers.default import Pluggable
from fm.views import player


routes = [
Pluggable('/pause', player.PauseView, 'pause'),
Pluggable('/current', player.CurrentView, 'current'),
Pluggable('/history', player.HisotryView, 'history'),
Pluggable('/queue', player.QueueView, 'queue'),
Pluggable('/volume', player.VolumeView, 'volume'),
Pluggable('/mute', player.MuteView, 'mute'),
Pluggable('/random', player.RandomView, 'random'),
]
20 changes: 16 additions & 4 deletions fm/views/player.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,15 @@
from flask.views import MethodView
from fm import http
from fm.ext import config, db, redis
from fm.logic.player import Queue, Random
from fm.models.spotify import Album, Artist, PlaylistHistory, Track
from fm.session import authenticated, current_user
from fm.models.user import User
from fm.serializers.player import PlaylistSerializer, VolumeSerializer
from fm.serializers.spotify import TrackSerializer, HistorySerializer
from fm.serializers.spotify import HistorySerializer, TrackSerializer
from fm.serializers.user import UserSerializer
from fm.session import authenticated, current_user
from kim.exceptions import MappingErrors
from sqlalchemy import desc
from fm.logic.player import Queue


class PauseView(MethodView):
Expand Down Expand Up @@ -324,4 +324,16 @@ def post(self):
return http.Created(location=url_for('tracks.track', pk_or_uri=track.id))


return http.Created(location=url_for('tracks.track', pk_or_uri=track.id))
class RandomView(MethodView):

@authenticated
def post(self):
response = []
for track in Random.get_tracks(request.json['tracks']):
response.append({
'track': TrackSerializer().serialize(track),
'user': UserSerializer().serialize(current_user)
})
Queue.add(track, current_user)

return http.Created(response)
2 changes: 1 addition & 1 deletion tests/logic/test_random.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import unittest

from fm.ext import db
from fm.logic.player import Random
from tests.factories.spotify import TrackFactory
from fm.ext import db


class TestQueue(unittest.TestCase):
Expand Down
45 changes: 45 additions & 0 deletions tests/views/player/test_random.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
#!/usr/bin/env python
# encoding: utf-8

"""
tests.views.player.test_random
===============================
Unit tests for the ``fm.views.player.RandomView`` class.
"""

import httplib
import json

import pytest
from flask import url_for
from fm.ext import db
from tests.factories.spotify import TrackFactory
from tests.factories.user import UserFactory


@pytest.mark.usefixtures("authenticated")
class TestRandom(object):

@pytest.mark.usefixtures("unauthenticated")
def hit_random_endpoint_as_unauthorized_user(self):
response = self.client.post(url_for('player.random'))
assert response.status_code == httplib.FORBIDDEN

def data_without_number_of_tracks(self):
response = self.client.post(url_for('player.random'))
assert response.status_code == httplib.BAD_REQUEST

def add_some_tracks_into_queue(self):
tracks = [TrackFactory(), TrackFactory(), TrackFactory()]
users = [UserFactory(), UserFactory(), UserFactory()]

db.session.add_all(tracks + users)
db.session.commit()

response = self.client.post(
url_for('player.random'),
data=json.dumps({'tracks': 2})
)

assert response.status_code == httplib.CREATED

0 comments on commit 7157707

Please sign in to comment.