mirror of
https://github.com/krateng/maloja.git
synced 2023-08-10 21:12:55 +03:00
Now saving duration and album information for later use
This commit is contained in:
parent
c6deb15437
commit
d4b66ec673
@ -43,7 +43,9 @@ TRACKS = [] # Format: namedtuple(artists=frozenset(artist_ref,...),title=title)
|
|||||||
|
|
||||||
|
|
||||||
Track = namedtuple("Track",["artists","title"])
|
Track = namedtuple("Track",["artists","title"])
|
||||||
Scrobble = namedtuple("Scrobble",["track","timestamp","saved"])
|
Scrobble = namedtuple("Scrobble",["track","timestamp","album","duration","saved"])
|
||||||
|
# album is saved in the scrobble because it's not actually authorative information about the track, just info
|
||||||
|
# what was sent with this scrobble
|
||||||
|
|
||||||
### OPTIMIZATION
|
### OPTIMIZATION
|
||||||
SCROBBLESDICT = {} # timestamps to scrobble mapping
|
SCROBBLESDICT = {} # timestamps to scrobble mapping
|
||||||
@ -108,7 +110,7 @@ def allAPIkeys():
|
|||||||
|
|
||||||
def get_scrobble_dict(o):
|
def get_scrobble_dict(o):
|
||||||
track = get_track_dict(TRACKS[o.track])
|
track = get_track_dict(TRACKS[o.track])
|
||||||
return {"artists":track["artists"],"title":track["title"],"time":o.timestamp}
|
return {"artists":track["artists"],"title":track["title"],"time":o.timestamp,"album":o.album,"duration":o.duration}
|
||||||
|
|
||||||
def get_artist_dict(o):
|
def get_artist_dict(o):
|
||||||
return o
|
return o
|
||||||
@ -125,7 +127,7 @@ def get_track_dict(o):
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
def createScrobble(artists,title,time,volatile=False):
|
def createScrobble(artists,title,time,album=None,duration=None,volatile=False):
|
||||||
|
|
||||||
if len(artists) == 0 or title == "":
|
if len(artists) == 0 or title == "":
|
||||||
return {}
|
return {}
|
||||||
@ -143,7 +145,7 @@ def createScrobble(artists,title,time,volatile=False):
|
|||||||
while (time in SCROBBLESDICT):
|
while (time in SCROBBLESDICT):
|
||||||
time += 1
|
time += 1
|
||||||
|
|
||||||
obj = Scrobble(i,time,volatile) # if volatile generated, we simply pretend we have already saved it to disk
|
obj = Scrobble(i,time,album,duration,volatile) # if volatile generated, we simply pretend we have already saved it to disk
|
||||||
#SCROBBLES.append(obj)
|
#SCROBBLES.append(obj)
|
||||||
# immediately insert scrobble correctly so we can guarantee sorted list
|
# immediately insert scrobble correctly so we can guarantee sorted list
|
||||||
index = insert(SCROBBLES,obj,key=lambda x:x[1])
|
index = insert(SCROBBLES,obj,key=lambda x:x[1])
|
||||||
@ -163,7 +165,7 @@ def readScrobble(artists,title,time):
|
|||||||
while (time in SCROBBLESDICT):
|
while (time in SCROBBLESDICT):
|
||||||
time += 1
|
time += 1
|
||||||
i = getTrackID(artists,title)
|
i = getTrackID(artists,title)
|
||||||
obj = Scrobble(i,time,True)
|
obj = Scrobble(i,time,None,None,True)
|
||||||
SCROBBLES.append(obj)
|
SCROBBLES.append(obj)
|
||||||
SCROBBLESDICT[time] = obj
|
SCROBBLESDICT[time] = obj
|
||||||
#STAMPS.append(time)
|
#STAMPS.append(time)
|
||||||
@ -212,10 +214,13 @@ import unicodedata
|
|||||||
|
|
||||||
# function to turn the name into a representation that can be easily compared, ignoring minor differences
|
# function to turn the name into a representation that can be easily compared, ignoring minor differences
|
||||||
remove_symbols = ["'","`","’"]
|
remove_symbols = ["'","`","’"]
|
||||||
|
replace_with_space = [" - ",": "]
|
||||||
def normalize_name(name):
|
def normalize_name(name):
|
||||||
return "".join(char for char in unicodedata.normalize('NFD',name.lower())
|
for r in replace_with_space:
|
||||||
|
name = name.replace(r," ")
|
||||||
|
name = "".join(char for char in unicodedata.normalize('NFD',name.lower())
|
||||||
if char not in remove_symbols and unicodedata.category(char) != 'Mn')
|
if char not in remove_symbols and unicodedata.category(char) != 'Mn')
|
||||||
|
return name
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -652,39 +657,13 @@ def trackInfo(track):
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@dbserver.get("newscrobble")
|
@dbserver.get("newscrobble")
|
||||||
def pseudo_post_scrobble(artist:Multi,**keys):
|
|
||||||
artists = "/".join(artist)
|
|
||||||
title = keys.get("title")
|
|
||||||
apikey = keys.get("key")
|
|
||||||
client = checkAPIkey(apikey)
|
|
||||||
if client == False: # empty string allowed!
|
|
||||||
response.status = 403
|
|
||||||
return ""
|
|
||||||
try:
|
|
||||||
time = int(keys.get("time"))
|
|
||||||
except:
|
|
||||||
time = int(datetime.datetime.now(tz=datetime.timezone.utc).timestamp())
|
|
||||||
|
|
||||||
log("Incoming scrobble (native API): Client " + client + ", ARTISTS: " + str(artists) + ", TRACK: " + title,module="debug")
|
|
||||||
(artists,title) = cla.fullclean(artists,title)
|
|
||||||
|
|
||||||
## this is necessary for localhost testing
|
|
||||||
response.set_header("Access-Control-Allow-Origin","*")
|
|
||||||
|
|
||||||
trackdict = createScrobble(artists,title,time)
|
|
||||||
|
|
||||||
sync()
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return {"status":"success","track":trackdict}
|
|
||||||
|
|
||||||
@dbserver.post("newscrobble")
|
@dbserver.post("newscrobble")
|
||||||
def post_scrobble(artist:Multi,**keys):
|
def post_scrobble(artist:Multi,**keys):
|
||||||
artists = "/".join(artist)
|
artists = "/".join(artist)
|
||||||
title = keys.get("title")
|
title = keys.get("title")
|
||||||
|
album = keys.get("album")
|
||||||
|
duration = keys.get("seconds")
|
||||||
apikey = keys.get("key")
|
apikey = keys.get("key")
|
||||||
client = checkAPIkey(apikey)
|
client = checkAPIkey(apikey)
|
||||||
if client == False: # empty string allowed!
|
if client == False: # empty string allowed!
|
||||||
@ -702,7 +681,7 @@ def post_scrobble(artist:Multi,**keys):
|
|||||||
## this is necessary for localhost testing
|
## this is necessary for localhost testing
|
||||||
#response.set_header("Access-Control-Allow-Origin","*")
|
#response.set_header("Access-Control-Allow-Origin","*")
|
||||||
|
|
||||||
trackdict = createScrobble(artists,title,time)
|
trackdict = createScrobble(artists,title,time,album,duration)
|
||||||
|
|
||||||
sync()
|
sync()
|
||||||
#always sync, one filesystem access every three minutes shouldn't matter
|
#always sync, one filesystem access every three minutes shouldn't matter
|
||||||
@ -1005,7 +984,7 @@ def sync():
|
|||||||
entries = {}
|
entries = {}
|
||||||
|
|
||||||
for idx in range(len(SCROBBLES)):
|
for idx in range(len(SCROBBLES)):
|
||||||
if not SCROBBLES[idx][2]:
|
if not SCROBBLES[idx].saved:
|
||||||
|
|
||||||
t = get_scrobble_dict(SCROBBLES[idx])
|
t = get_scrobble_dict(SCROBBLES[idx])
|
||||||
|
|
||||||
@ -1014,12 +993,16 @@ def sync():
|
|||||||
artistss = "␟".join(artistlist)
|
artistss = "␟".join(artistlist)
|
||||||
timestamp = datetime.date.fromtimestamp(t["time"])
|
timestamp = datetime.date.fromtimestamp(t["time"])
|
||||||
|
|
||||||
entry = [str(t["time"]),artistss,t["title"]]
|
album = t["album"] or "-"
|
||||||
|
duration = t["duration"] or "-"
|
||||||
|
|
||||||
|
entry = [str(t["time"]),artistss,t["title"],album,duration]
|
||||||
|
|
||||||
monthcode = str(timestamp.year) + "_" + str(timestamp.month)
|
monthcode = str(timestamp.year) + "_" + str(timestamp.month)
|
||||||
entries.setdefault(monthcode,[]).append(entry) #i feckin love the setdefault function
|
entries.setdefault(monthcode,[]).append(entry) #i feckin love the setdefault function
|
||||||
|
|
||||||
SCROBBLES[idx] = (SCROBBLES[idx][0],SCROBBLES[idx][1],True)
|
SCROBBLES[idx] = Scrobble(*SCROBBLES[idx][:-1],True)
|
||||||
|
# save copy with last tuple entry set to true
|
||||||
|
|
||||||
#log("Sorted into months",module="debug")
|
#log("Sorted into months",module="debug")
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user