Skip to content

Commit

Permalink
Genres and users added into queue metadata endpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
radeklos committed Jun 15, 2015
1 parent cdef09d commit 37d6581
Show file tree
Hide file tree
Showing 7 changed files with 141 additions and 27 deletions.
17 changes: 17 additions & 0 deletions README.rst
Expand Up @@ -370,6 +370,23 @@ album and artist nested objects.
...
]
``/player/queue/meta``
~~~~~~~~~~~~~~~~~~

Returns meta data about a queue. List of genres and users, total number of tracks in queue and total play time.

.. code-block::
{
"genres": {
"Genre 868788b0-b131-4594-8c83-3676b1ea5fb9": 3,
"Genre b3cb7a50-89c8-4280-a26f-0fdce30aa785": 3
},
"play_time": 19902,
"total": 3,
"users": {"user": 3}
}
``POST``
^^^^^^^^
Expand Down
19 changes: 12 additions & 7 deletions fm/logic/player.py
Expand Up @@ -50,6 +50,16 @@ def add(uri, user):
'user': user
}))

@staticmethod
def get_queue(offset=0, limit=None):
if limit is None:
limit = Queue.length()

tracks = redis.lrange(
config.PLAYLIST_REDIS_KEY, offset, (offset + limit - 1)
)
return (json.loads(track) for track in tracks)

@staticmethod
def get_tracks(offset=0, limit=None):
""" Returns a list of Tracks in a queue. Default behaviour is to return
Expand All @@ -63,14 +73,9 @@ def get_tracks(offset=0, limit=None):
Limit
"""
if limit is None:
limit = Queue.length()
tracks = redis.lrange(
config.PLAYLIST_REDIS_KEY, offset, (offset + limit - 1)
)
return (
Track.query.filter(Track.spotify_uri == json.loads(track)['uri']).first()
for track in tracks
Track.query.filter(Track.spotify_uri == track['uri']).first()
for track in Queue.get_queue(offset, limit)
)

@staticmethod
Expand Down
3 changes: 1 addition & 2 deletions fm/routes/player.py
Expand Up @@ -8,8 +8,7 @@
Route mapping to player resources.
"""


# Third Pary Libs
# Third Party Libs
from flask.ext.via.routers.default import Pluggable

# First Party Libs
Expand Down
16 changes: 14 additions & 2 deletions fm/views/player.py
Expand Up @@ -9,10 +9,12 @@
"""

# Standard Libs
import itertools
import json
from collections import Counter
from datetime import datetime

# Third Party Libs
# Third Pary Libs
import pytz
from flask import request, url_for
from flask.views import MethodView
Expand Down Expand Up @@ -427,10 +429,20 @@ def post(self):

class QueueMetaView(MethodView):

def get_list_of_genres(self, tracks):
artists = [track.album.artists for track in tracks]
genres = [artist.genres for artist in itertools.chain(*artists)]
return itertools.chain(*genres)

def get(self, *args, **kwargs):
queue = list(Queue.get_queue())
tracks = list(Queue.get_tracks())

return http.OK({
'total': Queue.length(),
'play_time': sum(track.duration for track in Queue.get_tracks())
'genres': Counter(g.name for g in self.get_list_of_genres(tracks)),
'users': Counter(q['user'] for q in queue),
'play_time': sum(track.duration for track in tracks)
})


Expand Down
2 changes: 1 addition & 1 deletion tests/factories/spotify.py
Expand Up @@ -11,7 +11,7 @@
# Standard Libs
from datetime import datetime

# Third Party Libs
# Third Pary Libs
import factory
from dateutil import tz
from factory import fuzzy
Expand Down
8 changes: 4 additions & 4 deletions tests/views/player/test_queue.py
Expand Up @@ -9,25 +9,25 @@
"""

# Standard Libs
import httplib
import json

# Third Pary Libs
import httplib
import mock
import pytest
import requests
from flask import url_for
from mockredis import mock_redis_client
from tests import TRACK_DATA
from tests.factories.spotify import TrackFactory
from tests.factories.user import UserFactory

# First Party Libs
from fm.ext import config, db
from fm.models.spotify import Artist
from fm.models.user import User
from fm.serializers.spotify import TrackSerializer
from fm.serializers.user import UserSerializer
from tests import TRACK_DATA
from tests.factories.spotify import TrackFactory
from tests.factories.user import UserFactory


class QueueTest(object):
Expand Down
103 changes: 92 additions & 11 deletions tests/views/player/test_queue_meta.py
Expand Up @@ -9,25 +9,22 @@
"""

