From 4410dec0b73f7374e9a65abf4dda6bb7c575cc2b Mon Sep 17 00:00:00 2001 From: Alban Date: Sun, 14 Oct 2012 18:06:48 +0200 Subject: [PATCH] Implementing getIndexes.view It would be nice to ignore prefixes such as 'The' in there. Will think about it later. --- api/browse.py | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++- db.py | 4 +-- 2 files changed, 79 insertions(+), 3 deletions(-) diff --git a/api/browse.py b/api/browse.py index 9cb5e8c..276a7f4 100755 --- a/api/browse.py +++ b/api/browse.py @@ -2,7 +2,8 @@ from flask import request from web import app -from db import MusicFolder +from db import MusicFolder, Artist, Album, Track +import uuid, time, string @app.route('/rest/getMusicFolders.view') def list_folders(): @@ -15,3 +16,78 @@ def list_folders(): } }) +@app.route('/rest/getIndexes.view') +def list_indexes(): + musicFolderId = request.args.get('musicFolderId') + ifModifiedSince = request.args.get('ifModifiedSince') + if ifModifiedSince: + try: + ifModifiedSince = int(ifModifiedSince) + except: + return request.formatter({ + 'error': { + 'code': 0, + 'message': 'Invalid timestamp' + } + }, error = True) + + if musicFolderId is None: + folder = MusicFolder.query.all() + else: + try: + mfid = uuid.UUID(musicFolderId) + except: + return request.formatter({ + 'error': { + 'code': 0, + 'message': 'Invalid id' + } + }, error = True) + + folder = MusicFolder.query.get(mfid) + + if not folder: + return request.formatter({ + 'error': { + 'code': 70, + 'message': 'Folder not found' + } + }, error = True) + + last_modif = max(map(lambda f: f.last_scan, folder)) if type(folder) is list else folder.last_scan + last_modif_ts = int(time.mktime(last_modif.timetuple())) + + if (not ifModifiedSince is None) and last_modif_ts < ifModifiedSince: + return request.formatter({ 'indexes': { 'lastModified': last_modif_ts } }) + + if type(folder) is list: + artists = Artist.query.all() + else: + artists = Artist.query.join(Album, Track).filter(Track.folder_id == mfid) + + indexes = {} + for artist in artists: + index = artist.name[0].upper() + if index in map(str, xrange(10)): + index = '#' + elif index not in string.letters: + index = '?' + + if index not in indexes: + indexes[index] = [] + + indexes[index].append(artist) + + return request.formatter({ + 'indexes': { + 'lastModified': last_modif_ts, + 'index': [ { + 'name': k, + 'artist': [ { + 'id': str(a.id), + 'name': a.name + } for a in sorted(v, key = lambda a: a.name.lower()) ] + } for k, v in sorted(indexes.iteritems()) ] + } + }) + diff --git a/db.py b/db.py index b068989..e127d29 100755 --- a/db.py +++ b/db.py @@ -10,7 +10,7 @@ from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.types import TypeDecorator from sqlalchemy import BINARY -import uuid +import uuid, datetime class UUID(TypeDecorator): impl = BINARY @@ -60,7 +60,7 @@ class MusicFolder(Base): id = UUID.gen_id_column() name = Column(String, unique = True) path = Column(String) - last_scan = Column(DateTime, nullable = True) + last_scan = Column(DateTime, default = datetime.datetime.min) class Artist(Base): __tablename__ = 'artist'