diff --git a/database.py b/database.py index 4eac8dd..9741154 100644 --- a/database.py +++ b/database.py @@ -211,7 +211,7 @@ def get_scrobbles_external(): return {"list":result} def get_scrobbles(**keys): - r = db_query(**{k:keys[k] for k in keys if k in ["artist","artists","title","since","to","within","associated","track","max_"]}) + r = db_query(**{k:keys[k] for k in keys if k in ["artist","artists","title","since","to","within","timerange","associated","track","max_"]}) #if keys.get("max_") is not None: # return r[:int(keys.get("max_"))] #else: @@ -241,7 +241,7 @@ def get_scrobbles_num_external(): return {"amount":result} def get_scrobbles_num(**keys): - r = db_query(**{k:keys[k] for k in keys if k in ["artist","track","artists","title","since","to","within","associated"]}) + r = db_query(**{k:keys[k] for k in keys if k in ["artist","track","artists","title","since","to","within","timerange","associated"]}) return len(r) @@ -344,7 +344,7 @@ def get_charts_artists_external(): return {"list":result} def get_charts_artists(**keys): - return db_aggregate(by="ARTIST",**{k:keys[k] for k in keys if k in ["since","to","within"]}) + return db_aggregate(by="ARTIST",**{k:keys[k] for k in keys if k in ["since","to","within","timerange"]}) @@ -361,7 +361,7 @@ def get_charts_tracks_external(): return {"list":result} def get_charts_tracks(**keys): - return db_aggregate(by="TRACK",**{k:keys[k] for k in keys if k in ["since","to","within","artist"]}) + return db_aggregate(by="TRACK",**{k:keys[k] for k in keys if k in ["since","to","within","timerange","artist"]}) @@ -405,7 +405,7 @@ def get_performance_external(): def get_performance(**keys): - rngs = ranges(**{k:keys[k] for k in keys if k in ["since","to","within","step","stepn","trail"]}) + rngs = ranges(**{k:keys[k] for k in keys if k in ["since","to","within","timerange","step","stepn","trail"]}) results = [] for rng in rngs: @@ -446,15 +446,15 @@ def get_top_artists_external(): def get_top_artists(**keys): - rngs = ranges(**{k:keys[k] for k in keys if k in ["since","to","within","step","stepn","trail"]}) + rngs = ranges(**{k:keys[k] for k in keys if k in ["since","to","within","timerange","step","stepn","trail"]}) results = [] - for (a,b) in rngs: + for rng in rngs: try: - res = db_aggregate(since=a,to=b,by="ARTIST")[0] - results.append({"since":a,"to":b,"artist":res["artist"],"counting":res["counting"],"scrobbles":res["scrobbles"]}) + res = db_aggregate(timerange=rng,by="ARTIST")[0] + results.append({"range":rng,"artist":res["artist"],"counting":res["counting"],"scrobbles":res["scrobbles"]}) except: - results.append({"since":a,"to":b,"artist":None,"scrobbles":0}) + results.append({"range":rng,"artist":None,"scrobbles":0}) return results @@ -480,15 +480,15 @@ def get_top_tracks_external(): def get_top_tracks(**keys): - rngs = ranges(**{k:keys[k] for k in keys if k in ["since","to","within","step","stepn","trail"]}) + rngs = ranges(**{k:keys[k] for k in keys if k in ["since","to","within","timerange","step","stepn","trail"]}) results = [] for (a,b) in rngs: try: - res = db_aggregate(since=a,to=b,by="TRACK")[0] - results.append({"since":a,"to":b,"track":res["track"],"scrobbles":res["scrobbles"]}) + res = db_aggregate(timerange=rng,by="TRACK")[0] + results.append({"range":rng,"track":res["track"],"scrobbles":res["scrobbles"]}) except: - results.append({"since":a,"to":b,"track":None,"scrobbles":0}) + results.append({"range":rng,"track":None,"scrobbles":0}) return results diff --git a/htmlmodules.py b/htmlmodules.py index 987cb7b..808eaae 100644 --- a/htmlmodules.py +++ b/htmlmodules.py @@ -22,7 +22,7 @@ import math def module_scrobblelist(max_=None,pictures=False,shortTimeDesc=False,earlystop=False,**kwargs): kwargs_filter = pickKeys(kwargs,"artist","track","associated") - kwargs_time = pickKeys(kwargs,"since","to","within") + kwargs_time = pickKeys(kwargs,"timerange","since","to","within") # if earlystop, we don't care about the actual amount and only request as many from the db @@ -89,8 +89,8 @@ def module_pulse(max_=None,**kwargs): range = t["range"] html += "" html += "" + range.desc() + "" - html += "" + scrobblesLink({"since":range.fromstr(),"to":range.tostr()},amount=t["scrobbles"],**kwargs_filter) + "" - html += "" + scrobblesLink({"since":range.fromstr(),"to":range.tostr()},percent=t["scrobbles"]*100/maxbar,**kwargs_filter) + "" + html += "" + scrobblesLink(range.urikeys(),amount=t["scrobbles"],**kwargs_filter) + "" + html += "" + scrobblesLink(range.urikeys(),percent=t["scrobbles"]*100/maxbar,**kwargs_filter) + "" html += "" html += "" @@ -102,7 +102,7 @@ def module_pulse(max_=None,**kwargs): def module_performance(max_=None,**kwargs): kwargs_filter = pickKeys(kwargs,"artist","track") - kwargs_time = pickKeys(kwargs,"since","to","within","step","stepn","trail") + kwargs_time = pickKeys(kwargs,"since","to","within","timerange","step","stepn","trail") ranges = database.get_performance(**kwargs_time,**kwargs_filter) @@ -123,10 +123,10 @@ def module_performance(max_=None,**kwargs): for t in ranges: range = t["range"] html += "" - html += "" + range_desc(t["from"],t["to"],short=True) + "" + html += "" + range.desc() + "" 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":range.fromstr(),"to":range.tostr()},percent=prct,**kwargs_filter,medal=t["rank"]) + "" + html += "" + rankLink(range.urikeys(),percent=prct,**kwargs_filter,medal=t["rank"]) + "" html += "" html += "" @@ -138,14 +138,13 @@ def module_performance(max_=None,**kwargs): def module_trackcharts(max_=None,**kwargs): kwargs_filter = pickKeys(kwargs,"artist","associated") - kwargs_time = pickKeys(kwargs,"since","to","within") + kwargs_time = pickKeys(kwargs,"timerange","since","to","within") tracks = database.get_charts_tracks(**kwargs_filter,**kwargs_time) # last time range (to compare) - if "within" in kwargs_time: - from malojatime import _get_next - trackslast = database.get_charts_tracks(**kwargs_filter,within=_get_next(kwargs_time["within"],step=-1)) + try: + trackslast = database.get_charts_tracks(**kwargs_filter,timerange=kwargs_time["timerange"].next(step=-1)) # create rank association lastrank = {} for tl in trackslast: @@ -154,7 +153,9 @@ def module_trackcharts(max_=None,**kwargs): try: t["delta"] = lastrank[(*t["track"]["artists"],t["track"]["title"])] - t["rank"] except: - t["delta"] = None + t["delta"] = math.inf + except: + pass if tracks != []: maxbar = tracks[0]["scrobbles"] @@ -176,8 +177,9 @@ def module_trackcharts(max_=None,**kwargs): else: html += "" # rank change - if "within" not in kwargs_time: pass - elif e["delta"] is None: + if e.get("delta") is None: + pass + elif e["delta"] is math.inf: html += "🆕" elif e["delta"] > 0: html += "↗" @@ -200,14 +202,14 @@ def module_trackcharts(max_=None,**kwargs): def module_artistcharts(max_=None,**kwargs): kwargs_filter = pickKeys(kwargs,"associated") #not used right now - kwargs_time = pickKeys(kwargs,"since","to","within") + kwargs_time = pickKeys(kwargs,"timerange","since","to","within") artists = database.get_charts_artists(**kwargs_filter,**kwargs_time) # last time range (to compare) - if "within" in kwargs_time: - from malojatime import _get_next - artistslast = database.get_charts_artists(**kwargs_filter,within=_get_next(kwargs_time["within"],step=-1)) + try: + #from malojatime import _get_next + artistslast = database.get_charts_artists(**kwargs_filter,timerange=kwargs_time["timerange"].next(step=-1)) # create rank association lastrank = {} for al in artistslast: @@ -216,7 +218,9 @@ def module_artistcharts(max_=None,**kwargs): try: a["delta"] = lastrank[a["artist"]] - a["rank"] except: - a["delta"] = None + a["delta"] = math.inf + except: + pass if artists != []: maxbar = artists[0]["scrobbles"] @@ -237,8 +241,10 @@ def module_artistcharts(max_=None,**kwargs): else: html += "" # rank change - if "within" not in kwargs_time: pass - elif e["delta"] is None: + #if "within" not in kwargs_time: pass + if e.get("delta") is None: + pass + elif e["delta"] is math.inf: html += "🆕" elif e["delta"] > 0: html += "↗" @@ -263,7 +269,7 @@ def module_artistcharts(max_=None,**kwargs): def module_toptracks(pictures=True,**kwargs): kwargs_filter = pickKeys(kwargs,"artist","associated") - kwargs_time = pickKeys(kwargs,"since","to","within","step","stepn","trail") + kwargs_time = pickKeys(kwargs,"timerange","since","to","within","step","stepn","trail") tracks = database.get_top_tracks(**kwargs_filter,**kwargs_time) @@ -310,8 +316,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 += "" + scrobblesTrackLink(e["track"],{"since":range.fromstr(),"to":range.tostr()},amount=e["scrobbles"]) + "" - html += "" + scrobblesTrackLink(e["track"],{"since":range.fromstr(),"to":range.tostr()},percent=e["scrobbles"]*100/maxbar) + "" + html += "" + scrobblesTrackLink(e["track"],range.urikeys(),amount=e["scrobbles"]) + "" + html += "" + scrobblesTrackLink(e["track"],range.urikeys(),percent=e["scrobbles"]*100/maxbar) + "" html += "" prev = e html += "" @@ -320,7 +326,7 @@ def module_toptracks(pictures=True,**kwargs): def module_topartists(pictures=True,**kwargs): - kwargs_time = pickKeys(kwargs,"since","to","within","step","stepn","trail") + kwargs_time = pickKeys(kwargs,"timerange","since","to","within","step","stepn","trail") artists = database.get_top_artists(**kwargs_time) @@ -366,8 +372,8 @@ def module_topartists(pictures=True,**kwargs): img = getArtistImage(e["artist"],fast=True) else: img = None html += entity_column(e["artist"],image=img) - html += "" + scrobblesArtistLink(e["artist"],{"since":range.fromstr(),"to":range.tostr()},amount=e["scrobbles"],associated=True) + "" - html += "" + scrobblesArtistLink(e["artist"],{"since":range.fromstr(),"to":range.tostr()},percent=e["scrobbles"]*100/maxbar,associated=True) + "" + html += "" + scrobblesArtistLink(e["artist"],range.urikeys(),amount=e["scrobbles"],associated=True) + "" + html += "" + scrobblesArtistLink(e["artist"],range.urikeys(),percent=e["scrobbles"]*100/maxbar,associated=True) + "" html += "" prev = e html += "" @@ -378,7 +384,7 @@ def module_topartists(pictures=True,**kwargs): def module_artistcharts_tiles(**kwargs): kwargs_filter = pickKeys(kwargs,"associated") #not used right now - kwargs_time = pickKeys(kwargs,"since","to","within") + kwargs_time = pickKeys(kwargs,"timerange","since","to","within") artists = database.get_charts_artists(**kwargs_filter,**kwargs_time)[:14] while len(artists)<14: artists.append(None) @@ -426,7 +432,7 @@ def module_artistcharts_tiles(**kwargs): def module_trackcharts_tiles(**kwargs): kwargs_filter = pickKeys(kwargs,"artist","associated") - kwargs_time = pickKeys(kwargs,"since","to","within") + kwargs_time = pickKeys(kwargs,"timerange","since","to","within") tracks = database.get_charts_tracks(**kwargs_filter,**kwargs_time)[:14] while len(tracks)<14: tracks.append(None) #{"track":{"title":"","artists":[]}} diff --git a/malojatime.py b/malojatime.py index 247d2ba..2b406bf 100644 --- a/malojatime.py +++ b/malojatime.py @@ -201,14 +201,24 @@ class MTimeWeek(MRangeDescriptor): self.year = year self.week = week + # assume the first day of the first week of this year is 1/1 firstday = date(year,1,1) y,w,d = firstday.chrcalendar() if y == self.year: firstday -= datetime.timedelta(days=(d-1)) else: firstday += datetime.timedelta(days=8-d) - self.firstday = firstday + datetime.timedelta(days=7*(week-1)) - self.lastday = self.firstday + datetime.timedelta(days=6) + # now we know the real first day, add the weeks we need + firstday = firstday + datetime.timedelta(days=7*(week-1)) + lastday = firstday + datetime.timedelta(days=6) + # turn them into local overwritten date objects + self.firstday = date(firstday.year,firstday.month,firstday.day) + self.lastday = date(lastday.year,lastday.month,lastday.day) + # now check if we're still in the same year + y,w,_ = self.firstday.chrcalendar() + self.year,self.week = y,w + # firstday and lastday are already correct + def __str__(self): return str(self.year) + "/W" + str(self.week) @@ -255,11 +265,7 @@ class MTimeWeek(MRangeDescriptor): def next(self,step=1): if abs(step) == math.inf: return None - try: - return MTimeWeek(self.year,self.week + step) - except: - pass - # TODO + return MTimeWeek(self.year,self.week + step) # a range that is defined by separate start and end class MRange(MRangeDescriptor): diff --git a/urihandler.py b/urihandler.py index db0d49d..ae08440 100644 --- a/urihandler.py +++ b/urihandler.py @@ -103,7 +103,7 @@ def uri_to_internal(keys,forceTrack=False,forceArtist=False): #4 - resultkeys4 = {} + resultkeys4 = {"max_":300} if "max" in keys: resultkeys4["max_"] = int(keys["max"]) @@ -129,9 +129,9 @@ def internal_to_uri(keys): elif "within" in keys: urikeys.append("in",time_str(keys["within"])) else: - if "since" in keys: + if "since" in keys and keys["since"] is not None: urikeys.append("since",time_str(keys["since"])) - if "to" in keys: + if "to" in keys and keys["to"] is not None: urikeys.append("to",time_str(keys["to"])) # delimit diff --git a/website/start.html b/website/start.html index cbfc880..bbaa60f 100644 --- a/website/start.html +++ b/website/start.html @@ -77,6 +77,7 @@

