From a87951a883cf65072fade7a3dba50d75235e3123 Mon Sep 17 00:00:00 2001
From: ale <ale@incal.net>
Date: Sun, 25 Sep 2011 18:24:14 +0100
Subject: [PATCH] add a never_played API method

---
 server/djrandom/frontend/api_views.py |  8 ++++++++
 server/djrandom/model/mp3.py          | 14 +++++++++++---
 2 files changed, 19 insertions(+), 3 deletions(-)

diff --git a/server/djrandom/frontend/api_views.py b/server/djrandom/frontend/api_views.py
index 8cae5d7..fb02dc3 100644
--- a/server/djrandom/frontend/api_views.py
+++ b/server/djrandom/frontend/api_views.py
@@ -156,6 +156,14 @@ def most_played_json():
     return jsonify(results=most_played)
 
 
+@app.route('/json/never_played', methods=['GET'])
+@require_auth
+def never_played_json():
+    n = int(request.args.get('n', 20))
+    never_played = MP3.never_played(n)
+    return jsonify(results=never_played)
+
+
 @app.route('/json/last_uploaded', methods=['GET'])
 @require_auth
 def last_uploaded_json():
diff --git a/server/djrandom/model/mp3.py b/server/djrandom/model/mp3.py
index 10bdfc8..0504ec4 100644
--- a/server/djrandom/model/mp3.py
+++ b/server/djrandom/model/mp3.py
@@ -54,13 +54,16 @@ class MP3(Base):
             desc(cls.uploaded_at)).limit(n)
 
     @classmethod
-    def get_random_songs(cls, n=10):
+    def get_random_songs(cls, n=10, where_clause=None):
         """Return N completely random songs."""
         results = []
-        num_songs = cls.query.filter_by(state=cls.READY).count()
+        if where_clause is None:
+            where_clause = (cls.state == cls.READY)
+        num_songs = cls.query.filter(where_clause).count()
         fraction = float(n) / num_songs
+        where_clause = where_clause & (func.rand() < fraction)
         while len(results) < n:
-            tmprows = Session.query(cls.sha1).filter(func.rand() < fraction).limit(n)
+            tmprows = Session.query(cls.sha1).filter(where_clause).limit(n)
             for row in tmprows:
                 results.append(row[0])
         return results
@@ -70,6 +73,11 @@ class MP3(Base):
         return cls.query.filter_by(
             state=cls.READY, artist=artist, album=album)
 
+    @classmethod
+    def never_played(cls, n=10):
+        """Return N random songs that were never played."""
+        return cls.get_random_songs(n, where_clause=(cls.play_count == 0))
+
 
 class PlayLog(Base):
 
-- 
GitLab