From 9846fd9952d865f9f13ea6922397a3db89df2e4c Mon Sep 17 00:00:00 2001 From: Krateng Date: Tue, 9 Apr 2019 13:34:06 +0200 Subject: [PATCH] Experimental performance web view --- htmlgenerators.py | 23 +++++++++++++++++ htmlmodules.py | 39 +++++++++++++++++++++++++++++ website/artist.py | 6 ++--- website/css/maloja.css | 43 ++++++++++++++++++++++++++------ website/performance.html | 29 +++++++++++++++++++++ website/performance.py | 54 ++++++++++++++++++++++++++++++++++++++++ website/track.py | 6 ++--- 7 files changed, 187 insertions(+), 13 deletions(-) create mode 100644 website/performance.html create mode 100644 website/performance.py 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 += "" + html += "" + prct = (minrank+1-t["rank"])*100/minrank if t["rank"] is not None else 0 + html += "" + html += "" + html += "
" + range_desc(t["from"],t["to"],short=True) + "" + ("#" + str(t["rank"]) if t["rank"] is not None else "No scrobbles") + "" + rankLink({"since":fromstr,"to":tostr},percent=prct,**kwargs_filter,medal=t["rank"]) + "
" + + + 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) + ""