diff --git a/database.py b/database.py index e3432c3..35db8dc 100644 --- a/database.py +++ b/database.py @@ -5,7 +5,7 @@ import waitress from cleanup import * from utilities import * from malojatime import * -from htmlgenerators import KeySplit +from urihandler import uri_to_internal # doreah toolkit from doreah.logging import log from doreah import tsv @@ -196,7 +196,7 @@ def test_server(): @dbserver.route("/scrobbles") def get_scrobbles_external(): keys = FormsDict.decode(request.query) - k_filter, k_time, _, k_amount = KeySplit(keys) + k_filter, k_time, _, k_amount = uri_to_internal(keys) ckeys = {**k_filter, **k_time, **k_amount} result = get_scrobbles(**ckeys) @@ -226,7 +226,7 @@ def get_scrobbles(**keys): @dbserver.route("/numscrobbles") def get_scrobbles_num_external(): keys = FormsDict.decode(request.query) - k_filter, k_time, _, k_amount = KeySplit(keys) + k_filter, k_time, _, k_amount = uri_to_internal(keys) ckeys = {**k_filter, **k_time, **k_amount} result = get_scrobbles_num(**ckeys) @@ -291,7 +291,7 @@ def get_scrobbles_num(**keys): @dbserver.route("/tracks") def get_tracks_external(): keys = FormsDict.decode(request.query) - k_filter, _, _, _ = KeySplit(keys,forceArtist=True) + k_filter, _, _, _ = uri_to_internal(keys,forceArtist=True) ckeys = {**k_filter} result = get_tracks(**ckeys) @@ -329,7 +329,7 @@ def get_artists(): @dbserver.route("/charts/artists") def get_charts_artists_external(): keys = FormsDict.decode(request.query) - _, k_time, _, _ = KeySplit(keys) + _, k_time, _, _ = uri_to_internal(keys) ckeys = {**k_time} result = get_charts_artists(**ckeys) @@ -346,7 +346,7 @@ def get_charts_artists(**keys): @dbserver.route("/charts/tracks") def get_charts_tracks_external(): keys = FormsDict.decode(request.query) - k_filter, k_time, _, _ = KeySplit(keys,forceArtist=True) + k_filter, k_time, _, _ = uri_to_internal(keys,forceArtist=True) ckeys = {**k_filter, **k_time} result = get_charts_tracks(**ckeys) @@ -366,7 +366,7 @@ def get_charts_tracks(**keys): @dbserver.route("/pulse") def get_pulse_external(): keys = FormsDict.decode(request.query) - k_filter, k_time, k_internal, k_amount = KeySplit(keys) + k_filter, k_time, k_internal, k_amount = uri_to_internal(keys) ckeys = {**k_filter, **k_time, **k_internal, **k_amount} results = get_pulse(**ckeys) @@ -394,7 +394,7 @@ def get_pulse(**keys): def get_top_artists_external(): keys = FormsDict.decode(request.query) - _, k_time, k_internal, _ = KeySplit(keys) + _, k_time, k_internal, _ = uri_to_internal(keys) ckeys = {**k_time, **k_internal} results = get_top_artists(**ckeys) @@ -408,9 +408,9 @@ def get_top_artists(**keys): for (a,b) in rngs: try: res = db_aggregate(since=a,to=b,by="ARTIST")[0] - results.append({"from":a,"to":b,"artist":res["artist"],"counting":res["counting"],"scrobbles":res["scrobbles"]}) + results.append({"since":a,"to":b,"artist":res["artist"],"counting":res["counting"],"scrobbles":res["scrobbles"]}) except: - results.append({"from":a,"to":b,"artist":None,"scrobbles":0}) + results.append({"since":a,"to":b,"artist":None,"scrobbles":0}) return results @@ -426,7 +426,7 @@ def get_top_artists(**keys): @dbserver.route("/top/tracks") def get_top_tracks_external(): keys = FormsDict.decode(request.query) - _, k_time, k_internal, _ = KeySplit(keys) + _, k_time, k_internal, _ = uri_to_internal(keys) ckeys = {**k_time, **k_internal} # IMPLEMENT THIS FOR TOP TRACKS OF ARTIST AS WELL? @@ -442,9 +442,9 @@ def get_top_tracks(**keys): for (a,b) in rngs: try: res = db_aggregate(since=a,to=b,by="TRACK")[0] - results.append({"from":a,"to":b,"track":res["track"],"scrobbles":res["scrobbles"]}) + results.append({"since":a,"to":b,"track":res["track"],"scrobbles":res["scrobbles"]}) except: - results.append({"from":a,"to":b,"track":None,"scrobbles":0}) + results.append({"since":a,"to":b,"track":None,"scrobbles":0}) return results @@ -461,7 +461,7 @@ def get_top_tracks(**keys): @dbserver.route("/artistinfo") def artistInfo_external(): keys = FormsDict.decode(request.query) - k_filter, _, _, _ = KeySplit(keys,forceArtist=True) + k_filter, _, _, _ = uri_to_internal(keys,forceArtist=True) ckeys = {**k_filter} results = artistInfo(**ckeys) @@ -490,7 +490,7 @@ def artistInfo(artist): @dbserver.route("/trackinfo") def trackInfo_external(): keys = FormsDict.decode(request.query) - k_filter, _, _, _ = KeySplit(keys,forceTrack=True) + k_filter, _, _, _ = uri_to_internal(keys,forceTrack=True) ckeys = {**k_filter} results = trackInfo(**ckeys) diff --git a/htmlgenerators.py b/htmlgenerators.py index 62915f0..bb6e39a 100644 --- a/htmlgenerators.py +++ b/htmlgenerators.py @@ -1,7 +1,7 @@ import urllib from bottle import FormsDict import datetime -from malojatime import uri_to_internal, internal_to_uri +from urihandler import compose_querystring # returns the proper column(s) for an artist or track @@ -40,175 +40,19 @@ def trackLink(track): 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 + "" + 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 + "" + 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) inner = str(amount) if amount is not None else "
" - return "" + inner + "" + return "" + inner + "" -# necessary because urllib.parse.urlencode doesnt handle multidicts -def keysToUrl(*dicts,exclude=[]): - for dict in dicts: - for key in dict: - dict[key] = internal_to_uri(dict[key]) - 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() - for d in dicts: - for k in d: - try: #multidicts - for v in d.getall(k): - keys.append(k,v) - 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) -# if difference < 60: return str(difference) + " minutes ago" if difference>1 else str(difference) + " minute ago" -# difference = int(difference/60) -# if difference < 24: return str(difference) + " hours ago" if difference>1 else str(difference) + " hour ago" -# difference = int(difference/24) -# if difference < 5: return tim.strftime("%A") -# 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: -# date = [1970,1,1] -# date[:len(timeA)] = timeA -# dto = datetime.datetime(date[0],date[1],date[2],tzinfo=datetime.timezone.utc) -# if len(timeA) == 3: -# return dto.strftime("%d. %b %Y") -# if len(timeA) == 2: -# 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 -#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,forceTrack=False,forceArtist=False): - - # 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 and not forceArtist: - resultkeys1 = {"track":{"artists":keys.getall("artist"),"title":keys.get("title")}} - elif "artist" in keys and not forceTrack: - 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 "since" in resultkeys2 and "to" in resultkeys2 and resultkeys2["since"] == resultkeys2["to"]: - resultkeys2["within"] = resultkeys2["since"] - del resultkeys2["since"] - del resultkeys2["to"] - # - 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") - if "within" in resultkeys2: - if "since" in resultkeys2: - del resultkeys2["since"] - if "to" in resultkeys2: - del resultkeys2["to"] - - - #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 @@ -226,12 +70,3 @@ def pickKeys(d,*keys): finald.append(k,v) return finald - -# removes all duplicate keys, except artists when a title is specified -#def clean(d): -# if isinstance(d,dict): -# return -# else: -# for k in d: -# if (k != "artist") or "title" not in d: -# d[k] = d.pop(k) diff --git a/htmlmodules.py b/htmlmodules.py index 9c5dd33..bdcb61c 100644 --- a/htmlmodules.py +++ b/htmlmodules.py @@ -2,6 +2,7 @@ from htmlgenerators import * import database from utilities import getArtistImage, getTrackImage from malojatime import * +from urihandler import compose_querystring, internal_to_uri import urllib @@ -144,8 +145,8 @@ def module_trackcharts(max_=None,**kwargs): # track html += entity_column(e["track"]) # scrobbles - html += "" + scrobblesTrackLink(e["track"],kwargs_time,amount=e["scrobbles"]) + "" - html += "" + scrobblesTrackLink(e["track"],kwargs_time,percent=e["scrobbles"]*100/maxbar) + "" + html += "" + scrobblesTrackLink(e["track"],internal_to_uri(kwargs_time),amount=e["scrobbles"]) + "" + html += "" + scrobblesTrackLink(e["track"],internal_to_uri(kwargs_time),percent=e["scrobbles"]*100/maxbar) + "" html += "" prev = e html += "" @@ -205,8 +206,8 @@ def module_artistcharts(max_=None,**kwargs): # artist html += entity_column(e["artist"],counting=e["counting"]) # scrobbles - html += "" + scrobblesArtistLink(e["artist"],kwargs_time,amount=e["scrobbles"],associated=True) + "" - html += "" + scrobblesArtistLink(e["artist"],kwargs_time,percent=e["scrobbles"]*100/maxbar,associated=True) + "" + html += "" + scrobblesArtistLink(e["artist"],internal_to_uri(kwargs_time),amount=e["scrobbles"],associated=True) + "" + html += "" + scrobblesArtistLink(e["artist"],internal_to_uri(kwargs_time),percent=e["scrobbles"]*100/maxbar,associated=True) + "" html += "" prev = e @@ -245,14 +246,15 @@ def module_toptracks(pictures=True,**kwargs): html = "" for e in tracks: - fromstr = "/".join([str(p) for p in e["from"]]) - tostr = "/".join([str(p) for p in e["to"]]) + #fromstr = "/".join([str(p) for p in e["from"]]) + #tostr = "/".join([str(p) for p in e["to"]]) + limits = pickKeys(e,"since","to") i += 1 html += "" - html += "" + html += "" if e["track"] is None: if pictures: html += "" @@ -265,8 +267,8 @@ def module_toptracks(pictures=True,**kwargs): img = getTrackImage(e["track"]["artists"],e["track"]["title"],fast=True) else: img = None html += entity_column(e["track"],image=img) - html += "" - html += "" + html += "" + html += "" html += "" prev = e html += "
" + range_desc(e["from"],e["to"],short=True) + "" + range_desc(e["since"],e["to"],short=True) + "
" + scrobblesTrackLink(e["track"],{"since":fromstr,"to":tostr},amount=e["scrobbles"]) + "" + scrobblesTrackLink(e["track"],{"since":fromstr,"to":tostr},percent=e["scrobbles"]*100/maxbar) + "" + scrobblesTrackLink(e["track"],internal_to_uri(limits),amount=e["scrobbles"]) + "" + scrobblesTrackLink(e["track"],internal_to_uri(limits),percent=e["scrobbles"]*100/maxbar) + "
" @@ -300,14 +302,15 @@ def module_topartists(pictures=True,**kwargs): html = "" for e in artists: - fromstr = "/".join([str(p) for p in e["from"]]) - tostr = "/".join([str(p) for p in e["to"]]) + #fromstr = "/".join([str(p) for p in e["from"]]) + #tostr = "/".join([str(p) for p in e["to"]]) + limits = pickKeys(e,"since","to") i += 1 html += "" - html += "" + html += "" if e["artist"] is None: if pictures: @@ -320,8 +323,8 @@ def module_topartists(pictures=True,**kwargs): img = getArtistImage(e["artist"],fast=True) else: img = None html += entity_column(e["artist"],image=img) - html += "" - html += "" + html += "" + html += "" html += "" prev = e html += "
" + range_desc(e["from"],e["to"],short=True) + "" + range_desc(e["since"],e["to"],short=True) + "" + scrobblesArtistLink(e["artist"],{"since":fromstr,"to":tostr},amount=e["scrobbles"],associated=True) + "" + scrobblesArtistLink(e["artist"],{"since":fromstr,"to":tostr},percent=e["scrobbles"]*100/maxbar,associated=True) + "" + scrobblesArtistLink(e["artist"],internal_to_uri(limits),amount=e["scrobbles"],associated=True) + "" + scrobblesArtistLink(e["artist"],internal_to_uri(limits),percent=e["scrobbles"]*100/maxbar,associated=True) + "
" @@ -439,17 +442,14 @@ def module_trackcharts_tiles(**kwargs): return html - +# THIS FUNCTION USES THE ORIGINAL URI KEYS!!! def module_filterselection(keys,time=True,delimit=False): - # all other keys that will not be changed by clicking another filter - html = "" - if time: - - keystr = "?" + keysToUrl(keys,exclude=["since","to","in"]) + # all other keys that will not be changed by clicking another filter + keystr = "?" + compose_querystring(keys,exclude=["since","to","in"]) # wonky selector for precise date range @@ -506,7 +506,7 @@ def module_filterselection(keys,time=True,delimit=False): if delimit: - keystr = "?" + keysToUrl(keys,exclude=["step","stepn"]) + keystr = "?" + compose_querystring(keys,exclude=["step","stepn"]) html += "
" if keys.get("step") == "day": @@ -530,7 +530,7 @@ def module_filterselection(keys,time=True,delimit=False): - keystr = "?" + keysToUrl(keys,exclude=["trail"]) + keystr = "?" + compose_querystring(keys,exclude=["trail"]) html += "
" if keys.get("trail") == "1" or keys.get("trail") is None: diff --git a/maloja b/maloja index 1bc7f0a..a129e82 100755 --- a/maloja +++ b/maloja @@ -280,6 +280,8 @@ def update(): os.chmod("./maloja",os.stat("./maloja").st_mode | stat.S_IXUSR) + print("Make sure to install the latest version of doreah! (" + yellow("pip3 install --upgrade --no-cache-dir doreah") + ")") + if stop(): start() #stop returns whether it was running before, in which case we restart it diff --git a/malojatime.py b/malojatime.py index 6a1e803..2c6fc12 100644 --- a/malojatime.py +++ b/malojatime.py @@ -22,15 +22,18 @@ def end_of_scrobbling(): -def uri_to_internal(t): - return time_fix(t) +#def uri_to_internal(t): +# return time_fix(t) +# +#def internal_to_uri(t): +# if isinstance(t,list) or isinstance(t,tuple): +# return "/".join(str(t)) +# +# return str(t) -def internal_to_uri(t): - if isinstance(t,list) or isinstance(t,tuple): - return "/".join(str(t)) - - return str(t) +def time_str(t): + return "/".join(str(tp) for tp in t) # converts strings and stuff to lists def time_fix(t): diff --git a/rules/predefined/krateng_kpopgirlgroups.tsv b/rules/predefined/krateng_kpopgirlgroups.tsv index 7fd8699..754210a 100644 --- a/rules/predefined/krateng_kpopgirlgroups.tsv +++ b/rules/predefined/krateng_kpopgirlgroups.tsv @@ -75,7 +75,7 @@ replaceartist Ace of Angels AOA replacetitle 사뿐사뿐 (Like a Cat) Like a Cat replacetitle Like A Cat (Japanese Version) Like a Cat (Japanese Version) replacetitle MOYA (inst) Moya -replacetitle MOYA (instrumental) Moya +replacetitle MOYA (instrumental) Moya (instrumental) countas AOA Black AOA # Girl's Day diff --git a/scrobblers/maloja-scrobbler.zip b/scrobblers/maloja-scrobbler.zip new file mode 100644 index 0000000..b23ab38 Binary files /dev/null and b/scrobblers/maloja-scrobbler.zip differ diff --git a/server.py b/server.py index e64ee23..c21e0aa 100755 --- a/server.py +++ b/server.py @@ -5,9 +5,8 @@ from bottle import Bottle, route, get, post, error, run, template, static_file, import waitress # rest of the project import database -from htmlgenerators import removeIdentical from utilities import * -from htmlgenerators import KeySplit +from urihandler import uri_to_internal, remove_identical # doreah toolkit from doreah import settings from doreah.logging import log @@ -113,7 +112,7 @@ def graceful_exit(sig=None,frame=None): @webserver.route("/image") def dynamic_image(): keys = FormsDict.decode(request.query) - relevant, _, _, _ = KeySplit(keys) + relevant, _, _, _ = uri_to_internal(keys) result = resolveImage(**relevant) if result == "": return "" redirect(result,307) @@ -162,7 +161,7 @@ def static(name): @webserver.route("/") def static_html(name): linkheaders = ["; rel=preload; as=style"] - keys = removeIdentical(FormsDict.decode(request.query)) + keys = remove_identical(FormsDict.decode(request.query)) with open("website/" + name + ".html") as htmlfile: html = htmlfile.read() diff --git a/urihandler.py b/urihandler.py new file mode 100644 index 0000000..9448b3c --- /dev/null +++ b/urihandler.py @@ -0,0 +1,133 @@ +import urllib +from bottle import FormsDict +from malojatime import time_fix, time_str + + +# necessary because urllib.parse.urlencode doesnt handle multidicts +def compose_querystring(*dicts,exclude=[]): + + st = "" + keys = remove_identical(*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 + + +# takes any number of multidicts and normal dicts and creates a formsdict with duplicate values removed +def remove_identical(*dicts): + #combine multiple dicts + keys = FormsDict() + for d in dicts: + for k in d: + try: #multidicts + for v in d.getall(k): + keys.append(k,v) + except: #normaldicts + v = d.get(k) + keys.append(k,v) + + new = FormsDict() + for k in keys: + #values = set(keys.getall(k)) + values = keys.getall(k) # NO IDENTICAL REMOVAL FOR NOW + for v in values: + new.append(k,v) + + return new + + + +def uri_to_internal(keys,forceTrack=False,forceArtist=False): + + # 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 and not forceArtist: + resultkeys1 = {"track":{"artists":keys.getall("artist"),"title":keys.get("title")}} + elif "artist" in keys and not forceTrack: + resultkeys1 = {"artist":keys.get("artist")} + if "associated" in keys: resultkeys1["associated"] = True + else: + resultkeys1 = {} + + # 2 + resultkeys2 = {} + if "since" in keys: resultkeys2["since"] = time_fix(keys.get("since")) + elif "from" in keys: resultkeys2["since"] = time_fix(keys.get("from")) + elif "start" in keys: resultkeys2["since"] = time_fix(keys.get("start")) + # + if "to" in keys: resultkeys2["to"] = time_fix(keys.get("to")) + elif "until" in keys: resultkeys2["to"] = time_fix(keys.get("until")) + elif "end" in keys: resultkeys2["to"] = time_fix(keys.get("end")) + # + if "since" in resultkeys2 and "to" in resultkeys2 and resultkeys2["since"] == resultkeys2["to"]: + resultkeys2["within"] = resultkeys2["since"] + del resultkeys2["since"] + del resultkeys2["to"] + # + if "in" in keys: resultkeys2["within"] = time_fix(keys.get("in")) + elif "within" in keys: resultkeys2["within"] = time_fix(keys.get("within")) + elif "during" in keys: resultkeys2["within"] = time_fix(keys.get("during")) + if "within" in resultkeys2: + if "since" in resultkeys2: + del resultkeys2["since"] + if "to" in resultkeys2: + del resultkeys2["to"] + + + #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 + +def internal_to_uri(keys): + urikeys = FormsDict() + + #filter + if "artist" in keys: + urikeys.append("artist",keys["artist"]) + if keys.get("associated"): urikeys.append("associated","yes") + elif "track" in keys: + for a in keys["track"]["artists"]: + urikeys.append("artist",a) + urikeys.append("title",keys["track"]["title"]) + + #time + if "within" in keys: + urikeys.append("in",time_str(keys["within"])) + else: + if "since" in keys: + urikeys.append("since",time_str(keys["since"])) + if "to" in keys: + urikeys.append("to",time_str(keys["to"])) + + # delimit + if "step" in keys: + urikeys.append("step",keys["step"]) + if "stepn" in keys: + urikeys.append("stepn",str(keys["stepn"])) + if "trail" in keys: + urikeys.append("trail",str(keys["trail"])) + + # stuff + if "max_" in keys: + urikeys.append("max",str(keys["max_"])) + + + return urikeys diff --git a/website/artist.py b/website/artist.py index 5ceb8ec..185874c 100644 --- a/website/artist.py +++ b/website/artist.py @@ -4,10 +4,11 @@ import database def instructions(keys): from utilities import getArtistImage - from htmlgenerators import artistLink, artistLinks, KeySplit + from htmlgenerators import artistLink, artistLinks + from urihandler import compose_querystring, uri_to_internal from htmlmodules import module_pulse, module_trackcharts - filterkeys, _, _, _ = KeySplit(keys,forceArtist=True) + filterkeys, _, _, _ = uri_to_internal(keys,forceArtist=True) imgurl = getArtistImage(filterkeys["artist"],fast=True) pushresources = [{"file":imgurl,"type":"image"}] if imgurl.startswith("/") else [] diff --git a/website/charts_artists.py b/website/charts_artists.py index 1e7010d..b39cd36 100644 --- a/website/charts_artists.py +++ b/website/charts_artists.py @@ -3,12 +3,12 @@ import urllib def instructions(keys): from utilities import getArtistImage - from htmlgenerators import KeySplit + from urihandler import compose_querystring, uri_to_internal from htmlmodules import module_artistcharts, module_filterselection from malojatime import range_desc - _, timekeys, _, amountkeys = KeySplit(keys) + _, timekeys, _, amountkeys = uri_to_internal(keys) limitstring = range_desc(**timekeys) diff --git a/website/charts_tracks.py b/website/charts_tracks.py index 32930bd..30c96b7 100644 --- a/website/charts_tracks.py +++ b/website/charts_tracks.py @@ -3,11 +3,12 @@ import urllib def instructions(keys): from utilities import getArtistImage, getTrackImage - from htmlgenerators import artistLink, KeySplit + from htmlgenerators import artistLink + from urihandler import compose_querystring, uri_to_internal from htmlmodules import module_trackcharts, module_filterselection from malojatime import range_desc - filterkeys, timekeys, _, amountkeys = KeySplit(keys) + filterkeys, timekeys, _, amountkeys = uri_to_internal(keys) limitstring = "" diff --git a/website/pulse.py b/website/pulse.py index f04e0f3..c79bfed 100644 --- a/website/pulse.py +++ b/website/pulse.py @@ -4,11 +4,12 @@ import database def instructions(keys): from utilities import getArtistImage, getTrackImage - from htmlgenerators import artistLink, artistLinks, trackLink, scrobblesLink, keysToUrl, KeySplit + from htmlgenerators import artistLink, artistLinks, trackLink, scrobblesLink + from urihandler import compose_querystring, uri_to_internal from htmlmodules import module_pulse, module_filterselection from malojatime import range_desc, delimit_desc - filterkeys, timekeys, delimitkeys, _ = KeySplit(keys) + filterkeys, timekeys, delimitkeys, _ = uri_to_internal(keys) # describe the scope (and creating a key for the relevant artist or track) diff --git a/website/scrobbles.py b/website/scrobbles.py index 1566200..a846eb2 100644 --- a/website/scrobbles.py +++ b/website/scrobbles.py @@ -4,12 +4,13 @@ import database def instructions(keys): from utilities import getArtistImage, getTrackImage - from htmlgenerators import artistLink, artistLinks, trackLink, KeySplit + from htmlgenerators import artistLink, artistLinks, trackLink + from urihandler import compose_querystring, uri_to_internal from htmlmodules import module_scrobblelist, module_filterselection from malojatime import range_desc - filterkeys, timekeys, _, amountkeys = KeySplit(keys) + filterkeys, timekeys, _, amountkeys = uri_to_internal(keys) # describe the scope limitstring = "" diff --git a/website/top_artists.py b/website/top_artists.py index 2476159..1756ba2 100644 --- a/website/top_artists.py +++ b/website/top_artists.py @@ -3,11 +3,12 @@ import urllib def instructions(keys): from utilities import getArtistImage, getTrackImage - from htmlgenerators import artistLink, KeySplit + from htmlgenerators import artistLink + from urihandler import compose_querystring, uri_to_internal from htmlmodules import module_topartists, module_filterselection from malojatime import range_desc - _, timekeys, delimitkeys, _ = KeySplit(keys) + _, timekeys, delimitkeys, _ = uri_to_internal(keys) limitstring = "" diff --git a/website/top_tracks.py b/website/top_tracks.py index 565b1eb..bf7fddf 100644 --- a/website/top_tracks.py +++ b/website/top_tracks.py @@ -3,11 +3,12 @@ import urllib def instructions(keys): from utilities import getArtistImage, getTrackImage - from htmlgenerators import artistLink, KeySplit + from htmlgenerators import artistLink + from urihandler import compose_querystring, uri_to_internal from htmlmodules import module_toptracks, module_filterselection from malojatime import range_desc - filterkeys, timekeys, delimitkeys, _ = KeySplit(keys) + filterkeys, timekeys, delimitkeys, _ = uri_to_internal(keys) limitstring = "" diff --git a/website/track.py b/website/track.py index 5af1bd2..24b3f8c 100644 --- a/website/track.py +++ b/website/track.py @@ -4,11 +4,12 @@ import database def instructions(keys): from utilities import getArtistImage, getTrackImage - from htmlgenerators import artistLinks, keysToUrl, KeySplit + from htmlgenerators import artistLinks + from urihandler import compose_querystring from htmlmodules import module_scrobblelist, module_pulse - filterkeys, _, _, _ = KeySplit(keys,forceTrack=True) + filterkeys, _, _, _ = uri_to_internal(keys,forceTrack=True) track = filterkeys.get("track") imgurl = getTrackImage(track["artists"],track["title"],fast=True) @@ -40,7 +41,7 @@ def instructions(keys): replace = {"KEY_TRACKTITLE":track.get("title"),"KEY_ARTISTS":artistLinks(track.get("artists")),"KEY_SCROBBLES":scrobblesnum,"KEY_POSITION":pos,"KEY_IMAGEURL":imgurl, - "KEY_SCROBBLELINK":keysToUrl(keys),"KEY_MEDALS":html_medals, + "KEY_SCROBBLELINK":compose_querystring(keys),"KEY_MEDALS":html_medals, "KEY_SCROBBLELIST":html_scrobbles,"KEY_PULSE":html_pulse} return (replace,pushresources)