1
0
mirror of https://github.com/krateng/maloja.git synced 2023-08-10 21:12:55 +03:00

Significant rework of the architecture

* URL keys and internal keys are now being separated more cleanly
* HTML generation is split up into submodules that can be used by serveral websites
* HTML generation now talks directly to the database in most cases instead of calling the database server for json data
This commit is contained in:
Krateng 2019-02-20 18:22:45 +01:00
parent a4b95969d5
commit 5f19e7b38e
15 changed files with 461 additions and 415 deletions

View File

@ -158,17 +158,17 @@ def get_scrobbles_external():
ckeys["artists"], ckeys["title"] = keys.getall("artist"), keys.get("title")
ckeys["since"], ckeys["to"], ckeys["within"] = keys.get("since"), keys.get("to"), keys.get("in")
ckeys["associated"] = (keys.get("associated")!=None)
ckeys["max"] = keys.get("max")
ckeys["max_"] = keys.get("max")
result = get_scrobbles(**ckeys)
return {"list":result}
def get_scrobbles(**keys):
r = db_query(**{k:keys[k] for k in keys if k in ["artists","title","since","to","within","associated"]})
r = db_query(**{k:keys[k] for k in keys if k in ["artist","artists","title","since","to","within","associated","track"]})
r.reverse()
if keys.get("max") is not None:
return r[:int(keys.get("max"))]
if keys.get("max_") is not None:
return r[:int(keys.get("max_"))]
else:
return r
@ -327,7 +327,7 @@ def get_pulse(step="month",stepn=1,trail=3,**keys):
#d_current_end = getNext(d_current,step,stepn * trail)
d_current_end = getEnd(d_current,step,stepn * trail)
#res = db_aggregate(since=d_current,to=d_current_end)
res = len(db_query(since=d_current,to=d_current_end,**{k:keys[k] for k in keys if k in ["artists","title","associated"]}))
res = len(db_query(since=d_current,to=d_current_end,**{k:keys[k] for k in keys if k in ["artists","artist","track","title","associated"]}))
results.append({"from":d_current,"to":d_current_end,"scrobbles":res})
d_current = getNext(d_current,step,stepn)
if isPast(d_current_end,d_end):
@ -841,17 +841,35 @@ def sync():
# Queries the database
def db_query(artists=None,title=None,track=None,since=None,to=None,within=None,associated=False):
def db_query(artist=None,artists=None,title=None,track=None,since=None,to=None,within=None,associated=False):
# print(artists)
# print(title)
# print(track)
# print(since)
# print(to)
# print(within)
# print(associated)
(since, to) = getTimestamps(since,to,within)
# this is not meant as a search function. we *can* query the db with a string, but it only works if it matches exactly
# if a title is specified, we assume that a specific track (with the exact artist combination) is requested
# if not, duplicate artist arguments are ignored
artist = None
#artist = None
# artists to numbers
artists = set([(ARTISTS.index(a) if isinstance(a,str) else a) for a in artists])
if artist is not None and isinstance(artist,str):
artist = ARTISTS.index(artist)
# artists to numbers
if artists is not None:
artists = set([(ARTISTS.index(a) if isinstance(a,str) else a) for a in artists])
# track to number
if track is not None and isinstance(track,dict):
trackartists = set([(ARTISTS.index(a) if isinstance(a,str) else a) for a in track["artists"]])
track = TRACKS.index((frozenset(trackartists),track["title"]))
artists = None
#check if track is requested via title
if title!=None and track==None:
@ -860,8 +878,9 @@ def db_query(artists=None,title=None,track=None,since=None,to=None,within=None,a
# if we're not looking for a track (either directly or per title artist arguments, which is converted to track above)
# we only need one artist
elif track==None and len(artists) != 0:
elif artist is None and track is None and artists is not None and len(artists) != 0:
artist = artists.pop()
# right now we always request everything by name, maybe we don't actually need the request by number, but i'll leave it in for now

View File

@ -108,6 +108,71 @@ def getRangeDesc(timeA,timeB,inclusiveB=True):
return getTimeDesc(timeA) + " to " + getTimeDesc(timeB)
# finds out if we want an artist or a track
#def interpretURLKeys(keys):
# if "title" in keys:
# return {"track":{"artists":keys.getall("artist"),"title":keys.get("title")}}
# if "artist" in keys:
# return {"artist":keys.get("artist")}
#
# return {}
# alright this is the last one
# one ultimate method to rule them all
# one method to take html keys and convert them into internal keys
# it renames them, interprets what's being asked, removes duplicates
# it gets rid of multidicts
# it does fecking everything
# it's the best
# fantastic
def KeySplit(keys):
# output:
# 1 keys that define the filtered object like artist or track
# 2 keys that define time limits of the whole thing
# 3 keys that define interal time ranges
# 4 keys that define amount limits
# 1
if "title" in keys:
resultkeys1 = {"track":{"artists":keys.getall("artist"),"title":keys.get("title")}}
elif "artist" in keys:
resultkeys1 = {"artist":keys.get("artist")}
if "associated" in keys: resultkeys1["associated"] = True
else:
resultkeys1 = {}
# 2
resultkeys2 = {}
if "since" in keys: resultkeys2["since"] = keys.get("since")
elif "from" in keys: resultkeys2["since"] = keys.get("from")
elif "start" in keys: resultkeys2["since"] = keys.get("start")
#
if "to" in keys: resultkeys2["to"] = keys.get("to")
elif "until" in keys: resultkeys2["to"] = keys.get("until")
elif "end" in keys: resultkeys2["to"] = keys.get("end")
#
if "in" in keys: resultkeys2["within"] = keys.get("in")
elif "within" in keys: resultkeys2["within"] = keys.get("within")
elif "during" in keys: resultkeys2["within"] = keys.get("during")
#3
resultkeys3 = {}
if "step" in keys: [resultkeys3["step"],resultkeys3["stepn"]] = (keys["step"].split("-") + [1])[:2]
if "stepn" in keys: resultkeys3["stepn"] = keys["stepn"] #overwrite if explicitly given
if "stepn" in resultkeys3: resultkeys3["stepn"] = int(resultkeys3["stepn"]) #in both cases, convert it here
if "trail" in keys: resultkeys3["trail"] = int(keys["trail"])
#4
resultkeys4 = {}
if "max" in keys: resultkeys4["max_"] = int(keys["max"])
return resultkeys1, resultkeys2, resultkeys3, resultkeys4
# limit a multidict to only the specified keys
# would be a simple constructor expression, but multidicts apparently don't let me do that

140
htmlmodules.py Normal file
View File

@ -0,0 +1,140 @@
from htmlgenerators import *
import database
from utilities import getArtistsInfo, getTracksInfo
def getpictures(ls,result,tracks=False):
from utilities import getArtistsInfo, getTracksInfo
if tracks:
for element in getTracksInfo(ls):
result.append(element.get("image"))
else:
for element in getArtistsInfo(ls):
result.append(element.get("image"))
# artist=None,track=None,since=None,to=None,within=None,associated=False,max_=None,pictures=False
def module_scrobblelist(max_=None,pictures=False,shortTimeDesc=False,**kwargs):
kwargs_filter = pickKeys(kwargs,"artist","track","associated")
kwargs_time = pickKeys(kwargs,"since","to","within")
scrobbles = database.get_scrobbles(**kwargs_time,**kwargs_filter) #we're getting all scrobbles for the number and only filtering them on site
if pictures:
scrobbleswithpictures = scrobbles if max_ is None else scrobbles[:max_]
scrobbleimages = [e.get("image") for e in getTracksInfo(scrobbleswithpictures)] #will still work with scrobble objects as they are a technically a subset of track objects
representative = scrobbles[0] if scrobbles is not [] else None
# build list
i = 0
html = "<table class='list'>"
for s in scrobbles:
i += 1
if max_ is not None and i>=max_:
break
html += "<tr>"
html += "<td class='time'>" + getTimeDesc(s["time"],short=shortTimeDesc) + "</td>"
if pictures:
html += """<td class='icon'><div style="background-image:url('""" + scrobbleimages[i] + """')"></div></td>"""
html += "<td class='artists'>" + artistLinks(s["artists"]) + "</td>"
html += "<td class='title'>" + trackLink({"artists":s["artists"],"title":s["title"]}) + "</td>"
html += "</tr>"
html += "</table>"
return (html,len(scrobbles),representative)
def module_pulse(max_=None,**kwargs):
kwargs_filter = pickKeys(kwargs,"artist","track","associated")
kwargs_time = pickKeys(kwargs,"since","to","within","step","stepn","trail")
ranges = database.get_pulse(**kwargs_time,**kwargs_filter)
maxbar = max([t["scrobbles"] for t in ranges])
maxbar = max(maxbar,1)
#build list
html = "<table class='list'>"
for t in ranges:
fromstr = "/".join([str(e) for e in t["from"]])
tostr = "/".join([str(e) for e in t["to"]])
html += "<tr>"
html += "<td>" + getRangeDesc(t["from"],t["to"]) + "</td>"
html += "<td class='amount'>" + scrobblesLink({"since":fromstr,"to":tostr},amount=t["scrobbles"],**kwargs_filter) + "</td>"
html += "<td class='bar'>" + scrobblesLink({"since":fromstr,"to":tostr},percent=t["scrobbles"]*100/maxbar,**kwargs_filter) + "</td>"
html += "</tr>"
html += "</table>"
return html
def module_trackcharts(max_=None,**kwargs):
kwargs_filter = pickKeys(kwargs,"artist","associated")
kwargs_time = pickKeys(kwargs,"since","to","within")
tracks = database.get_charts_tracks(**kwargs_filter,**kwargs_time)
if tracks != []:
maxbar = tracks[0]["scrobbles"]
representative = tracks[0]["track"]
else:
representative = None
i = 0
html = "<table class='list'>"
for e in tracks:
i += 1
if max_ is not None and i>max_:
break
html += "<tr>"
html += "<td class='rank'>#" + str(i) + "</td>"
html += "<td class='artists'>" + artistLinks(e["track"]["artists"]) + "</td>"
html += "<td class='title'>" + trackLink(e["track"]) + "</td>"
html += "<td class='amount'>" + scrobblesTrackLink(e["track"],kwargs_time,amount=e["scrobbles"]) + "</td>"
html += "<td class='bar'>" + scrobblesTrackLink(e["track"],kwargs_time,percent=e["scrobbles"]*100/maxbar) + "</td>"
html += "</tr>"
html += "</table>"
return (html,representative)
def module_artistcharts(max_=None,**kwargs):
kwargs_filter = pickKeys(kwargs,"associated") #not used right now
kwargs_time = pickKeys(kwargs,"since","to","within")
artists = database.get_charts_artists(**kwargs_filter,**kwargs_time)
if artists != []:
maxbar = artists[0]["scrobbles"]
representative = artists[0]["artist"]
else:
representative = None
i = 0
html = "<table class='list'>"
for e in artists:
i += 1
if max_ is not None and i>max_:
break
html += "<tr>"
html += "<td class='rank'>#" + str(i) + "</td>"
html += "<td class='artist'>" + artistLink(e["artist"])
if (e["counting"] != []):
html += " <span class='extra'>incl. " + ", ".join([artistLink(a) for a in e["counting"]]) + "</span>"
html += "</td>"
html += "<td class='amount'>" + scrobblesArtistLink(e["artist"],kwargs_time,amount=e["scrobbles"],associated=True) + "</td>"
html += "<td class='bar'>" + scrobblesArtistLink(e["artist"],kwargs_time,percent=e["scrobbles"]*100/maxbar,associated=True) + "</td>"
html += "</tr>"
html += "</table>"
return (html, representative)

View File

@ -14,7 +14,7 @@
<div style="background-image:url('KEY_IMAGEURL')"></div>
</td>
<td class="text">
<h1>KEY_ARTISTNAME</h1> <span class="rank"><a href="/topartists">KEY_POSITION</a></span><br/>
<h1>KEY_ARTISTNAME</h1> <span class="rank"><a href="/topartists?max=100">KEY_POSITION</a></span><br/>
<span>KEY_ASSOCIATED</span>
<p class="stats"><a href="/scrobbles?artist=KEY_ENC_ARTISTNAME">KEY_SCROBBLES Scrobbles</a></p>

View File

@ -5,8 +5,10 @@ import json
def instructions(keys,dbport):
from utilities import getArtistInfo
from htmlgenerators import clean, artistLink, artistLinks, trackLink, scrobblesTrackLink, getRangeDesc, scrobblesLink
from htmlmodules import module_pulse, module_trackcharts
clean(keys)
allowedkeys = {"artist":keys.get("artist")}
# clean(keys)
info = getArtistInfo(keys["artist"])
imgurl = info.get("image")
#desc = info.get("info")
@ -27,47 +29,12 @@ def instructions(keys,dbport):
includestr = "associated: "
includestr += artistLinks(included)
response = urllib.request.urlopen("http://[::1]:" + str(dbport) + "/charts/tracks?artist=" + urllib.parse.quote(keys["artist"]))
db_data = json.loads(response.read())
if db_data["list"] != []: maxbar = db_data["list"][0]["scrobbles"]
html = "<table class='list'>"
for e in db_data["list"]:
html += "<tr>"
html += "<td class='artists'>" + artistLinks(e["track"]["artists"]) + "</td>"
html += "<td>" + trackLink(e["track"]) + "</td>"
html += "<td class='amount'>" + scrobblesTrackLink(e["track"],{},amount=e["scrobbles"]) + "</td>"
html += "<td class='bar'>" + scrobblesTrackLink(e["track"],{},percent=e["scrobbles"]*100/maxbar) + "</td>"
html += "</tr>"
html += "</table>"
# pulse
response = urllib.request.urlopen("http://[::1]:" + str(dbport) + "/pulse?step=year&trail=1&artist=" + urllib.parse.quote(keys["artist"]))
db_data = json.loads(response.read())
terms = db_data["list"]
# build list
maxbar = max([t["scrobbles"] for t in terms])
html_pulse = "<table class='list'>"
for t in terms:
fromstr = "/".join([str(e) for e in t["from"]])
tostr = "/".join([str(e) for e in t["to"]])
html_pulse += "<tr>"
#html += "<td>" + fromstr + "</td>"
#html += "<td>" + tostr + "</td>"
html_pulse += "<td>" + getRangeDesc(t["from"],t["to"]) + "</td>"
html_pulse += "<td class='amount'>" + scrobblesLink({"since":fromstr,"to":tostr},amount=t["scrobbles"],artist=keys["artist"]) + "</td>"
html_pulse += "<td class='bar'>" + scrobblesLink({"since":fromstr,"to":tostr},percent=t["scrobbles"]*100/maxbar,artist=keys["artist"]) + "</td>"
html_pulse += "</tr>"
html_pulse += "</table>"
replace = {"KEY_ARTISTNAME":keys["artist"],"KEY_ENC_ARTISTNAME":urllib.parse.quote(keys["artist"]),"KEY_IMAGEURL":imgurl, "KEY_DESCRIPTION":"","KEY_TRACKLIST":html,"KEY_SCROBBLES":scrobbles,"KEY_POSITION":pos,"KEY_ASSOCIATED":includestr,"KEY_PULSE":html_pulse}
html_tracks, _ = module_trackcharts(**allowedkeys)
html_pulse = module_pulse(**allowedkeys,step="year",stepn=1,trail=1)
replace = {"KEY_ARTISTNAME":keys["artist"],"KEY_ENC_ARTISTNAME":urllib.parse.quote(keys["artist"]),"KEY_IMAGEURL":imgurl, "KEY_DESCRIPTION":"","KEY_TRACKLIST":html_tracks,"KEY_SCROBBLES":scrobbles,"KEY_POSITION":pos,"KEY_ASSOCIATED":includestr,"KEY_PULSE":html_pulse}
return (replace,pushresources)

View File

@ -4,29 +4,24 @@ import json
def instructions(keys,dbport):
from utilities import getArtistInfo, getTrackInfo
from htmlgenerators import getTimeDesc, artistLink, artistLinks, trackLink, scrobblesLink, keysToUrl, pickKeys, clean, getRangeDesc
from htmlgenerators import getTimeDesc, artistLink, artistLinks, trackLink, scrobblesLink, keysToUrl, getRangeDesc, KeySplit
from htmlmodules import module_pulse
clean(keys)
timekeys = pickKeys(keys,"since","to","in","step","trail")
limitkeys = pickKeys(keys,"artist","title","associated")
filterkeys, timekeys, delimitkeys, _ = KeySplit(keys)
# Get scrobble data
response = urllib.request.urlopen("http://[::1]:" + str(dbport) + "/pulse?" + keysToUrl(limitkeys,timekeys))
db_data = json.loads(response.read())
terms = db_data["list"]
# describe the scope (and creating a key for the relevant artist or track)
limitstring = ""
limitkey = {}
if keys.get("title") is not None:
limitkey["track"] = {"artists":keys.getall("artist"),"title":keys.get("title")}
limitstring += "of " + trackLink(limitkey["track"]) + " "
limitstring += "by " + artistLinks(keys.getall("artist"))
#limitkey = {}
if filterkeys.get("track") is not None:
#limitkey["track"] = {"artists":keys.getall("artist"),"title":keys.get("title")}
limitstring += "of " + trackLink(filterkeys["track"]) + " "
limitstring += "by " + artistLinks(filterkeys["track"]["artists"])
elif keys.get("artist") is not None:
limitkey["artist"], limitkey["associated"] = keys.get("artist"), (keys.get("associated")!=None)
limitstring += "of " + artistLink(keys.get("artist"))
if keys.get("associated") is not None:
elif filterkeys.get("artist") is not None:
#limitkey["artist"], limitkey["associated"] = keys.get("artist"), (keys.get("associated")!=None)
limitstring += "of " + artistLink(filterkeys.get("artist"))
if filterkeys.get("associated"):
response = urllib.request.urlopen("http://[::1]:" + str(dbport) + "/artistinfo?artist=" + urllib.parse.quote(keys["artist"]))
db_data = json.loads(response.read())
moreartists = db_data["associated"]
@ -35,9 +30,9 @@ def instructions(keys,dbport):
# get image
if limitkeys.get("title") is not None:
imgurl = getTrackInfo(limitkeys.getall("artist"),limitkeys.get("title")).get("image")
elif keys.get("artist") is not None:
if filterkeys.get("track") is not None:
imgurl = getTrackInfo(filterkeys.get("track")["artists"],filterkeys.get("track")["title"]).get("image")
elif filterkeys.get("artist") is not None:
imgurl = getArtistInfo(keys.get("artist")).get("image")
#elif (len(scrobbles) != 0):
# imgurl = getTrackInfo(scrobbles[0]["artists"],scrobbles[0]["title"]).get("image")
@ -49,23 +44,9 @@ def instructions(keys,dbport):
# build list
maxbar = max([t["scrobbles"] for t in terms])
html_pulse = module_pulse(**filterkeys,**timekeys,**delimitkeys)
html = "<table class='list'>"
for t in terms:
fromstr = "/".join([str(e) for e in t["from"]])
tostr = "/".join([str(e) for e in t["to"]])
html += "<tr>"
#html += "<td>" + fromstr + "</td>"
#html += "<td>" + tostr + "</td>"
html += "<td>" + getRangeDesc(t["from"],t["to"]) + "</td>"
html += "<td class='amount'>" + scrobblesLink({"since":fromstr,"to":tostr},amount=t["scrobbles"],**limitkey) + "</td>"
html += "<td class='bar'>" + scrobblesLink({"since":fromstr,"to":tostr},percent=t["scrobbles"]*100/maxbar,**limitkey) + "</td>"
html += "</tr>"
html += "</table>"
replace = {"KEY_PULSE_TABLE":html,"KEY_IMAGEURL":imgurl,"KEY_LIMITS":limitstring}
replace = {"KEY_PULSE_TABLE":html_pulse,"KEY_IMAGEURL":imgurl,"KEY_LIMITS":limitstring}
return (replace,pushresources)

View File

@ -4,16 +4,11 @@ import json
def instructions(keys,dbport):
from utilities import getArtistInfo, getTrackInfo
from htmlgenerators import getTimeDesc, artistLink, artistLinks, trackLink, keysToUrl, pickKeys, clean
from htmlgenerators import getTimeDesc, artistLink, artistLinks, trackLink, keysToUrl, KeySplit
from htmlmodules import module_scrobblelist
clean(keys)
timekeys = pickKeys(keys,"since","to","in","max")
limitkeys = pickKeys(keys,"artist","title","associated")
# Get scrobble data
response = urllib.request.urlopen("http://[::1]:" + str(dbport) + "/scrobbles?" + keysToUrl(limitkeys,timekeys))
db_data = json.loads(response.read())
scrobbles = db_data["list"]
filterkeys, timekeys, _, amountkeys = KeySplit(keys)
# describe the scope
limitstring = ""
@ -30,33 +25,25 @@ def instructions(keys,dbport):
if moreartists != []:
limitstring += " <span class='extra'>including " + artistLinks(moreartists) + "</span>"
html, amount, rep = module_scrobblelist(**filterkeys,**timekeys,**amountkeys)
# get image
if limitkeys.get("title") is not None:
imgurl = getTrackInfo(limitkeys.getall("artist"),limitkeys.get("title")).get("image")
elif keys.get("artist") is not None:
if filterkeys.get("track") is not None:
imgurl = getTrackInfo(filterkeys.get("track")["artists"],filterkeys.get("track")["title"]).get("image")
elif filterkeys.get("artist") is not None:
imgurl = getArtistInfo(keys.get("artist")).get("image")
elif (len(scrobbles) != 0):
imgurl = getTrackInfo(scrobbles[0]["artists"],scrobbles[0]["title"]).get("image")
#imgurl = getArtistInfo(scrobbles[0]["artists"][0]).get("image")
elif rep is not None:
imgurl = getTrackInfo(rep["artists"],rep["title"]).get("image")
else:
imgurl = ""
pushresources = [{"file":imgurl,"type":"image"}] if imgurl.startswith("/") else []
# build list
html = "<table class='list'>"
for s in scrobbles:
html += "<tr>"
html += "<td class='time'>" + getTimeDesc(s["time"]) + "</td>"
#html += """<td class='icon' style="background-image:url('""" + getArtistInfo(s["artists"][0]).get("image") + """')" /></td>"""
html += "<td class='artists'>" + artistLinks(s["artists"]) + "</td>"
html += "<td class='title'>" + trackLink({"artists":s["artists"],"title":s["title"]}) + "</td>"
html += "</tr>"
html += "</table>"
replace = {"KEY_SCROBBLELIST":html,"KEY_SCROBBLES":str(len(scrobbles)),"KEY_IMAGEURL":imgurl,"KEY_LIMITS":limitstring}
replace = {"KEY_SCROBBLELIST":html,"KEY_SCROBBLES":str(amount),"KEY_IMAGEURL":imgurl,"KEY_LIMITS":limitstring}
return (replace,pushresources)

View File

@ -8,7 +8,7 @@
</head>
<body>
<h1><a href="/topartists">Top Artists</a></h1>
<h1><a href="/topartists?max=50">Top Artists</a></h1>
<table class="tiles_top">
<tr>
<td>
@ -58,7 +58,7 @@
<h1><a href="/toptracks">Top Tracks</a></h1>
<h1><a href="/toptracks?max=50">Top Tracks</a></h1>
<table class="tiles_top">
<tr>
<td>
@ -116,98 +116,9 @@
<span class="stats">This year</span> KEY_SCROBBLES_YEAR
<span class="stats">All Time</span> KEY_SCROBBLES_TOTAL
<br/><br/>
<table class='list'>
<tr>
<td class='time'>KEY_SCROBBLE_TIME</td>
<td class='icon'><div style="background-image:url('KEY_SCROBBLE_IMAGE')"></div></td>
<td class='artists'>KEY_SCROBBLE_ARTISTS</td>
<td class='title'>KEY_SCROBBLE_TITLE</td>
</tr>
<tr>
<td class='time'>KEY_SCROBBLE_TIME</td>
<td class='icon'><div style="background-image:url('KEY_SCROBBLE_IMAGE')"></div></td>
<td class='artists'>KEY_SCROBBLE_ARTISTS</td>
<td class='title'>KEY_SCROBBLE_TITLE</td>
</tr>
<tr>
<td class='time'>KEY_SCROBBLE_TIME</td>
<td class='icon'><div style="background-image:url('KEY_SCROBBLE_IMAGE')"></div></td>
<td class='artists'>KEY_SCROBBLE_ARTISTS</td>
<td class='title'>KEY_SCROBBLE_TITLE</td>
</tr>
<tr>
<td class='time'>KEY_SCROBBLE_TIME</td>
<td class='icon'><div style="background-image:url('KEY_SCROBBLE_IMAGE')"></div></td>
<td class='artists'>KEY_SCROBBLE_ARTISTS</td>
<td class='title'>KEY_SCROBBLE_TITLE</td>
</tr>
<tr>
<td class='time'>KEY_SCROBBLE_TIME</td>
<td class='icon'><div style="background-image:url('KEY_SCROBBLE_IMAGE')"></div></td>
<td class='artists'>KEY_SCROBBLE_ARTISTS</td>
<td class='title'>KEY_SCROBBLE_TITLE</td>
</tr>
<tr>
<td class='time'>KEY_SCROBBLE_TIME</td>
<td class='icon'><div style="background-image:url('KEY_SCROBBLE_IMAGE')"></div></td>
<td class='artists'>KEY_SCROBBLE_ARTISTS</td>
<td class='title'>KEY_SCROBBLE_TITLE</td>
</tr>
<tr>
<td class='time'>KEY_SCROBBLE_TIME</td>
<td class='icon'><div style="background-image:url('KEY_SCROBBLE_IMAGE')"></div></td>
<td class='artists'>KEY_SCROBBLE_ARTISTS</td>
<td class='title'>KEY_SCROBBLE_TITLE</td>
</tr>
<tr>
<td class='time'>KEY_SCROBBLE_TIME</td>
<td class='icon'><div style="background-image:url('KEY_SCROBBLE_IMAGE')"></div></td>
<td class='artists'>KEY_SCROBBLE_ARTISTS</td>
<td class='title'>KEY_SCROBBLE_TITLE</td>
</tr>
<tr>
<td class='time'>KEY_SCROBBLE_TIME</td>
<td class='icon'><div style="background-image:url('KEY_SCROBBLE_IMAGE')"></div></td>
<td class='artists'>KEY_SCROBBLE_ARTISTS</td>
<td class='title'>KEY_SCROBBLE_TITLE</td>
</tr>
<tr>
<td class='time'>KEY_SCROBBLE_TIME</td>
<td class='icon'><div style="background-image:url('KEY_SCROBBLE_IMAGE')"></div></td>
<td class='artists'>KEY_SCROBBLE_ARTISTS</td>
<td class='title'>KEY_SCROBBLE_TITLE</td>
</tr>
<tr>
<td class='time'>KEY_SCROBBLE_TIME</td>
<td class='icon'><div style="background-image:url('KEY_SCROBBLE_IMAGE')"></div></td>
<td class='artists'>KEY_SCROBBLE_ARTISTS</td>
<td class='title'>KEY_SCROBBLE_TITLE</td>
</tr>
<tr>
<td class='time'>KEY_SCROBBLE_TIME</td>
<td class='icon'><div style="background-image:url('KEY_SCROBBLE_IMAGE')"></div></td>
<td class='artists'>KEY_SCROBBLE_ARTISTS</td>
<td class='title'>KEY_SCROBBLE_TITLE</td>
</tr>
<tr>
<td class='time'>KEY_SCROBBLE_TIME</td>
<td class='icon'><div style="background-image:url('KEY_SCROBBLE_IMAGE')"></div></td>
<td class='artists'>KEY_SCROBBLE_ARTISTS</td>
<td class='title'>KEY_SCROBBLE_TITLE</td>
</tr>
<tr>
<td class='time'>KEY_SCROBBLE_TIME</td>
<td class='icon'><div style="background-image:url('KEY_SCROBBLE_IMAGE')"></div></td>
<td class='artists'>KEY_SCROBBLE_ARTISTS</td>
<td class='title'>KEY_SCROBBLE_TITLE</td>
</tr>
<tr>
<td class='time'>KEY_SCROBBLE_TIME</td>
<td class='icon'><div style="background-image:url('KEY_SCROBBLE_IMAGE')"></div></td>
<td class='artists'>KEY_SCROBBLE_ARTISTS</td>
<td class='title'>KEY_SCROBBLE_TITLE</td>
</tr>
</table>
KEY_SCROBBLES
<br/>
@ -220,70 +131,9 @@
<a href="/pulse?step=year&trail=1">Years</a>
-->
<br/><br/>
<table class='list'>
<tr>
<td>KEY_PULSE_TERM</td>
<td class='amount'>KEY_PULSE_AMOUNT</td>
<td class='bar'>KEY_PULSE_BAR</td>
</tr>
<tr>
<td>KEY_PULSE_TERM</td>
<td class='amount'>KEY_PULSE_AMOUNT</td>
<td class='bar'>KEY_PULSE_BAR</td>
</tr>
<tr>
<td>KEY_PULSE_TERM</td>
<td class='amount'>KEY_PULSE_AMOUNT</td>
<td class='bar'>KEY_PULSE_BAR</td>
</tr>
<tr>
<td>KEY_PULSE_TERM</td>
<td class='amount'>KEY_PULSE_AMOUNT</td>
<td class='bar'>KEY_PULSE_BAR</td>
</tr>
<tr>
<td>KEY_PULSE_TERM</td>
<td class='amount'>KEY_PULSE_AMOUNT</td>
<td class='bar'>KEY_PULSE_BAR</td>
</tr>
<tr>
<td>KEY_PULSE_TERM</td>
<td class='amount'>KEY_PULSE_AMOUNT</td>
<td class='bar'>KEY_PULSE_BAR</td>
</tr>
<tr>
<td>KEY_PULSE_TERM</td>
<td class='amount'>KEY_PULSE_AMOUNT</td>
<td class='bar'>KEY_PULSE_BAR</td>
</tr>
<tr>
<td>KEY_PULSE_TERM</td>
<td class='amount'>KEY_PULSE_AMOUNT</td>
<td class='bar'>KEY_PULSE_BAR</td>
</tr>
<tr>
<td>KEY_PULSE_TERM</td>
<td class='amount'>KEY_PULSE_AMOUNT</td>
<td class='bar'>KEY_PULSE_BAR</td>
</tr>
<tr>
<td>KEY_PULSE_TERM</td>
<td class='amount'>KEY_PULSE_AMOUNT</td>
<td class='bar'>KEY_PULSE_BAR</td>
</tr>
<tr>
<td>KEY_PULSE_TERM</td>
<td class='amount'>KEY_PULSE_AMOUNT</td>
<td class='bar'>KEY_PULSE_BAR</td>
</tr>
<tr>
<td>KEY_PULSE_TERM</td>
<td class='amount'>KEY_PULSE_AMOUNT</td>
<td class='bar'>KEY_PULSE_BAR</td>
</tr>
</table>
KEY_PULSE
</div>

View File

@ -4,6 +4,8 @@ from threading import Thread
from datetime import datetime
#import database
from htmlmodules import module_scrobblelist, module_pulse
def getpictures(ls,result,tracks=False):
from utilities import getArtistsInfo, getTracksInfo
@ -60,19 +62,21 @@ def instructions(keys,dbport):
# get scrobbles
response = urllib.request.urlopen("http://[::1]:" + str(dbport) + "/scrobbles?max=50")
db_data = json.loads(response.read())
scrobblelist = db_data["list"]
#scrobblelist = database.get_scrobbles(max=50)
scrobbletrackobjects = scrobblelist #ignore the extra time attribute, the format should still work
scrobbleartists = [", ".join([artistLink(a) for a in s["artists"]]) for s in scrobblelist]
scrobbletitles = [s["title"] for s in scrobblelist]
scrobbletimes = [getTimeDesc(s["time"],short=True) for s in scrobblelist]
scrobbleimages = []
t3 = Thread(target=getpictures,args=(scrobbletrackobjects,scrobbleimages,),kwargs={"tracks":True})
t3.start()
#scrobbleimages = [info.get("image") for info in getTracksInfo(scrobbletrackobjects)]
scrobbletracklinks = [trackLink(t) for t in scrobbletrackobjects]
# response = urllib.request.urlopen("http://[::1]:" + str(dbport) + "/scrobbles?max=50")
# db_data = json.loads(response.read())
# scrobblelist = db_data["list"]
# #scrobblelist = database.get_scrobbles(max=50)
# scrobbletrackobjects = scrobblelist #ignore the extra time attribute, the format should still work
# scrobbleartists = [", ".join([artistLink(a) for a in s["artists"]]) for s in scrobblelist]
# scrobbletitles = [s["title"] for s in scrobblelist]
# scrobbletimes = [getTimeDesc(s["time"],short=True) for s in scrobblelist]
# scrobbleimages = []
# t3 = Thread(target=getpictures,args=(scrobbletrackobjects,scrobbleimages,),kwargs={"tracks":True})
# t3.start()
# #scrobbleimages = [info.get("image") for info in getTracksInfo(scrobbletrackobjects)]
# scrobbletracklinks = [trackLink(t) for t in scrobbletrackobjects]
html_scrobbles, _, _ = module_scrobblelist(max_=15,shortTimeDesc=True,pictures=True)
# get stats
@ -101,33 +105,36 @@ def instructions(keys,dbport):
# this is literally the ugliest piece of code i have written in my entire feckin life
# good lord
response = urllib.request.urlopen("http://[::1]:" + str(dbport) + "/pulse?step=month&trail=1&since=" + dts)
db_data = json.loads(response.read())
terms = db_data["list"]
# response = urllib.request.urlopen("http://[::1]:" + str(dbport) + "/pulse?step=month&trail=1&since=" + dts)
# db_data = json.loads(response.read())
# terms = db_data["list"]
maxbar = max([t["scrobbles"] for t in terms])
#pulse_fromdates = ["/".join([str(e) for e in t["from"]]) for t in terms]
#pulse_todates = ["/".join([str(e) for e in t["to"]]) for t in terms]
pulse_rangedescs = [getRangeDesc(t["from"],t["to"]) for t in terms]
pulse_amounts = [scrobblesLink({"since":"/".join([str(e) for e in t["from"]]),"to":"/".join([str(e) for e in t["to"]])},amount=t["scrobbles"]) for t in terms]
pulse_bars = [scrobblesLink({"since":"/".join([str(e) for e in t["from"]]),"to":"/".join([str(e) for e in t["to"]])},percent=t["scrobbles"]*100/maxbar) for t in terms]
# maxbar = max([t["scrobbles"] for t in terms])
# #pulse_fromdates = ["/".join([str(e) for e in t["from"]]) for t in terms]
# #pulse_todates = ["/".join([str(e) for e in t["to"]]) for t in terms]
# pulse_rangedescs = [getRangeDesc(t["from"],t["to"]) for t in terms]
# pulse_amounts = [scrobblesLink({"since":"/".join([str(e) for e in t["from"]]),"to":"/".join([str(e) for e in t["to"]])},amount=t["scrobbles"]) for t in terms]
# pulse_bars = [scrobblesLink({"since":"/".join([str(e) for e in t["from"]]),"to":"/".join([str(e) for e in t["to"]])},percent=t["scrobbles"]*100/maxbar) for t in terms]
html_pulse = module_pulse(max_=12,since=dts,step="month",trail=1)
t1.join()
t2.join()
t3.join()
#t3.join()
pushresources = [{"file":img,"type":"image"} for img in artistimages + trackimages + scrobbleimages if img.startswith("/")]
#pushresources = [{"file":img,"type":"image"} for img in artistimages + trackimages + scrobbleimages if img.startswith("/")]
pushresources = []
replace = {"KEY_ARTISTIMAGE":artistimages,"KEY_ARTISTNAME":artisttitles,"KEY_ARTISTLINK":artistlinks,"KEY_POSITION_ARTIST":posrange,
"KEY_TRACKIMAGE":trackimages,"KEY_TRACKNAME":tracktitles,"KEY_TRACKLINK":tracklinks,"KEY_POSITION_TRACK":posrange,
"KEY_SCROBBLES_TODAY":scrobbles_today,"KEY_SCROBBLES_MONTH":scrobbles_month,"KEY_SCROBBLES_YEAR":scrobbles_year,"KEY_SCROBBLES_TOTAL":scrobbles_total,
"KEY_SCROBBLE_TIME":scrobbletimes,"KEY_SCROBBLE_ARTISTS":scrobbleartists,"KEY_SCROBBLE_TITLE":scrobbletracklinks,"KEY_SCROBBLE_IMAGE":scrobbleimages,
"KEY_PULSE_TERM":pulse_rangedescs,"KEY_PULSE_AMOUNT":pulse_amounts,"KEY_PULSE_BAR":pulse_bars}
#"KEY_SCROBBLE_TIME":scrobbletimes,"KEY_SCROBBLE_ARTISTS":scrobbleartists,"KEY_SCROBBLE_TITLE":scrobbletracklinks,"KEY_SCROBBLE_IMAGE":scrobbleimages,
"KEY_SCROBBLES":html_scrobbles,
#"KEY_PULSE_TERM":pulse_rangedescs,"KEY_PULSE_AMOUNT":pulse_amounts,"KEY_PULSE_BAR":pulse_bars
"KEY_PULSE":html_pulse
}
return (replace,pushresources)

