class ServerDataAccess(object): """ DAO for server stat management """ def __init__(self): self.storage = MongoConnection(db='tc_music', collection='server_stats') def create_server_statistics(self): # Rebuild the server stats entry self.storage.use_collection('server_stats').update({}, {'$set': {'currently_playing': {}, 'status': 'polling', 'volume': '50', 'radio': ''}},upsert=True) def get_radio(self): return self.storage.use_collection('server_stats').find_one({}, {'radio': True}) def set_radio(self, genre): return self.storage.use_collection('server_stats').update({}, {'$set': {'radio': genre}}, upsert=True) def get_volume(self): return self.storage.use_collection('server_stats').find_one({}, {'volume': True}) def set_volume(self, volume): return self.storage.use_collection('server_stats').update({}, {'$set': {'volume': volume}},upsert=False) def get_currently_playing(self): result = {} stats = self.storage.use_collection('server_stats').find_one() if stats['status'] == 'playing': result = stats['currently_playing'] return result def set_currently_playing(self, song=None): if isinstance(song, dict): print "Setting server status to playing" return self.storage.use_collection('server_stats').update({}, {'$set': {'currently_playing': extract_song_data(song), 'status': 'playing'}}, upsert=False) else: print "Server polling..." return self.storage.use_collection('server_stats').update({}, {'$set': {'currently_playing': {}, 'status': 'polling'}}, upsert=True) def get_total_songs_played(self): return self.storage.use_collection('server_stats').find_one({}, {'total_songs_played': True}) def set_total_songs_played(self, total_songs): return self.storage.use_collection('server_stats').update({}, {'$set': {'total_songs_played': total_songs}}, upsert=False) def increment_total_songs_played(self): return self.storage.use_collection('server_stats').update({}, {'$inc': {'total_songs_played': 1}}, upsert=False) def get_server_status(self): return self.storage.use_collection('server_stats').find_one({}, {'status': True}) def set_server_status(self, status): return self.storage.use_collection('server_stats').update({}, {'$set': {'status': status}}, upsert=False)
class MusicDataAccess(object): """ DAO for music management """ def __init__(self): self.storage = MongoConnection(db="tc_music", collection="song_queue") def queue(self, song, queued_by='User'): """ Adds a song object to the queue. Args: song (grooveshark.classes.Song): song returned from grooveshark api to be added into the music queue. Returns: self (MusicDataAccess) """ queue_song = extract_song_data(song) if queue_song: if queued_by == 'Radio': queue_song.update({'queued_by_radio': True}) queue_song.update({"queued_by": queued_by,"queued_at": datetime.now()}) self.storage.use_collection("song_queue").insert(queue_song) return self def clear_queue(self): """ Clears the music queue. Returns: self (MusicDataAccess) """ self.storage.use_collection("song_queue").remove({}) return self def get_queue(self): """ Retrieves the current music queue. Returns: queue_list (pymongo.cursor.Cursor[grooveshark.classes.Song]): Returns a mongo cursor collection of songs. """ return self.storage.use_collection("song_queue").find().sort([("queued_by_radio", ASCENDING),("queued_at", ASCENDING)]) def get_queue_count(self): return self.storage.use_collection("song_queue").count() def play_next(self): """ Retrieves the next song to play from the queue. Returns: song (None, dict): Will return the song as a dictionary or None if nothing is found. """ try: song = self.storage.use_collection("song_queue").find().sort([("queued_by_radio", ASCENDING),("queued_at", ASCENDING)]).limit(1).next() self.remove_from_queue(id=song["_id"]) self.add_to_played(song) except StopIteration as e: song = None return song def remove_last_song(self): """ Removes the last queued song. Returns: song (None, dict): Will return the song as a dictionary or None if nothing is found. """ try: song = self.storage.use_collection("song_queue").find_one().sort([("queued_at", DESCENDING)]).limit(1) self.remove_from_queue(id=song["_id"]) except StopIteration as e: song = None return song def find_in_queue(self, title=None, id=None): """ Searches the queue for a song by title, or id. Args: title (None, string): song title to be searched, or None when searching by id. id (None, string): song object id to be searched, or None when searching by title. Returns: song (None, pymongo.cursor.Cursor[grooveshark.classes.Song]): Will return the cursor with the song result, or None if not found. """ song = None if title: song = self.storage.use_collection("song_queue").find({"title": title}) elif id: song = self.storage.use_collection("song_queue").find({"_id": self.storage.get_key(id)}) return song def remove_from_queue(self, title=None, id=None, queued_by=None): """ Removes a song from the queue by song title, or id. Args: title (None, string): song title to be searched, or None when searching by id. id (None, string): song object id to be searched, or None when searching by title. Returns: result (boolean): Will return true when a song is removed, False otherwise. """ result = False if title: result = self.storage.use_collection("song_queue").remove({"title": title}) elif id: result = self.storage.use_collection("song_queue").remove({"_id": self.storage.get_key(id)}) elif queued_by: result = self.storage.use_collection("song_queue").remove({"queued_by": queued_by}) return result def add_to_played(self, song): """ Adds a song which was played from the queue to the played list. Args: song (dict): song returned from queue that has been played. Returns: self (MusicDataAccess) """ if song: song.update({"played_on": datetime.now()}) self.storage.use_collection("played_songs").insert(song) return self def get_play_count(self, title): """ Retrieve the playcount for a song title. Args: title (string): song title to get playcount for. Returns: (int): the number of plays a song title has. """ return self.storage.use_collection("played_songs").find({"title": title}).count() def get_last_played(self): """ Retrieve the last played song Returns: (None, grooveshark.classes.Song) """ try: song = self.storage.use_collection("played_songs").find().sort([("played_on", -1)]).limit(1).next() except StopIteration as e: song = None return song
class ServerDataAccess(object): """ DAO for server stat management """ def __init__(self): self.storage = MongoConnection(db='tc_music', collection='server_stats') def create_server_statistics(self): # Rebuild the server stats entry self.storage.use_collection('server_stats').update({}, { '$set': { 'currently_playing': {}, 'status': 'polling', 'volume': '50', 'radio': '' } }, upsert=True) def get_radio(self): return self.storage.use_collection('server_stats').find_one( {}, {'radio': True}) def set_radio(self, genre): return self.storage.use_collection('server_stats').update( {}, {'$set': { 'radio': genre }}, upsert=True) def get_volume(self): return self.storage.use_collection('server_stats').find_one( {}, {'volume': True}) def set_volume(self, volume): return self.storage.use_collection('server_stats').update( {}, {'$set': { 'volume': volume }}, upsert=False) def get_currently_playing(self): result = {} stats = self.storage.use_collection('server_stats').find_one() if stats['status'] == 'playing': result = stats['currently_playing'] return result def set_currently_playing(self, song=None): if isinstance(song, dict): print "Setting server status to playing" return self.storage.use_collection('server_stats').update( {}, { '$set': { 'currently_playing': extract_song_data(song), 'status': 'playing' } }, upsert=False) else: print "Server polling..." return self.storage.use_collection('server_stats').update( {}, {'$set': { 'currently_playing': {}, 'status': 'polling' }}, upsert=True) def get_total_songs_played(self): return self.storage.use_collection('server_stats').find_one( {}, {'total_songs_played': True}) def set_total_songs_played(self, total_songs): return self.storage.use_collection('server_stats').update( {}, {'$set': { 'total_songs_played': total_songs }}, upsert=False) def increment_total_songs_played(self): return self.storage.use_collection('server_stats').update( {}, {'$inc': { 'total_songs_played': 1 }}, upsert=False) def get_server_status(self): return self.storage.use_collection('server_stats').find_one( {}, {'status': True}) def set_server_status(self, status): return self.storage.use_collection('server_stats').update( {}, {'$set': { 'status': status }}, upsert=False)
class MusicDataAccess(object): """ DAO for music management """ def __init__(self): self.storage = MongoConnection(db="tc_music", collection="song_queue") def queue(self, song, queued_by="User"): """ Adds a song object to the queue. Args: song (grooveshark.classes.Song): song returned from grooveshark api to be added into the music queue. Returns: self (MusicDataAccess) """ queue_song = extract_song_data(song) if queue_song: if queued_by == "Radio": queue_song.update({"queued_by_radio": True}) queue_song.update({"queued_by": queued_by, "queued_at": datetime.now()}) self.storage.use_collection("song_queue").insert(queue_song) return self def clear_queue(self): """ Clears the music queue. Returns: self (MusicDataAccess) """ self.storage.use_collection("song_queue").remove({}) return self def get_queue(self): """ Retrieves the current music queue. Returns: queue_list (pymongo.cursor.Cursor[grooveshark.classes.Song]): Returns a mongo cursor collection of songs. """ return ( self.storage.use_collection("song_queue") .find() .sort([("queued_by_radio", ASCENDING), ("queued_at", ASCENDING)]) ) def get_queue_count(self): return self.storage.use_collection("song_queue").count() def play_next(self): """ Retrieves the next song to play from the queue. Returns: song (None, dict): Will return the song as a dictionary or None if nothing is found. """ try: song = ( self.storage.use_collection("song_queue") .find() .sort([("queued_by_radio", ASCENDING), ("queued_at", ASCENDING)]) .limit(1) .next() ) self.remove_from_queue(id=song["_id"]) self.add_to_played(song) except StopIteration as e: song = None return song def remove_last_song(self): """ Removes the last queued song. Returns: song (None, dict): Will return the song as a dictionary or None if nothing is found. """ try: song = self.storage.use_collection("song_queue").find_one().sort([("queued_at", DESCENDING)]).limit(1) self.remove_from_queue(id=song["_id"]) except StopIteration as e: song = None return song def find_in_queue(self, title=None, id=None): """ Searches the queue for a song by title, or id. Args: title (None, string): song title to be searched, or None when searching by id. id (None, string): song object id to be searched, or None when searching by title. Returns: song (None, pymongo.cursor.Cursor[grooveshark.classes.Song]): Will return the cursor with the song result, or None if not found. """ song = None if title: song = self.storage.use_collection("song_queue").find({"title": title}) elif id: song = self.storage.use_collection("song_queue").find({"_id": self.storage.get_key(id)}) return song def remove_from_queue(self, title=None, id=None, queued_by=None): """ Removes a song from the queue by song title, or id. Args: title (None, string): song title to be searched, or None when searching by id. id (None, string): song object id to be searched, or None when searching by title. Returns: result (boolean): Will return true when a song is removed, False otherwise. """ result = False if title: result = self.storage.use_collection("song_queue").remove({"title": title}) elif id: result = self.storage.use_collection("song_queue").remove({"_id": self.storage.get_key(id)}) elif queued_by: result = self.storage.use_collection("song_queue").remove({"queued_by": queued_by}) return result def add_to_played(self, song): """ Adds a song which was played from the queue to the played list. Args: song (dict): song returned from queue that has been played. Returns: self (MusicDataAccess) """ if song: song.update({"played_on": datetime.now()}) self.storage.use_collection("played_songs").insert(song) return self def get_play_count(self, title): """ Retrieve the playcount for a song title. Args: title (string): song title to get playcount for. Returns: (int): the number of plays a song title has. """ return self.storage.use_collection("played_songs").find({"title": title}).count() def get_last_played(self): """ Retrieve the last played song Returns: (None, grooveshark.classes.Song) """ try: song = self.storage.use_collection("played_songs").find().sort([("played_on", -1)]).limit(1).next() except StopIteration as e: song = None return song