diff --git a/maloja/database/__init__.py b/maloja/database/__init__.py index 4922029..4b150a5 100644 --- a/maloja/database/__init__.py +++ b/maloja/database/__init__.py @@ -421,14 +421,12 @@ def get_charts_tracks(dbconn=None,resolve_ids=True,**keys): return result @waitfordb -def get_charts_albums(dbconn=None,resolve_ids=True,**keys): +def get_charts_albums(dbconn=None,resolve_ids=True,only_own_albums=False,**keys): (since,to) = keys.get('timerange').timestamps() - appearing = keys.get('appearing',False) + if 'artist' in keys: - if appearing: - result = sqldb.count_scrobbles_of_artist_by_album(since=since,to=to,artist=keys['artist'],associated=keys.get('associated',False),resolve_ids=resolve_ids,dbconn=dbconn) - else: - result = sqldb.count_scrobbles_by_album_of_artist(since=since,to=to,artist=keys['artist'],associated=keys.get('associated',False),resolve_ids=resolve_ids,dbconn=dbconn) + result = sqldb.count_scrobbles_by_album_combined(since=since,to=to,artist=keys['artist'],associated=keys.get('associated',False),resolve_ids=resolve_ids,dbconn=dbconn) + result = [e for e in result if (not only_own_albums) or (keys['artist'] in (e['album']['artists'] or []))] else: result = sqldb.count_scrobbles_by_album(since=since,to=to,resolve_ids=resolve_ids,dbconn=dbconn) return result diff --git a/maloja/database/sqldb.py b/maloja/database/sqldb.py index ac4dff0..ec15b24 100644 --- a/maloja/database/sqldb.py +++ b/maloja/database/sqldb.py @@ -1111,6 +1111,69 @@ def count_scrobbles_by_album(since,to,resolve_ids=True,dbconn=None): result = rank(result,key='scrobbles') return result + +# get ALL albums the artist is in any way related to and rank them by TBD +@cached_wrapper +@connection_provider +def count_scrobbles_by_album_combined(since,to,artist,associated=False,resolve_ids=True,dbconn=None): + + if associated: + artist_ids = get_associated_artists(artist,resolve_ids=False,dbconn=dbconn) + [get_artist_id(artist,dbconn=dbconn)] + else: + artist_ids = [get_artist_id(artist,dbconn=dbconn)] + + # get all tracks that either have a relevant trackartist + # or are on an album with a relevant albumartist + op1 = sql.select(DB['tracks'].c.id).select_from( + sql.join( + sql.join( + DB['tracks'], + DB['trackartists'], + DB['tracks'].c.id == DB['trackartists'].c.track_id + ), + DB['albumartists'], + DB['tracks'].c.album_id == DB['albumartists'].c.album_id, + isouter=True + ) + ).where( + DB['tracks'].c.album_id.is_not(None), # tracks without albums don't matter + sql.or_( + DB['trackartists'].c.artist_id.in_(artist_ids), + DB['albumartists'].c.artist_id.in_(artist_ids) + ) + ) + relevant_tracks = dbconn.execute(op1).all() + relevant_track_ids = set(row.id for row in relevant_tracks) + #for row in relevant_tracks: + # print(get_track(row.id)) + + op2 = sql.select( + sql.func.count(sql.func.distinct(DB['scrobbles'].c.timestamp)).label('count'), + DB['tracks'].c.album_id + ).select_from( + sql.join( + DB['scrobbles'], + DB['tracks'], + DB['scrobbles'].c.track_id == DB['tracks'].c.id + ) + ).where( + DB['scrobbles'].c.timestamp.between(since,to), + DB['scrobbles'].c.track_id.in_(relevant_track_ids) + ).group_by(DB['tracks'].c.album_id).order_by(sql.desc('count')) + result = dbconn.execute(op2).all() + + if resolve_ids: + albums = get_albums_map([row.album_id for row in result],dbconn=dbconn) + result = [{'scrobbles':row.count,'album':albums[row.album_id],'album_id':row.album_id} for row in result] + else: + result = [{'scrobbles':row.count,'album_id':row.album_id} for row in result] + result = rank(result,key='scrobbles') + + #from pprint import pprint + #pprint(result) + return result + + @cached_wrapper @connection_provider # this ranks the albums of that artist, not albums the artist appears on - even scrobbles diff --git a/maloja/web/jinja/partials/album_showcase.jinja b/maloja/web/jinja/partials/album_showcase.jinja index 1596781..1356b77 100644 --- a/maloja/web/jinja/partials/album_showcase.jinja +++ b/maloja/web/jinja/partials/album_showcase.jinja @@ -4,7 +4,7 @@
-{% for entry in dbc.get_charts_albums(filterkeys,limitkeys) %} +{% for entry in dbc.get_charts_albums(filterkeys,limitkeys,{'only_own_albums':True}) %} {%- set cert = None -%} {%- if entry.scrobbles >= settings.scrobbles_gold_album -%}{% set cert = 'gold' %}{%- endif -%} @@ -26,7 +26,7 @@ {% endfor %} -{% for entry in dbc.get_charts_albums(filterkeys,limitkeys,{'appearing':True}) %} +{% for entry in dbc.get_charts_albums(filterkeys,limitkeys,{'only_own_albums':False}) %} {% if artist not in (entry.album.artists or []) %} diff --git a/maloja/web/jinja/partials/awards_artist.jinja b/maloja/web/jinja/partials/awards_artist.jinja index 338cce9..8cb3c92 100644 --- a/maloja/web/jinja/partials/awards_artist.jinja +++ b/maloja/web/jinja/partials/awards_artist.jinja @@ -57,8 +57,7 @@ -{% set albumcharts = dbc.get_charts_albums({'artist':artist,'timerange':malojatime.alltime(),'resolve_ids':True}) %} -{# TODO: find better solution, we just resolve ids here because we have that in the cache anyway #} +{% set albumcharts = dbc.get_charts_albums({'artist':artist,'timerange':malojatime.alltime(),'resolve_ids':True,'only_own_albums':True}) %} {% for e in albumcharts -%} {%- if e.scrobbles >= settings.scrobbles_gold_album -%}{% set cert = 'gold' %}{%- endif -%} {%- if e.scrobbles >= settings.scrobbles_platinum_album -%}{% set cert = 'platinum' %}{%- endif -%}