View File

@ -16,7 +16,7 @@
<td class="text">
<h1>Top Artists</h1><br/>
<span>in KEY_RANGE</span>
<p class="stats">KEY_SCROBBLES Scrobbles</p>
<!--<p class="stats">KEY_SCROBBLES Scrobbles</p>-->
</td>
</tr>

View File

@ -4,47 +4,60 @@ import json
def instructions(keys,dbport):
from utilities import getArtistInfo
from htmlgenerators import artistLink, artistLinks, trackLink, scrobblesArtistLink, keysToUrl, pickKeys, clean
from htmlgenerators import KeySplit
from htmlmodules import module_artistcharts
clean(keys)
timekeys = pickKeys(keys,"since","to","in")
limitkeys = pickKeys(keys)
# clean(keys)
# timekeys = pickKeys(keys,"since","to","in")
# limitkeys = pickKeys(keys)
_, timekeys, _, amountkeys = KeySplit(keys)
# get chart data
response = urllib.request.urlopen("http://[::1]:" + str(dbport) + "/charts/artists?" + keysToUrl(timekeys,limitkeys))
db_data = json.loads(response.read())
charts = db_data["list"][:50]
topartist = charts[0]["artist"]
# response = urllib.request.urlopen("http://[::1]:" + str(dbport) + "/charts/artists?" + keysToUrl(timekeys,limitkeys))
# db_data = json.loads(response.read())
# charts = db_data["list"][:50]
# topartist = charts[0]["artist"]
# info = getArtistInfo(topartist)
# imgurl = info.get("image")
info = getArtistInfo(topartist)
imgurl = info.get("image")
pushresources = [{"file":imgurl,"type":"image"}] if imgurl.startswith("/") else []
# get total amount of scrobbles
response = urllib.request.urlopen("http://[::1]:" + str(dbport) + "/scrobbles?" + keysToUrl(timekeys,limitkeys))
db_data = json.loads(response.read())
scrobblelist = db_data["list"]
scrobbles = len(scrobblelist)
#response = urllib.request.urlopen("http://[::1]:" + str(dbport) + "/scrobbles?" + keysToUrl(timekeys,limitkeys))
#db_data = json.loads(response.read())
#scrobblelist = db_data["list"]
#scrobbles = len(scrobblelist)
html_charts, rep = module_artistcharts(**amountkeys,**timekeys)
if rep is not None:
imgurl = getArtistInfo(rep).get("image")
else:
imgurl = ""
pushresources = [{"file":imgurl,"type":"image"}] if imgurl.startswith("/") else []
# build list
maxbar = charts[0]["scrobbles"]
i = 1
html = "<table class='list'>"
for e in charts:
html += "<tr>"
html += "<td class='rank'>#" + str(i) + "</td>"
html += "<td class='artist'>" + artistLink(e["artist"])
if (e["counting"] != []):
html += " <span class='extra'>incl. " + ", ".join([artistLink(a) for a in e["counting"]]) + "</span>"
html += "</td>"
html += "<td class='amount'>" + scrobblesArtistLink(e["artist"],timekeys,amount=e["scrobbles"],associated=True) + "</td>"
html += "<td class='bar'>" + scrobblesArtistLink(e["artist"],timekeys,percent=e["scrobbles"]*100/maxbar,associated=True) + "</td>"
html += "</tr>"
i += 1
html += "</table>"
# maxbar = charts[0]["scrobbles"]
#
# i = 1
# html = "<table class='list'>"
# for e in charts:
# html += "<tr>"
# html += "<td class='rank'>#" + str(i) + "</td>"
# html += "<td class='artist'>" + artistLink(e["artist"])
# if (e["counting"] != []):
# html += " <span class='extra'>incl. " + ", ".join([artistLink(a) for a in e["counting"]]) + "</span>"
# html += "</td>"
# html += "<td class='amount'>" + scrobblesArtistLink(e["artist"],timekeys,amount=e["scrobbles"],associated=True) + "</td>"
# html += "<td class='bar'>" + scrobblesArtistLink(e["artist"],timekeys,percent=e["scrobbles"]*100/maxbar,associated=True) + "</td>"
# html += "</tr>"
# i += 1
# html += "</table>"
replace = {"KEY_TOPARTIST_IMAGEURL":imgurl,"KEY_SCROBBLES":str(scrobbles),"KEY_ARTISTLIST":html}
replace = {"KEY_TOPARTIST_IMAGEURL":imgurl,"KEY_ARTISTLIST":html_charts}
return (replace,pushresources)

