From 436b40821a5839fd2394e395739ca05779f7e01b Mon Sep 17 00:00:00 2001 From: krateng Date: Thu, 28 Dec 2023 03:09:25 +0100 Subject: [PATCH] Return multiple top results for ranges, GH-278 --- maloja/apis/native_v1.py | 6 ++-- maloja/database/__init__.py | 68 +++++++++++++++++++++++++++---------- 2 files changed, 53 insertions(+), 21 deletions(-) diff --git a/maloja/apis/native_v1.py b/maloja/apis/native_v1.py index 7a90501..042687f 100644 --- a/maloja/apis/native_v1.py +++ b/maloja/apis/native_v1.py @@ -482,7 +482,7 @@ def get_top_artists_external(k_filter, k_limit, k_delimit, k_amount): :rtype: Dictionary""" ckeys = {**k_limit, **k_delimit} - results = database.get_top_artists(**ckeys) + results = database.get_top_artists(**ckeys,compatibility=True) return { "status":"ok", @@ -501,7 +501,7 @@ def get_top_tracks_external(k_filter, k_limit, k_delimit, k_amount): :rtype: Dictionary""" ckeys = {**k_limit, **k_delimit} - results = database.get_top_tracks(**ckeys) + results = database.get_top_tracks(**ckeys,compatibility=True) # IMPLEMENT THIS FOR TOP TRACKS OF ARTIST/ALBUM AS WELL? return { @@ -521,7 +521,7 @@ def get_top_albums_external(k_filter, k_limit, k_delimit, k_amount): :rtype: Dictionary""" ckeys = {**k_limit, **k_delimit} - results = database.get_top_albums(**ckeys) + results = database.get_top_albums(**ckeys,compatibility=True) # IMPLEMENT THIS FOR TOP ALBUMS OF ARTIST AS WELL? return { diff --git a/maloja/database/__init__.py b/maloja/database/__init__.py index 6e8f51e..c8cc75d 100644 --- a/maloja/database/__init__.py +++ b/maloja/database/__init__.py @@ -42,6 +42,7 @@ from collections import namedtuple from threading import Lock import yaml, json import math +from itertools import takewhile # url handling import urllib @@ -570,7 +571,7 @@ def get_performance(dbconn=None,**keys): return results @waitfordb -def get_top_artists(dbconn=None,**keys): +def get_top_artists(dbconn=None,compatibility=True,**keys): separate = keys.get('separate') @@ -578,42 +579,73 @@ def get_top_artists(dbconn=None,**keys): results = [] for rng in rngs: - try: - res = get_charts_artists(timerange=rng,separate=separate,dbconn=dbconn)[0] - results.append({"range":rng,"artist":res["artist"],"scrobbles":res["scrobbles"],"real_scrobbles":res["real_scrobbles"],"associated_artists":sqldb.get_associated_artists(res["artist"])}) - except Exception: - results.append({"range":rng,"artist":None,"scrobbles":0,"real_scrobbles":0}) + result = {'range':rng} + res = get_charts_artists(timerange=rng,separate=separate,dbconn=dbconn) + + result['top'] = [ + {'artist': r['artist'], 'scrobbles': r['scrobbles'], 'real_scrobbles':r['real_scrobbles'], 'associated_artists': sqldb.get_associated_artists(r['artist'])} + for r in takewhile(lambda x:x['rank']==1,res) + ] + # for third party applications + if compatibility: + if result['top']: + result.update(result['top'][0]) + else: + result.update({'artist':None,'scrobbles':0,'real_scrobbles':0}) + + results.append(result) return results @waitfordb -def get_top_tracks(dbconn=None,**keys): +def get_top_tracks(dbconn=None,compatibility=True,**keys): rngs = ranges(**{k:keys[k] for k in keys if k in ["since","to","within","timerange","step","stepn","trail"]}) results = [] for rng in rngs: - try: - res = get_charts_tracks(timerange=rng,dbconn=dbconn)[0] - results.append({"range":rng,"track":res["track"],"scrobbles":res["scrobbles"]}) - except Exception: - results.append({"range":rng,"track":None,"scrobbles":0}) + result = {'range':rng} + res = get_charts_tracks(timerange=rng,dbconn=dbconn) + + result['top'] = [ + {'track': r['track'], 'scrobbles': r['scrobbles']} + for r in takewhile(lambda x:x['rank']==1,res) + ] + # for third party applications + if compatibility: + if result['top']: + result.update(result['top'][0]) + else: + result.update({'track':None,'scrobbles':0}) + + results.append(result) return results @waitfordb -def get_top_albums(dbconn=None,**keys): +def get_top_albums(dbconn=None,compatibility=True,**keys): rngs = ranges(**{k:keys[k] for k in keys if k in ["since","to","within","timerange","step","stepn","trail"]}) results = [] for rng in rngs: - try: - res = get_charts_albums(timerange=rng,dbconn=dbconn)[0] - results.append({"range":rng,"album":res["album"],"scrobbles":res["scrobbles"]}) - except Exception: - results.append({"range":rng,"album":None,"scrobbles":0}) + + result = {'range':rng} + res = get_charts_tracks(timerange=rng,dbconn=dbconn) + + result['top'] = [ + {'album': r['album'], 'scrobbles': r['scrobbles']} + for r in takewhile(lambda x:x['rank']==1,res) + ] + # for third party applications + if compatibility: + if result['top']: + result.update(result['top'][0]) + else: + result.update({'album':None,'scrobbles':0}) + + results.append(result) return results