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 @@
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