Last Scrobbles

Today KEY_SCROBBLE_NUM_TODAY + This Week KEY_SCROBBLE_NUM_WEEK This month KEY_SCROBBLE_NUM_MONTH This year KEY_SCROBBLE_NUM_YEAR All Time KEY_SCROBBLE_NUM_TOTAL diff --git a/website/start.py b/website/start.py index 22e9659..59e8c51 100644 --- a/website/start.py +++ b/website/start.py @@ -14,30 +14,26 @@ def instructions(keys): js_command += "showRange('toptracks','" + get_settings("DEFAULT_RANGE_CHARTS_TRACKS") + "');" js_command += "showRange('pulse','" + get_settings("DEFAULT_RANGE_PULSE") + "');" - # get start of week - tod = datetime.utcnow() - change = (tod.weekday() + 1) % 7 - d = timedelta(days=change) - newdate = tod - d - weekstart = [newdate.year,newdate.month,newdate.day] clock() + from malojatime import today,thisweek,thismonth,thisyear + # artists topartists_total = module_artistcharts_tiles() - topartists_year = module_artistcharts_tiles(since="year") - topartists_month = module_artistcharts_tiles(since="month") - topartists_week = module_artistcharts_tiles(since=weekstart) + topartists_year = module_artistcharts_tiles(timerange=thisyear()) + topartists_month = module_artistcharts_tiles(timerange=thismonth()) + topartists_week = module_artistcharts_tiles(timerange=thisweek()) clockp("Artists") # tracks toptracks_total = module_trackcharts_tiles() - toptracks_year = module_trackcharts_tiles(since="year") - toptracks_month = module_trackcharts_tiles(since="month") - toptracks_week = module_trackcharts_tiles(since=weekstart) + toptracks_year = module_trackcharts_tiles(timerange=thisyear()) + toptracks_month = module_trackcharts_tiles(timerange=thismonth()) + toptracks_week = module_trackcharts_tiles(timerange=thisweek()) clockp("Tracks") @@ -52,19 +48,17 @@ def instructions(keys): # stats - #(amount_day,amount_month,amount_year,amount_total) = database.get_scrobbles_num_multiple(("today","month","year",None)) - #amount_month += amount_day - #amount_year += amount_month - #amount_total += amount_year + amount_day = database.get_scrobbles_num(timerange=today()) + scrobbles_today = "" + str(amount_day) + "" - amount_day = database.get_scrobbles_num(since="today") - scrobbles_today = "" + str(amount_day) + "" + amount_week = database.get_scrobbles_num(timerange=thisweek()) + scrobbles_week = "" + str(amount_week) + "" - amount_month = database.get_scrobbles_num(since="month") - scrobbles_month = "" + str(amount_month) + "" + amount_month = database.get_scrobbles_num(timerange=thismonth()) + scrobbles_month = "" + str(amount_month) + "" - amount_year = database.get_scrobbles_num(since="year") - scrobbles_year = "" + str(amount_year) + "" + amount_year = database.get_scrobbles_num(timerange=thisyear()) + scrobbles_year = "" + str(amount_year) + "" amount_total = database.get_scrobbles_num() scrobbles_total = "" + str(amount_total) + "" @@ -72,7 +66,7 @@ def instructions(keys): clockp("Amounts") # pulse - from malojatime import today,thisweek,thismonth,thisyear + html_pulse_days = module_pulse(max_=7,since=today().next(-6),step="day",trail=1) html_pulse_weeks = module_pulse(max_=12,since=thisweek().next(-11),step="week",trail=1) @@ -90,14 +84,10 @@ def instructions(keys): 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_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_TOPARTISTS_TOTAL":topartists_total,"KEY_TOPARTISTS_YEAR":topartists_year,"KEY_TOPARTISTS_MONTH":topartists_month,"KEY_TOPARTISTS_WEEK":topartists_week, "KEY_TOPTRACKS_TOTAL":toptracks_total,"KEY_TOPTRACKS_YEAR":toptracks_year,"KEY_TOPTRACKS_MONTH":toptracks_month,"KEY_TOPTRACKS_WEEK":toptracks_week, "KEY_JS_INIT_RANGES":js_command, - "KEY_SCROBBLE_NUM_TODAY":scrobbles_today,"KEY_SCROBBLE_NUM_MONTH":scrobbles_month,"KEY_SCROBBLE_NUM_YEAR":scrobbles_year,"KEY_SCROBBLE_NUM_TOTAL":scrobbles_total, + "KEY_SCROBBLE_NUM_TODAY":scrobbles_today,"KEY_SCROBBLE_NUM_WEEK":scrobbles_week,"KEY_SCROBBLE_NUM_MONTH":scrobbles_month,"KEY_SCROBBLE_NUM_YEAR":scrobbles_year,"KEY_SCROBBLE_NUM_TOTAL":scrobbles_total, "KEY_SCROBBLES":html_scrobbles, "KEY_PULSE_MONTHS":html_pulse_months,"KEY_PULSE_YEARS":html_pulse_years,"KEY_PULSE_DAYS":html_pulse_days,"KEY_PULSE_WEEKS":html_pulse_weeks, #"KEY_PULSE_YEAR":html_pulse_year,"KEY_PULSE_MONTH":html_pulse_month,"KEY_PULSE_WEEK":html_pulse_week