diff --git a/maloja/database/__init__.py b/maloja/database/__init__.py index 9257b43..7a9b029 100644 --- a/maloja/database/__init__.py +++ b/maloja/database/__init__.py @@ -120,7 +120,7 @@ def get_scrobbles(**keys): else: result = sqldb.get_scrobbles(since=since,to=to) #return result[keys['page']*keys['perpage']:(keys['page']+1)*keys['perpage']] - return result + return list(reversed(result)) @waitfordb def get_scrobbles_num(**keys): @@ -145,9 +145,11 @@ def get_charts_artists(**keys): result = sqldb.count_scrobbles_by_artist(since=since,to=to) return result - +@waitfordb def get_charts_tracks(**keys): - return db_aggregate(by="TRACK",**{k:keys[k] for k in keys if k in ["since","to","within","timerange","artist"]}) + (since,to) = keys.get('timerange').timestamps() + result = sqldb.count_scrobbles_by_track(since=since,to=to) + return result def get_pulse(**keys): diff --git a/maloja/database/sqldb.py b/maloja/database/sqldb.py index a61a0ce..f308e1d 100644 --- a/maloja/database/sqldb.py +++ b/maloja/database/sqldb.py @@ -274,7 +274,7 @@ def get_scrobbles_of_artist(artist,since=None,to=None): DB['scrobbles'].c.timestamp<=to, DB['scrobbles'].c.timestamp>=since, DB['trackartists'].c.artist_id==artist_id - ).order_by(sql.desc('timestamp')) + ).order_by(sql.asc('timestamp')) result = conn.execute(op).all() result = scrobbles_db_to_dict(result) @@ -294,7 +294,7 @@ def get_scrobbles_of_track(track,since=None,to=None): DB['scrobbles'].c.timestamp<=to, DB['scrobbles'].c.timestamp>=since, DB['scrobbles'].c.track_id==track_id - ).order_by(sql.desc('timestamp')) + ).order_by(sql.asc('timestamp')) result = conn.execute(op).all() result = scrobbles_db_to_dict(result) @@ -311,7 +311,7 @@ def get_scrobbles(since=None,to=None,resolve_references=True,max=math.inf): op = DB['scrobbles'].select().where( DB['scrobbles'].c.timestamp<=to, DB['scrobbles'].c.timestamp>=since, - ).order_by(sql.desc('timestamp')) + ).order_by(sql.asc('timestamp')) result = conn.execute(op).all() result = scrobbles_db_to_dict(result) @@ -393,6 +393,27 @@ def count_scrobbles_by_artist(since,to): return result +def count_scrobbles_by_track(since,to): + print(since,to) + + with engine.begin() as conn: + op = sql.select( + sql.func.count(sql.func.distinct(DB['scrobbles'].c.timestamp)).label('count'), + DB['scrobbles'].c.track_id + ).select_from(DB['scrobbles']).where( + DB['scrobbles'].c.timestamp<=to, + DB['scrobbles'].c.timestamp>=since + ).group_by(DB['scrobbles'].c.track_id).order_by(sql.desc('count')) + result = conn.execute(op).all() + + + counts = [row.count for row in result] + tracks = get_tracks_map(row.track_id for row in result) + result = [{'scrobbles':row.count,'track':tracks[row.track_id]} for row in result] + result = rank(result,key='scrobbles') + return result + + ### functions that get mappings for several entities -> rows