View File

@ -16,7 +16,7 @@
<td class="text">
<h1>Top Tracks</h1><br/>
<span>KEY_LIMITS</span>
<p class="stats">KEY_SCROBBLES Scrobbles</p>
<!--<p class="stats">KEY_SCROBBLES Scrobbles</p>-->
</td>
</tr>

View File

@ -4,57 +4,70 @@ import json
def instructions(keys,dbport):
from utilities import getArtistInfo, getTrackInfo
from htmlgenerators import artistLink, artistLinks, trackLink, scrobblesTrackLink, keysToUrl, pickKeys, clean
from htmlgenerators import artistLink, KeySplit
from htmlmodules import module_trackcharts
clean(keys)
timekeys = pickKeys(keys,"since","to","in")
limitkeys = pickKeys(keys,"artist")
# clean(keys)
# timekeys = pickKeys(keys,"since","to","in")
# limitkeys = pickKeys(keys,"artist")
# get chart data
response = urllib.request.urlopen("http://[::1]:" + str(dbport) + "/charts/tracks?" + keysToUrl(timekeys,limitkeys))
db_data = json.loads(response.read())
charts = db_data["list"][:50]
filterkeys, timekeys, _, amountkeys = KeySplit(keys)
limitstring = ""
if keys.get("artist") is not None:
topartist = keys.get("artist")
#limitstring += "by " + ", ".join([artistLink(a) for a in keys.getall("artist")])
limitstring = "by " + artistLink(keys.get("artist"))
info = getArtistInfo(topartist)
imgurl = info.get("image")
else:
#topartist = charts[0]["track"]["artists"][0] #for now
info = getTrackInfo(charts[0]["track"]["artists"],charts[0]["track"]["title"])
imgurl = info.get("image")
pushresources = [{"file":imgurl,"type":"image"}] if imgurl.startswith("/") else []
if filterkeys.get("artist") is not None:
topartist = filterkeys.get("artist")
# #limitstring += "by " + ", ".join([artistLink(a) for a in keys.getall("artist")])
limitstring = "by " + artistLink(filterkeys.get("artist"))
# info = getArtistInfo(topartist)
# imgurl = info.get("image")
# else:
# #topartist = charts[0]["track"]["artists"][0] #for now
# info = getTrackInfo(charts[0]["track"]["artists"],charts[0]["track"]["title"])
# imgurl = info.get("image")
# get total amount of scrobbles
response = urllib.request.urlopen("http://[::1]:" + str(dbport) + "/scrobbles?" + keysToUrl(timekeys,limitkeys))
db_data = json.loads(response.read())
scrobblelist = db_data["list"]
scrobbles = len(scrobblelist)
# response = urllib.request.urlopen("http://[::1]:" + str(dbport) + "/scrobbles?" + keysToUrl(timekeys,limitkeys))
# db_data = json.loads(response.read())
# scrobblelist = db_data["list"]
# scrobbles = len(scrobblelist)
html_charts, rep = module_trackcharts(**amountkeys,**timekeys,**filterkeys)
if filterkeys.get("artist") is not None:
imgurl = getArtistInfo(filterkeys.get("artist")).get("image")
limitstring = "by " + artistLink(filterkeys.get("artist"))
elif rep is not None:
imgurl = getTrackInfo(rep["artists"],rep["title"]).get("image")
else:
imgurl = ""
pushresources = [{"file":imgurl,"type":"image"}] if imgurl.startswith("/") else []
# build list
maxbar = charts[0]["scrobbles"]
i = 1
html = "<table class='list'>"
for e in charts:
html += "<tr>"
html += "<td class='rank'>#" + str(i) + "</td>"
html += "<td class='artists'>" + artistLinks(e["track"]["artists"]) + "</td>"
html += "<td class='title'>" + trackLink(e["track"]) + "</td>"
html += "<td class='amount'>" + scrobblesTrackLink(e["track"],timekeys,amount=e["scrobbles"]) + "</td>"
html += "<td class='bar'>" + scrobblesTrackLink(e["track"],timekeys,percent=e["scrobbles"]*100/maxbar) + "</td>"
html += "</tr>"
i += 1
html += "</table>"
# maxbar = charts[0]["scrobbles"]
#
# i = 1
# html = "<table class='list'>"
# for e in charts:
# html += "<tr>"
# html += "<td class='rank'>#" + str(i) + "</td>"
# html += "<td class='artists'>" + artistLinks(e["track"]["artists"]) + "</td>"
# html += "<td class='title'>" + trackLink(e["track"]) + "</td>"
# html += "<td class='amount'>" + scrobblesTrackLink(e["track"],timekeys,amount=e["scrobbles"]) + "</td>"
# html += "<td class='bar'>" + scrobblesTrackLink(e["track"],timekeys,percent=e["scrobbles"]*100/maxbar) + "</td>"
# html += "</tr>"
# i += 1
# html += "</table>"
replace = {"KEY_TOPARTIST_IMAGEURL":imgurl,"KEY_SCROBBLES":str(scrobbles),"KEY_TRACKLIST":html,"KEY_LIMITS":limitstring}
replace = {"KEY_TOPARTIST_IMAGEURL":imgurl,"KEY_TRACKLIST":html_charts,"KEY_LIMITS":limitstring}
return (replace,pushresources)