# Standard Libs
# import httplib
import json

# Third Pary Libs
import mock
# import pytest
# import requests
from flask import url_for
from mockredis import mock_redis_client
from tests.factories.spotify import (
AlbumWithArtist,
ArtistFactory,
GenreFactory,
TrackFactory,
UserFactory
)

# First Party Libs
from fm.ext import config, db
# from fm.models.spotify import Artist
# from fm.models.user import User
# from fm.serializers.spotify import TrackSerializer
# from fm.serializers.user import UserSerializer
# from tests import TRACK_DATA
from tests.factories.spotify import TrackFactory
# from tests.factories.user import UserFactory


class TestQueueMeta(object):
Expand All @@ -51,6 +48,33 @@ def setup(self):
patch.start()
self.addPatchCleanup(patch)

def should_return_non_false_values_when_something_is_in_queue(self):
tracks = TrackFactory.create_batch(
3,
album=AlbumWithArtist(
artists=[ArtistFactory(
genres=GenreFactory.create_batch(2)
)]
)
)
db.session.add_all(tracks)
db.session.commit()

for track in tracks:
self.redis.rpush(
config.PLAYLIST_REDIS_KEY,
json.dumps({
'uri': track.spotify_uri,
'user': 'user'
})
)
url = url_for('player.queue-meta')
response = self.client.get(url)
assert response.json['total']
assert response.json['genres']
assert response.json['users']
assert response.json['play_time']

def should_return_total_played_time_of_all_tracks_in_queue(self):
tracks = TrackFactory.create_batch(3) * 2 # add some duplicates
db.session.add_all(tracks + TrackFactory.create_batch(2))
Expand All @@ -71,7 +95,7 @@ def should_return_total_played_time_of_all_tracks_in_queue(self):
assert response.status_code == 200
assert sum(t.duration for t in tracks) == response.json['play_time']

def should_total_number_in_queue(self):
def should_returns_total_number_of_trucks_in_queue(self):
tracks = TrackFactory.create_batch(3)
db.session.add_all(tracks)
db.session.commit()
Expand All @@ -90,3 +114,60 @@ def should_total_number_in_queue(self):

assert response.status_code == 200
assert response.json['total'] == 3

def should_returns_list_of_users_total_number_of_tracks_in_queue(self):
tracks = TrackFactory.create_batch(3)
users = UserFactory.create_batch(2)
db.session.add_all(tracks + users)
db.session.commit()

users_in_queue = [users[0], users[0], users[1]]
for track in tracks:
self.redis.rpush(
config.PLAYLIST_REDIS_KEY,
json.dumps({
'uri': track.spotify_uri,
'user': users_in_queue.pop().id
})
)

url = url_for('player.queue-meta')
response = self.client.get(url)

assert response.status_code == 200
assert response.json['users'] == {users[0].id: 2, users[1].id: 1}

def should_returns_list_of_genres_in_queue(self):
genres = GenreFactory.create_batch(2)
track1 = TrackFactory(
album=AlbumWithArtist(
artists=[ArtistFactory(
genres=genres)
]
)
)
track2 = TrackFactory(
album=AlbumWithArtist(
artists=[ArtistFactory(
genres=[genres[0]])
]
)
)
tracks = [track1, track2]
db.session.add_all(tracks)
db.session.commit()

for track in tracks:
self.redis.rpush(
config.PLAYLIST_REDIS_KEY,
json.dumps({
'uri': track.spotify_uri,
'user': 'user'
})
)

url = url_for('player.queue-meta')
response = self.client.get(url)

assert response.status_code == 200
assert response.json['genres'] == {genres[0].name: 2, genres[1].name: 1}

0 comments on commit 37d6581

Please sign in to comment.