diff --git a/htmlgenerators.py b/htmlgenerators.py
index 4073ef4..03d65b1 100644
--- a/htmlgenerators.py
+++ b/htmlgenerators.py
@@ -92,6 +92,29 @@ def scrobblesLink(timekeys,amount=None,percent=None,artist=None,track=None,assoc
+def rankTrackLink(track,timekeys,rank=None,percent=None,medal=None):
+ cl = ""
+ if medal == 1: cl = "class='gold'"
+ if medal == 2: cl = "class='silver'"
+ if medal == 3: cl = "class='bronze'"
+ inner = str(rank) if rank is not None else "
"
+
+ return "" + inner + ""
+
+def rankArtistLink(artist,timekeys,rank=None,percent=None,medal=None):
+ cl = ""
+ if medal == 1: cl = "class='gold'"
+ if medal == 2: cl = "class='silver'"
+ if medal == 3: cl = "class='bronze'"
+ inner = str(rank) if rank is not None else ""
+ return "" + inner + ""
+
+def rankLink(timekeys,rank=None,percent=None,artist=None,track=None,medal=None):
+ if track is not None: return rankTrackLink(track,timekeys,rank,percent,medal)
+ if artist is not None: return rankArtistLink(artist,timekeys,rank,percent,medal)
+
+
+
# limit a multidict to only the specified keys
# would be a simple constructor expression, but multidicts apparently don't let me do that
def pickKeys(d,*keys):
diff --git a/htmlmodules.py b/htmlmodules.py
index ed12084..c4a9e11 100644
--- a/htmlmodules.py
+++ b/htmlmodules.py
@@ -93,6 +93,45 @@ def module_pulse(max_=None,**kwargs):
return html
+
+
+def module_performance(max_=None,**kwargs):
+
+ kwargs_filter = pickKeys(kwargs,"artist","track")
+ kwargs_time = pickKeys(kwargs,"since","to","within","step","stepn","trail")
+
+ ranges = database.get_performance(**kwargs_time,**kwargs_filter)
+
+ if max_ is not None: ranges = ranges[:max_]
+
+ # if time range not explicitly specified, only show from first appearance
+# if "since" not in kwargs:
+# while ranges[0]["scrobbles"] == 0:
+# del ranges[0]
+
+
+ minrank = 80
+ for t in ranges:
+ if t["rank"] is not None and t["rank"] > minrank: minrank = t["rank"]
+
+ #build list
+ html = ""
+ for t in ranges:
+ fromstr = "/".join([str(e) for e in t["from"]])
+ tostr = "/".join([str(e) for e in t["to"]])
+ html += ""
+ html += "" + range_desc(t["from"],t["to"],short=True) + " | "
+ html += "" + ("#" + str(t["rank"]) if t["rank"] is not None else "No scrobbles") + " | "
+ prct = (minrank+1-t["rank"])*100/minrank if t["rank"] is not None else 0
+ html += "" + rankLink({"since":fromstr,"to":tostr},percent=prct,**kwargs_filter,medal=t["rank"]) + " | "
+ html += "
"
+ html += "
"
+
+
+ return html
+
+
+
def module_trackcharts(max_=None,**kwargs):
kwargs_filter = pickKeys(kwargs,"artist","associated")
diff --git a/website/artist.py b/website/artist.py
index 185874c..aef0ec6 100644
--- a/website/artist.py
+++ b/website/artist.py
@@ -20,13 +20,13 @@ def instructions(keys):
if "medals" in data and data["medals"] is not None:
if "gold" in data["medals"]:
for y in data["medals"]["gold"]:
- html_medals += "" + str(y) + ""
+ html_medals += "" + str(y) + ""
if "silver" in data["medals"]:
for y in data["medals"]["silver"]:
- html_medals += "" + str(y) + ""
+ html_medals += "" + str(y) + ""
if "bronze" in data["medals"]:
for y in data["medals"]["bronze"]:
- html_medals += "" + str(y) + ""
+ html_medals += "" + str(y) + ""
credited = data.get("replace")
includestr = " "
diff --git a/website/css/maloja.css b/website/css/maloja.css
index baa531a..32c9750 100644
--- a/website/css/maloja.css
+++ b/website/css/maloja.css
@@ -305,16 +305,18 @@ span.stat_selector_pulse,span.stat_selector_topartists,span.stat_selector_toptra
/* SHINY*/
.medal {
top:5px;
- position:relative;
- overflow: hidden;
- display: inline-block;
-
font-size:80%;
padding:3px;
margin:2px;
border-radius:2px;
}
-.medal:after {
+.shiny {
+ overflow: hidden;
+ position:relative;
+ display: inline-block;
+}
+
+.shiny:after {
content: "";
position: absolute;
top: -110%;
@@ -333,7 +335,7 @@ span.stat_selector_pulse,span.stat_selector_topartists,span.stat_selector_toptra
rgba(255, 255, 255, 0.0) 100%
);
}
-.medal:hover:after {
+.shiny:hover:after {
opacity: 1;
top: -30%;
left: -30%;
@@ -341,7 +343,7 @@ span.stat_selector_pulse,span.stat_selector_topartists,span.stat_selector_toptra
transition-duration: 0.7s, 0.7s, 0.15s;
transition-timing-function: ease;
}
-.medal:active:after {
+.shiny:active:after {
opacity: 0;
}
@@ -502,6 +504,33 @@ table.list tr:hover td.bar div {
cursor:pointer;
}
+table.list td.chart {
+ width:500px;
+ background-color:#333337;
+ /* Remove 5er separators for bars */
+ /*border-color:rgba(0,0,0,0)!important;*/
+}
+table.list td.chart div {
+ background-color:beige;
+ height:20px; /* can only do this absolute apparently */
+ position:relative;
+}
+table.list tr:hover td.chart div {
+ cursor:pointer;
+}
+
+table.list tr td.chart div.gold {
+ background-color:gold;
+}
+table.list tr td.chart div.silver {
+ background-color:silver;
+}
+table.list tr td.chart div.bronze {
+ background-color:#cd7f32;
+}
+
+
+
table.list tr td.button {
width:200px;
cursor:pointer;
diff --git a/website/performance.html b/website/performance.html
new file mode 100644
index 0000000..5c368e6
--- /dev/null
+++ b/website/performance.html
@@ -0,0 +1,29 @@
+
+
+
+
+
+ Maloja - KEY_PULSEDETAILS Performance
+
+
+
+
+
+
+
+ |
+
+ KEY_PULSEDETAILS Performance
+ KEY_LIMITS
+
+
+ KEY_FILTERSELECTOR
+
+ |
+
+
+
+ KEY_PERFORMANCE_TABLE
+
+
+
diff --git a/website/performance.py b/website/performance.py
new file mode 100644
index 0000000..b57dbf3
--- /dev/null
+++ b/website/performance.py
@@ -0,0 +1,54 @@
+import urllib
+import database
+
+
+def instructions(keys):
+ from utilities import getArtistImage, getTrackImage
+ from htmlgenerators import artistLink, artistLinks, trackLink, scrobblesLink
+ from urihandler import compose_querystring, uri_to_internal
+ from htmlmodules import module_performance, module_filterselection
+ from malojatime import range_desc, delimit_desc
+
+ filterkeys, timekeys, delimitkeys, _ = uri_to_internal(keys)
+
+
+ # describe the scope (and creating a key for the relevant artist or track)
+ limitstring = ""
+ #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 filterkeys.get("artist") is not None:
+ #limitkey["artist"], limitkey["associated"] = keys.get("artist"), (keys.get("associated")!=None)
+ limitstring += "of " + artistLink(filterkeys.get("artist"))
+
+ limitstring += " " + range_desc(**timekeys)
+
+ delimitstring = delimit_desc(**delimitkeys)
+
+ html_filterselector = module_filterselection(keys,delimit=True)
+
+
+ # get image
+ if filterkeys.get("track") is not None:
+ imgurl = getTrackImage(filterkeys.get("track")["artists"],filterkeys.get("track")["title"])
+ elif filterkeys.get("artist") is not None:
+ imgurl = getArtistImage(keys.get("artist"))
+ else:
+ imgurl = ""
+
+ pushresources = [{"file":imgurl,"type":"image"}] if imgurl.startswith("/") else []
+
+
+
+ html_performance = module_performance(**filterkeys,**timekeys,**delimitkeys)
+
+ replace = {"KEY_PERFORMANCE_TABLE":html_performance,
+ "KEY_IMAGEURL":imgurl,
+ "KEY_LIMITS":limitstring,
+ "KEY_PULSEDETAILS":delimitstring,
+ "KEY_FILTERSELECTOR":html_filterselector}
+
+ return (replace,pushresources)
diff --git a/website/track.py b/website/track.py
index 48cb042..c8e769f 100644
--- a/website/track.py
+++ b/website/track.py
@@ -25,13 +25,13 @@ def instructions(keys):
if "medals" in data and data["medals"] is not None:
if "gold" in data["medals"]:
for y in data["medals"]["gold"]:
- html_medals += "" + str(y) + ""
+ html_medals += "" + str(y) + ""
if "silver" in data["medals"]:
for y in data["medals"]["silver"]:
- html_medals += "" + str(y) + ""
+ html_medals += "" + str(y) + ""
if "bronze" in data["medals"]:
for y in data["medals"]["bronze"]:
- html_medals += "" + str(y) + ""
+ html_medals += "" + str(y) + ""