View File

@ -15,7 +15,7 @@
</td>
<td class="text">
<span>KEY_ARTISTS</span><br/>
<h1>KEY_TRACKTITLE</h1> <span class="rank"><a href="/toptracks">KEY_POSITION</a></span>
<h1>KEY_TRACKTITLE</h1> <span class="rank"><a href="/toptracks?max=100">KEY_POSITION</a></span>
<p class="stats"><a href="/scrobbles?KEY_SCROBBLELINK">KEY_SCROBBLES Scrobbles</a></p>

View File

@ -1,63 +1,67 @@
import urllib
import json
import database
def instructions(keys,dbport):
from utilities import getArtistInfo, getTrackInfo
from htmlgenerators import clean, artistLink, artistLinks, trackLink, scrobblesTrackLink, keysToUrl, pickKeys, getTimeDesc, getRangeDesc, scrobblesLink
from htmlgenerators import clean, artistLink, artistLinks, trackLink, scrobblesTrackLink, keysToUrl, pickKeys, getTimeDesc, getRangeDesc, scrobblesLink, KeySplit
from htmlmodules import module_scrobblelist, module_pulse
clean(keys)
limitkeys = pickKeys(keys,"artist","title")
trackobject = {"artists":limitkeys.getall("artist"),"title":limitkeys.get("title")}
info = getTrackInfo(keys.getall("artist"),keys.get("title"))
imgurl = info.get("image")
filterkeys, _, _, _ = KeySplit(keys)
track = filterkeys.get("track")
imgurl = getTrackInfo(track["artists"],track["title"]).get("image")
pushresources = [{"file":imgurl,"type":"image"}] if imgurl.startswith("/") else []
response = urllib.request.urlopen("http://[::1]:" + str(dbport) + "/trackinfo?" + keysToUrl(limitkeys))
db_data = json.loads(response.read())
scrobblesnum = str(db_data["scrobbles"])
pos = "#" + str(db_data["position"])
data = database.trackInfo(track["artists"],track["title"])
scrobblesnum = str(data["scrobbles"])
pos = "#" + str(data["position"])
response = urllib.request.urlopen("http://[::1]:" + str(dbport) + "/scrobbles?" + keysToUrl(limitkeys))
db_data = json.loads(response.read())
scrobbles = db_data["list"]
#response = urllib.request.urlopen("http://[::1]:" + str(dbport) + "/scrobbles?" + keysToUrl(limitkeys))
#db_data = json.loads(response.read())
#scrobbles = db_data["list"]
# build list
html = "<table class='list'>"
for s in scrobbles:
html += "<tr>"
html += "<td class='time'>" + getTimeDesc(s["time"]) + "</td>"
html += "<td class='artists'>" + artistLinks(s["artists"]) + "</td>"
html += "<td class='title'>" + trackLink({"artists":s["artists"],"title":s["title"]}) + "</td>"
html += "</tr>"
html += "</table>"
# html = "<table class='list'>"
# for s in scrobbles:
# html += "<tr>"
# html += "<td class='time'>" + getTimeDesc(s["time"]) + "</td>"
# html += "<td class='artists'>" + artistLinks(s["artists"]) + "</td>"
# html += "<td class='title'>" + trackLink({"artists":s["artists"],"title":s["title"]}) + "</td>"
# html += "</tr>"
# html += "</table>"
html_scrobbles, _, _ = module_scrobblelist(track=track,max_=100)
# pulse
response = urllib.request.urlopen("http://[::1]:" + str(dbport) + "/pulse?step=year&trail=1&" + keysToUrl(limitkeys))
db_data = json.loads(response.read())
terms = db_data["list"]
# response = urllib.request.urlopen("http://[::1]:" + str(dbport) + "/pulse?step=year&trail=1&" + keysToUrl(limitkeys))
# db_data = json.loads(response.read())
# terms = db_data["list"]
# build list
maxbar = max([t["scrobbles"] for t in terms])
# maxbar = max([t["scrobbles"] for t in terms])
html_pulse = "<table class='list'>"
for t in terms:
fromstr = "/".join([str(e) for e in t["from"]])
tostr = "/".join([str(e) for e in t["to"]])
html_pulse += "<tr>"
#html += "<td>" + fromstr + "</td>"
#html += "<td>" + tostr + "</td>"
html_pulse += "<td>" + getRangeDesc(t["from"],t["to"]) + "</td>"
html_pulse += "<td class='amount'>" + scrobblesLink({"since":fromstr,"to":tostr},amount=t["scrobbles"],track=trackobject) + "</td>"
html_pulse += "<td class='bar'>" + scrobblesLink({"since":fromstr,"to":tostr},percent=t["scrobbles"]*100/maxbar,track=trackobject) + "</td>"
html_pulse += "</tr>"
html_pulse += "</table>"
# html_pulse = "<table class='list'>"
# for t in terms:
# fromstr = "/".join([str(e) for e in t["from"]])
# tostr = "/".join([str(e) for e in t["to"]])
# html_pulse += "<tr>"
# #html += "<td>" + fromstr + "</td>"
# #html += "<td>" + tostr + "</td>"
# html_pulse += "<td>" + getRangeDesc(t["from"],t["to"]) + "</td>"
# html_pulse += "<td class='amount'>" + scrobblesLink({"since":fromstr,"to":tostr},amount=t["scrobbles"],track=trackobject) + "</td>"
# html_pulse += "<td class='bar'>" + scrobblesLink({"since":fromstr,"to":tostr},percent=t["scrobbles"]*100/maxbar,track=trackobject) + "</td>"
# html_pulse += "</tr>"
# html_pulse += "</table>"
html_pulse = module_pulse(track=track,step="year",stepn=1,trail=1)
replace = {"KEY_TRACKTITLE":limitkeys.get("title"),"KEY_ARTISTS":artistLinks(limitkeys.getall("artist")),"KEY_SCROBBLES":scrobblesnum,"KEY_IMAGEURL":imgurl,
"KEY_SCROBBLELINK":keysToUrl(limitkeys),"KEY_SCROBBLELIST":html,"KEY_POSITION":pos,"KEY_PULSE":html_pulse}
replace = {"KEY_TRACKTITLE":track.get("title"),"KEY_ARTISTS":artistLinks(track.get("artists")),"KEY_SCROBBLES":scrobblesnum,"KEY_IMAGEURL":imgurl,
"KEY_SCROBBLELINK":keysToUrl(keys),"KEY_SCROBBLELIST":html_scrobbles,"KEY_POSITION":pos,"KEY_PULSE":html_pulse}
return (replace,pushresources)