WHAT THE F*CK AM I DOING

This commit is contained in:
krateng 2022-02-26 21:30:06 +01:00
parent 349e0bb7ea
commit 65f3dac40a
20 changed files with 89 additions and 80 deletions

View File

@ -73,7 +73,7 @@ coa = CollectorAgent()
def incoming_scrobble(artists,title,album=None,albumartists=None,duration=None,length=None,time=None,fix=True,client=None,**kwargs):
def incoming_scrobble(artists,title,album=None,albumartists=None,duration=None,length=None,time=None,fix=True,client=None,dbconn=None,**kwargs):
# TODO: just collecting all extra kwargs now. at some point, rework the authenticated api with alt function
# to actually look at the converted args instead of the request object and remove the key
# so that this function right here doesnt get the key passed to it
@ -106,7 +106,7 @@ def incoming_scrobble(artists,title,album=None,albumartists=None,duration=None,l
}
sqldb.add_scrobble(scrobbledict)
sqldb.add_scrobble(scrobbledict,dbconn=dbconn)
proxy_scrobble_all(artists,title,time)
@ -125,80 +125,80 @@ def incoming_scrobble(artists,title,album=None,albumartists=None,duration=None,l
@waitfordb
def get_scrobbles(**keys):
def get_scrobbles(dbconn=None,**keys):
(since,to) = keys.get('timerange').timestamps()
if 'artist' in keys:
result = sqldb.get_scrobbles_of_artist(artist=keys['artist'],since=since,to=to)
result = sqldb.get_scrobbles_of_artist(artist=keys['artist'],since=since,to=to,dbconn=dbconn)
elif 'track' in keys:
result = sqldb.get_scrobbles_of_track(track=keys['track'],since=since,to=to)
result = sqldb.get_scrobbles_of_track(track=keys['track'],since=since,to=to,dbconn=dbconn)
else:
result = sqldb.get_scrobbles(since=since,to=to)
result = sqldb.get_scrobbles(since=since,to=to,dbconn=dbconn)
#return result[keys['page']*keys['perpage']:(keys['page']+1)*keys['perpage']]
return list(reversed(result))
@waitfordb
def get_scrobbles_num(**keys):
return len(get_scrobbles(**keys))
def get_scrobbles_num(dbconn=None,**keys):
return len(get_scrobbles(dbconn=dbconn,**keys))
@waitfordb
def get_tracks(artist=None):
def get_tracks(dbconn=None,artist=None):
if artist is None:
result = sqldb.get_tracks()
result = sqldb.get_tracks(dbconn=dbconn)
else:
result = sqldb.get_tracks_of_artist(artist)
result = sqldb.get_tracks_of_artist(artist,dbconn=dbconn)
return result
@waitfordb
def get_artists():
return sqldb.get_artists()
def get_artists(dbconn=None):
return sqldb.get_artists(dbconn=dbconn)
@waitfordb
def get_charts_artists(**keys):
def get_charts_artists(dbconn=None,**keys):
(since,to) = keys.get('timerange').timestamps()
result = sqldb.count_scrobbles_by_artist(since=since,to=to)
result = sqldb.count_scrobbles_by_artist(since=since,to=to,dbconn=dbconn)
return result
@waitfordb
def get_charts_tracks(**keys):
def get_charts_tracks(dbconn=None,**keys):
(since,to) = keys.get('timerange').timestamps()
if 'artist' in keys:
result = sqldb.count_scrobbles_by_track_of_artist(since=since,to=to,artist=keys['artist'])
result = sqldb.count_scrobbles_by_track_of_artist(since=since,to=to,artist=keys['artist'],dbconn=dbconn)
else:
result = sqldb.count_scrobbles_by_track(since=since,to=to)
result = sqldb.count_scrobbles_by_track(since=since,to=to,dbconn=dbconn)
return result
@waitfordb
def get_pulse(**keys):
def get_pulse(dbconn=None,**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:
res = get_scrobbles_num(timerange=rng,**{k:keys[k] for k in keys if k != 'timerange'})
res = get_scrobbles_num(timerange=rng,**{k:keys[k] for k in keys if k != 'timerange'},dbconn=dbconn)
results.append({"range":rng,"scrobbles":res})
return results
@waitfordb
def get_performance(**keys):
def get_performance(dbconn=None,**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:
if "track" in keys:
track = sqldb.get_track(sqldb.get_track_id(keys['track']))
charts = get_charts_tracks(timerange=rng)
track = sqldb.get_track(sqldb.get_track_id(keys['track'],dbconn=dbconn),dbconn=dbconn)
charts = get_charts_tracks(timerange=rng,dbconn=dbconn)
rank = None
for c in charts:
if c["track"] == track:
rank = c["rank"]
break
elif "artist" in keys:
artist = sqldb.get_artist(sqldb.get_artist_id(keys['artist']))
artist = sqldb.get_artist(sqldb.get_artist_id(keys['artist'],dbconn=dbconn),dbconn=dbconn)
# ^this is the most useless line in programming history
# but I like consistency
charts = get_charts_artists(timerange=rng)
charts = get_charts_artists(timerange=rng,dbconn=dbconn)
rank = None
for c in charts:
if c["artist"] == artist:
@ -209,14 +209,14 @@ def get_performance(**keys):
return results
@waitfordb
def get_top_artists(**keys):
def get_top_artists(dbconn=None,**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_artists(timerange=rng)[0]
res = get_charts_artists(timerange=rng,dbconn=dbconn)[0]
results.append({"range":rng,"artist":res["artist"],"scrobbles":res["scrobbles"]})
except:
results.append({"range":rng,"artist":None,"scrobbles":0})
@ -225,14 +225,14 @@ def get_top_artists(**keys):
@waitfordb
def get_top_tracks(**keys):
def get_top_tracks(dbconn=None,**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)[0]
res = get_charts_tracks(timerange=rng,dbconn=dbconn)[0]
results.append({"range":rng,"track":res["track"],"scrobbles":res["scrobbles"]})
except:
results.append({"range":rng,"track":None,"scrobbles":0})
@ -240,15 +240,15 @@ def get_top_tracks(**keys):
return results
@waitfordb
def artist_info(artist):
def artist_info(artist,dbconn=None):
artist = sqldb.get_artist(sqldb.get_artist_id(artist))
alltimecharts = get_charts_artists(timerange=alltime())
scrobbles = get_scrobbles_num(artist=artist,timerange=alltime())
artist = sqldb.get_artist(sqldb.get_artist_id(artist,dbconn=dbconn),dbconn=dbconn)
alltimecharts = get_charts_artists(timerange=alltime(),dbconn=dbconn)
scrobbles = get_scrobbles_num(artist=artist,timerange=alltime(),dbconn=dbconn)
#we cant take the scrobble number from the charts because that includes all countas scrobbles
try:
c = [e for e in alltimecharts if e["artist"] == artist][0]
others = sqldb.get_associated_artists(artist)
others = sqldb.get_associated_artists(artist,dbconn=dbconn)
position = c["rank"]
return {
"artist":artist,
@ -274,10 +274,10 @@ def artist_info(artist):
@waitfordb
def track_info(track):
def track_info(track,dbconn=None):
track = sqldb.get_track(sqldb.get_track_id(track))
alltimecharts = get_charts_tracks(timerange=alltime())
track = sqldb.get_track(sqldb.get_track_id(track,dbconn=dbconn),dbconn=dbconn)
alltimecharts = get_charts_tracks(timerange=alltime(),dbconn=dbconn)
#scrobbles = get_scrobbles_num(track=track,timerange=alltime())
c = [e for e in alltimecharts if e["track"] == track][0]

View File

@ -31,6 +31,10 @@ def cached_wrapper(inner_func):
if not USE_CACHE: return inner_func
def outer_func(*args,**kwargs):
if 'dbconn' in kwargs:
conn = kwargs.pop('dbconn')
else:
conn = None
global hits, misses
key = (serialize(args),serialize(kwargs), inner_func, kwargs.get("since"), kwargs.get("to"))
@ -40,7 +44,7 @@ def cached_wrapper(inner_func):
else:
misses += 1
result = inner_func(*args,**kwargs)
result = inner_func(*args,**kwargs,dbconn=conn)
cache[key] = result
return result

View File

@ -1,12 +1,17 @@
from .. import database
from . sqldb import engine
# this is a wrapper object that provides a DB connection so that one jinja page
# (with all its included partials) can use it for all functions
# it also translates the non-unpacked calls to unpacked calls that the DB wants
class JinjaDBConnection:
def __init__(self):
pass
def __enter__(self):
self.conn = engine.connect()
return self
def __exit__(self, exc_type, exc_value, exc_traceback):
self.conn.close()
def __getattr__(self,name):
originalmethod = getattr(database,name)
@ -14,6 +19,6 @@ class JinjaDBConnection:
kwargs = {}
for k in keys:
kwargs.update(k)
return originalmethod(**kwargs)
return originalmethod(**kwargs,dbconn=self.conn)
return packedmethod

View File

@ -167,10 +167,10 @@ def artist_dict_to_db(info):
##### Actual Database interactions
def add_scrobble(scrobbledict):
def add_scrobble(scrobbledict,dbconn=None):
add_scrobbles([scrobbledict])
def add_scrobbles(scrobbleslist):
def add_scrobbles(scrobbleslist,dbconn=None):
ops = [
DB['scrobbles'].insert().values(
@ -189,7 +189,7 @@ def add_scrobbles(scrobbleslist):
### these will 'get' the ID of an entity, creating it if necessary
@cached_wrapper
def get_track_id(trackdict):
def get_track_id(trackdict,dbconn=None):
ntitle = normalize_name(trackdict['title'])
artist_ids = [get_artist_id(a) for a in trackdict['artists']]
@ -235,7 +235,7 @@ def get_track_id(trackdict):
return track_id
@cached_wrapper
def get_artist_id(artistname):
def get_artist_id(artistname,dbconn=None):
nname = normalize_name(artistname)
#print("looking for",nname)
@ -266,7 +266,7 @@ def get_artist_id(artistname):
### Functions that get rows according to parameters
@cached_wrapper
def get_scrobbles_of_artist(artist,since=None,to=None):
def get_scrobbles_of_artist(artist,since=None,to=None,dbconn=None):
if since is None: since=0
if to is None: to=now()
@ -287,7 +287,7 @@ def get_scrobbles_of_artist(artist,since=None,to=None):
return result
@cached_wrapper
def get_scrobbles_of_track(track,since=None,to=None):
def get_scrobbles_of_track(track,since=None,to=None,dbconn=None):
if since is None: since=0
if to is None: to=now()
@ -307,7 +307,7 @@ def get_scrobbles_of_track(track,since=None,to=None):
return result
@cached_wrapper
def get_scrobbles(since=None,to=None,resolve_references=True):
def get_scrobbles(since=None,to=None,resolve_references=True,dbconn=None):
if since is None: since=0
if to is None: to=now()
@ -324,7 +324,7 @@ def get_scrobbles(since=None,to=None,resolve_references=True):
return result
@cached_wrapper
def get_artists_of_track(track_id,resolve_references=True):
def get_artists_of_track(track_id,resolve_references=True,dbconn=None):
with engine.begin() as conn:
op = DB['trackartists'].select().where(
DB['trackartists'].c.track_id==track_id
@ -336,7 +336,7 @@ def get_artists_of_track(track_id,resolve_references=True):
@cached_wrapper
def get_tracks_of_artist(artist):
def get_tracks_of_artist(artist,dbconn=None):
artist_id = get_artist_id(artist)
@ -349,7 +349,7 @@ def get_tracks_of_artist(artist):
return tracks_db_to_dict(result)
@cached_wrapper
def get_artists():
def get_artists(dbconn=None):
with engine.begin() as conn:
op = DB['artists'].select()
result = conn.execute(op).all()
@ -357,7 +357,7 @@ def get_artists():
return artists_db_to_dict(result)
@cached_wrapper
def get_tracks():
def get_tracks(dbconn=None):
with engine.begin() as conn:
op = DB['tracks'].select()
result = conn.execute(op).all()
@ -367,7 +367,7 @@ def get_tracks():
### functions that count rows for parameters
@cached_wrapper
def count_scrobbles_by_artist(since,to):
def count_scrobbles_by_artist(since,to,dbconn=None):
jointable = sql.join(
DB['scrobbles'],
DB['trackartists'],
@ -404,7 +404,7 @@ def count_scrobbles_by_artist(since,to):
return result
@cached_wrapper
def count_scrobbles_by_track(since,to):
def count_scrobbles_by_track(since,to,dbconn=None):
with engine.begin() as conn:
op = sql.select(
@ -424,7 +424,7 @@ def count_scrobbles_by_track(since,to):
return result
@cached_wrapper
def count_scrobbles_by_track_of_artist(since,to,artist):
def count_scrobbles_by_track_of_artist(since,to,artist,dbconn=None):
artist_id = get_artist_id(artist)
@ -458,7 +458,7 @@ def count_scrobbles_by_track_of_artist(since,to,artist):
### functions that get mappings for several entities -> rows
@cached_wrapper
def get_artists_of_tracks(track_ids):
def get_artists_of_tracks(track_ids,dbconn=None):
with engine.begin() as conn:
op = sql.join(DB['trackartists'],DB['artists']).select().where(
DB['trackartists'].c.track_id.in_(track_ids)
@ -472,7 +472,7 @@ def get_artists_of_tracks(track_ids):
@cached_wrapper
def get_tracks_map(track_ids):
def get_tracks_map(track_ids,dbconn=None):
with engine.begin() as conn:
op = DB['tracks'].select().where(
DB['tracks'].c.id.in_(track_ids)
@ -487,7 +487,7 @@ def get_tracks_map(track_ids):
return tracks
@cached_wrapper
def get_artists_map(artist_ids):
def get_artists_map(artist_ids,dbconn=None):
with engine.begin() as conn:
op = DB['artists'].select().where(
DB['artists'].c.id.in_(artist_ids)
@ -505,7 +505,7 @@ def get_artists_map(artist_ids):
### associations
@cached_wrapper
def get_associated_artists(*artists):
def get_associated_artists(dbconn=None,*artists):
artist_ids = [get_artist_id(a) for a in artists]
jointable = sql.join(
@ -524,7 +524,7 @@ def get_associated_artists(*artists):
return artists
@cached_wrapper
def get_credited_artists(*artists):
def get_credited_artists(dbconn=None,*artists):
artist_ids = [get_artist_id(a) for a in artists]
jointable = sql.join(
@ -546,7 +546,7 @@ def get_credited_artists(*artists):
### get a specific entity by id
@cached_wrapper
def get_track(id):
def get_track(id,dbconn=None):
with engine.begin() as conn:
op = DB['tracks'].select().where(
DB['tracks'].c.id==id
@ -557,7 +557,7 @@ def get_track(id):
return track_db_to_dict(trackinfo)
@cached_wrapper
def get_artist(id):
def get_artist(id,dbconn=None):
with engine.begin() as conn:
op = DB['artists'].select().where(
DB['artists'].c.id==id

View File

@ -33,7 +33,7 @@
</script>
{% endblock %}
{% set issuedata = dbp.issues() %}
{% set issuedata = dbc.issues() %}
{% block maincontent %}

View File

@ -47,7 +47,7 @@
</script>
{% endblock %}
{% set rulesets = dbp.get_predefined_rulesets() %}
{% set rulesets = dbc.get_predefined_rulesets() %}
{% block maincontent %}

View File

@ -5,7 +5,7 @@
<script src="/datechange.js" async></script>
{% endblock %}
{% set charts = dbp.get_charts_artists(filterkeys,limitkeys) %}
{% set charts = dbc.get_charts_artists(filterkeys,limitkeys) %}
{% set pages = math.ceil(charts.__len__() / amountkeys.perpage) %}
{% if charts[0] is defined %}
{% set topartist = charts[0].artist %}

View File

@ -7,7 +7,7 @@
<script src="/datechange.js" async></script>
{% endblock %}
{% set charts = dbp.get_charts_tracks(filterkeys,limitkeys) %}
{% set charts = dbc.get_charts_tracks(filterkeys,limitkeys) %}
{% set pages = math.ceil(charts.__len__() / amountkeys.perpage) %}
{% if charts[0] is defined %}
{% set toptrack = charts[0].track %}

View File

@ -2,7 +2,7 @@
{% import 'snippets/entityrow.jinja' as entityrow %}
{% if charts is undefined %}
{% set charts = dbp.get_charts_artists(limitkeys) %}
{% set charts = dbc.get_charts_artists(limitkeys) %}
{% endif %}
{% if compare %}
@ -11,7 +11,7 @@
{% if compare is none %}{% set compare = False %}{% endif %}
{% endif %}
{% if compare %}
{% set prevartists = dbp.get_charts_artists({'timerange':compare}) %}
{% set prevartists = dbc.get_charts_artists({'timerange':compare}) %}
{% set lastranks = {} %}
{% for a in prevartists %}

View File

@ -2,7 +2,7 @@
{% if charts is undefined %}
{% set charts = dbp.get_charts_artists(limitkeys) %}
{% set charts = dbc.get_charts_artists(limitkeys) %}
{% endif %}
{% set charts_14 = charts | fixlength(14) %}

View File

@ -2,7 +2,7 @@
{% import 'snippets/entityrow.jinja' as entityrow %}
{% if charts is undefined %}
{% set charts = dbp.get_charts_tracks(filterkeys,limitkeys) %}
{% set charts = dbc.get_charts_tracks(filterkeys,limitkeys) %}
{% endif %}
{% if compare %}
{% if compare is true %}
@ -10,7 +10,7 @@
{% if compare is none %}{% set compare = False %}{% endif %}
{% endif %}
{% if compare %}
{% set prevtracks = dbp.get_charts_tracks(filterkeys,{'timerange':compare}) %}
{% set prevtracks = dbc.get_charts_tracks(filterkeys,{'timerange':compare}) %}
{% set lastranks = {} %}
{% for t in prevtracks %}

View File

@ -2,7 +2,7 @@
{% if charts is undefined %}
{% set charts = dbp.get_charts_tracks(filterkeys,limitkeys) %}
{% set charts = dbc.get_charts_tracks(filterkeys,limitkeys) %}
{% endif %}
{% set charts_14 = charts | fixlength(14) %}

View File

@ -1,6 +1,6 @@
{% import 'snippets/links.jinja' as links %}
{% set ranges = dbp.get_performance(filterkeys,limitkeys,delimitkeys) %}
{% set ranges = dbc.get_performance(filterkeys,limitkeys,delimitkeys) %}
{% set minrank = ranges|map(attribute="rank")|reject("none")|max|default(60) %}
{% set minrank = minrank + 20 %}

View File

@ -1,6 +1,6 @@
{% import 'snippets/links.jinja' as links %}
{% set ranges = dbp.get_pulse(filterkeys,limitkeys,delimitkeys) %}
{% set ranges = dbc.get_pulse(filterkeys,limitkeys,delimitkeys) %}
{% set maxbar = ranges|map(attribute="scrobbles")|max|default(1) %}
{% if maxbar < 1 %}{% set maxbar = 1 %}{% endif %}

View File

@ -1,4 +1,4 @@
{% set scrobbles = dbp.get_scrobbles(filterkeys,limitkeys,amountkeys) %}
{% set scrobbles = dbc.get_scrobbles(filterkeys,limitkeys,amountkeys) %}
{% set firstindex = amountkeys.page * amountkeys.perpage %}
{% set lastindex = firstindex + amountkeys.perpage %}

View File

@ -1,7 +1,7 @@
{% import 'snippets/links.jinja' as links %}
{% import 'snippets/entityrow.jinja' as entityrow %}
{% set ranges = dbp.get_top_artists(limitkeys,delimitkeys) %}
{% set ranges = dbc.get_top_artists(limitkeys,delimitkeys) %}
{% set maxbar = ranges|map(attribute="scrobbles")|max|default(1) %}
{% if maxbar < 1 %}{% set maxbar = 1 %}{% endif %}

View File

@ -1,7 +1,7 @@
{% import 'snippets/links.jinja' as links %}
{% import 'snippets/entityrow.jinja' as entityrow %}
{% set ranges = dbp.get_top_tracks(filterkeys,limitkeys,delimitkeys) %}
{% set ranges = dbc.get_top_tracks(filterkeys,limitkeys,delimitkeys) %}
{% set maxbar = ranges|map(attribute="scrobbles")|max|default(1) %}
{% if maxbar < 1 %}{% set maxbar = 1 %}{% endif %}

View File

@ -4,7 +4,7 @@
{% import 'snippets/filterdescription.jinja' as filterdesc %}
{% import 'snippets/pagination.jinja' as pagination %}
{% set scrobbles = dbp.get_scrobbles(filterkeys,limitkeys,amountkeys) %}
{% set scrobbles = dbc.get_scrobbles(filterkeys,limitkeys,amountkeys) %}
{% set pages = math.ceil(scrobbles.__len__() / amountkeys.perpage) %}
{% if filterkeys.get('track') is not none %}

View File

@ -4,7 +4,7 @@
<!-- find representative -->
{% set entries = dbp.get_top_artists(limitkeys,delimitkeys) %}
{% set entries = dbc.get_top_artists(limitkeys,delimitkeys) %}
{% set repr = entries | find_representative('artist','scrobbles') %}
{% set img = "/favicon.png" if repr is none else utilities.get_artist_image(repr.artist) %}

View File

@ -4,7 +4,7 @@
<!-- find representative -->
{% set entries = dbp.get_top_tracks(filterkeys,limitkeys,delimitkeys) %}
{% set entries = dbc.get_top_tracks(filterkeys,limitkeys,delimitkeys) %}
{% set repr = entries | find_representative('track','scrobbles') %}
{% set img = "/favicon.png" if repr is none else utilities.get_track_image(repr.track) %}