diff --git a/htmlgenerators.py b/htmlgenerators.py index 97d492c..5950454 100644 --- a/htmlgenerators.py +++ b/htmlgenerators.py @@ -3,28 +3,28 @@ from bottle import FormsDict import datetime -def artistLink(name): +def artistLink(name): return "" + name + "" - + def artistLinks(artists): return ", ".join([artistLink(a) for a in artists]) - + #def trackLink(artists,title): def trackLink(track): artists,title = track["artists"],track["title"] return "" + title + "" - + #def scrobblesTrackLink(artists,title,timekeys,amount=None,pixels=None): def scrobblesTrackLink(track,timekeys,amount=None,percent=None): artists,title = track["artists"],track["title"] inner = str(amount) if amount is not None else "
" return "" + inner + "" - + def scrobblesArtistLink(artist,timekeys,amount=None,percent=None,associated=False): inner = str(amount) if amount is not None else "
" askey = "&associated" if associated else "" return "" + inner + "" - + def scrobblesLink(timekeys,amount=None,percent=None,artist=None,track=None,associated=False): if track is not None: return scrobblesTrackLink(track,timekeys,amount,percent) if artist is not None: return scrobblesArtistLink(artist,timekeys,amount,percent,associated) @@ -32,15 +32,17 @@ def scrobblesLink(timekeys,amount=None,percent=None,artist=None,track=None,assoc return "" + inner + "" # necessary because urllib.parse.urlencode doesnt handle multidicts -def keysToUrl(*dicts): +def keysToUrl(*dicts,exclude=[]): st = "" keys = removeIdentical(*dicts) for k in keys: + if k in exclude: continue values = keys.getall(k) st += "&".join([urllib.parse.urlencode({k:v},safe="/") for v in values]) st += "&" return st - + + def removeIdentical(*dicts): #combine multiple dicts keys = FormsDict() @@ -52,21 +54,21 @@ def removeIdentical(*dicts): except: #normaldicts v = d.get(k) keys.append(k,v) - + new = FormsDict() for k in keys: values = set(keys.getall(k)) for v in values: new.append(k,v) - + return new - + #def getTimeDesc(timestamp,short=False): # tim = datetime.datetime.utcfromtimestamp(timestamp) # if short: # now = datetime.datetime.now(tz=datetime.timezone.utc) # difference = int(now.timestamp() - timestamp) -# +# # if difference < 10: return "just now" # if difference < 60: return str(difference) + " seconds ago" # difference = int(difference/60) @@ -78,16 +80,16 @@ def removeIdentical(*dicts): # if difference < 31: return str(difference) + " days ago" if difference>1 else str(difference) + " day ago" # #if difference < 300 and tim.year == now.year: return tim.strftime("%B") # #if difference < 300: return tim.strftime("%B %Y") -# +# # return tim.strftime("%d. %B %Y") # else: # return tim.strftime("%d. %b %Y %I:%M %p") - + #def getRangeDesc(since=None,to=None,inclusiveB=True): # # string to list # if isinstance(timeA,str): timeA = timeA.split("/") # if isinstance(timeB,str): timeB = timeB.split("/") -# +# # # if lists, we have it potentially much easier: # if isinstance(timeA,list) and isinstance(timeB,list): # if timeA == timeB: @@ -100,14 +102,14 @@ def removeIdentical(*dicts): # return dto.strftime("%B %Y") # if len(timeA) == 1: # return dto.strftime("%Y") -# -# -# +# +# +# # (timeA, timeB) = getTimestamps(since=timeA, to=timeB) -# -# +# +# # return getTimeDesc(timeA) + " to " + getTimeDesc(timeB) - + # finds out if we want an artist or a track @@ -116,9 +118,9 @@ def removeIdentical(*dicts): # 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 @@ -143,7 +145,7 @@ def KeySplit(keys,forceTrack=False,forceArtist=False): if "associated" in keys: resultkeys1["associated"] = True else: resultkeys1 = {} - + # 2 resultkeys2 = {} if "since" in keys: resultkeys2["since"] = keys.get("since") @@ -157,23 +159,23 @@ def KeySplit(keys,forceTrack=False,forceArtist=False): 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 def pickKeys(d,*keys): @@ -187,10 +189,10 @@ def pickKeys(d,*keys): for k in newd: for v in newd.get(k): finald.append(k,v) - + return finald -# removes all duplicate keys, except artists when a title is specified +# removes all duplicate keys, except artists when a title is specified #def clean(d): # if isinstance(d,dict): # return diff --git a/htmlmodules.py b/htmlmodules.py index 2bd3b3c..d29bfd0 100644 --- a/htmlmodules.py +++ b/htmlmodules.py @@ -283,10 +283,10 @@ def module_filterselection(keys,time=True,delimit=False): html = "" + if time: - retainkeys = {k:keys[k] for k in keys if k not in ["since","to","in"]} - keystr = "?" + urllib.parse.urlencode(retainkeys) + keystr = "?" + keysToUrl(keys,exclude=["since","to","in"]) # wonky selector for precise date range @@ -343,8 +343,7 @@ def module_filterselection(keys,time=True,delimit=False): if delimit: - retainkeys = {k:keys[k] for k in keys if k not in ["step","stepn"]} - keystr = "?" + urllib.parse.urlencode(retainkeys) + keystr = "?" + keysToUrl(keys,exclude=["step","stepn"]) html += "
" if keys.get("step") == "day": @@ -367,8 +366,8 @@ def module_filterselection(keys,time=True,delimit=False): html += "
" - retainkeys = {k:keys[k] for k in keys if k not in ["trail"]} - keystr = "?" + urllib.parse.urlencode(retainkeys) + + keystr = "?" + keysToUrl(keys,exclude=["trail"]) html += "
" if keys.get("trail") == "1" or keys.get("trail") is None: diff --git a/website/scrobbles.html b/website/scrobbles.html index d9de45d..56344e7 100644 --- a/website/scrobbles.html +++ b/website/scrobbles.html @@ -16,6 +16,8 @@

Scrobbles


KEY_LIMITS

KEY_SCROBBLES Scrobbles

+
+ KEY_FILTERSELECTOR diff --git a/website/scrobbles.py b/website/scrobbles.py index d5e8e9d..1566200 100644 --- a/website/scrobbles.py +++ b/website/scrobbles.py @@ -5,7 +5,7 @@ import database def instructions(keys): from utilities import getArtistImage, getTrackImage from htmlgenerators import artistLink, artistLinks, trackLink, KeySplit - from htmlmodules import module_scrobblelist + from htmlmodules import module_scrobblelist, module_filterselection from malojatime import range_desc @@ -27,6 +27,8 @@ def instructions(keys): limitstring += " " + range_desc(**timekeys) + html_filterselector = module_filterselection(keys) + html, amount, rep = module_scrobblelist(**filterkeys,**timekeys,**amountkeys) @@ -44,6 +46,10 @@ def instructions(keys): pushresources = [{"file":imgurl,"type":"image"}] if imgurl.startswith("/") else [] - replace = {"KEY_SCROBBLELIST":html,"KEY_SCROBBLES":str(amount),"KEY_IMAGEURL":imgurl,"KEY_LIMITS":limitstring} + replace = {"KEY_SCROBBLELIST":html, + "KEY_SCROBBLES":str(amount), + "KEY_IMAGEURL":imgurl, + "KEY_LIMITS":limitstring, + "KEY_FILTERSELECTOR":html_filterselector} return (replace,pushresources)