mirror of
https://github.com/krateng/maloja.git
synced 2023-08-10 21:12:55 +03:00
Implemented several functions for albums
This commit is contained in:
parent
4620ed1407
commit
e7b1cb469d
@ -93,7 +93,7 @@ def incoming_scrobble(rawscrobble,fix=True,client=None,api=None,dbconn=None):
|
|||||||
log(f"Incoming scrobble [Client: {client} | API: {api}]: {rawscrobble}")
|
log(f"Incoming scrobble [Client: {client} | API: {api}]: {rawscrobble}")
|
||||||
|
|
||||||
scrobbledict = rawscrobble_to_scrobbledict(rawscrobble, fix, client)
|
scrobbledict = rawscrobble_to_scrobbledict(rawscrobble, fix, client)
|
||||||
albumupdate = (malojaconf["ALBUM_INFORMATION_TRUST"] == 'last')
|
albumupdate = (malojaconfig["ALBUM_INFORMATION_TRUST"] == 'last')
|
||||||
|
|
||||||
|
|
||||||
sqldb.add_scrobble(scrobbledict,update_album=albumupdate,dbconn=dbconn)
|
sqldb.add_scrobble(scrobbledict,update_album=albumupdate,dbconn=dbconn)
|
||||||
@ -267,6 +267,15 @@ def get_charts_tracks(dbconn=None,**keys):
|
|||||||
result = sqldb.count_scrobbles_by_track(since=since,to=to,dbconn=dbconn)
|
result = sqldb.count_scrobbles_by_track(since=since,to=to,dbconn=dbconn)
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
@waitfordb
|
||||||
|
def get_charts_albums(dbconn=None,**keys):
|
||||||
|
(since,to) = keys.get('timerange').timestamps()
|
||||||
|
if 'artist' in keys:
|
||||||
|
result = sqldb.count_scrobbles_by_album_of_artist(since=since,to=to,artist=keys['artist'],dbconn=dbconn)
|
||||||
|
else:
|
||||||
|
result = sqldb.count_scrobbles_by_album(since=since,to=to,dbconn=dbconn)
|
||||||
|
return result
|
||||||
|
|
||||||
@waitfordb
|
@waitfordb
|
||||||
def get_pulse(dbconn=None,**keys):
|
def get_pulse(dbconn=None,**keys):
|
||||||
|
|
||||||
@ -421,6 +430,36 @@ def track_info(dbconn=None,**keys):
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@waitfordb
|
||||||
|
def album_info(dbconn=None,**keys):
|
||||||
|
|
||||||
|
album = keys.get('album')
|
||||||
|
if album is None: raise exceptions.MissingEntityParameter()
|
||||||
|
|
||||||
|
album_id = sqldb.get_album_id(album,dbconn=dbconn)
|
||||||
|
album = sqldb.get_album(album_id,dbconn=dbconn)
|
||||||
|
|
||||||
|
alltimecharts = get_charts_albums(timerange=alltime(),dbconn=dbconn)
|
||||||
|
|
||||||
|
#scrobbles = get_scrobbles_num(track=track,timerange=alltime())
|
||||||
|
|
||||||
|
c = [e for e in alltimecharts if e["album"] == album][0]
|
||||||
|
scrobbles = c["scrobbles"]
|
||||||
|
position = c["rank"]
|
||||||
|
|
||||||
|
return {
|
||||||
|
"album":album,
|
||||||
|
"scrobbles":scrobbles,
|
||||||
|
"position":position,
|
||||||
|
"medals":{
|
||||||
|
"gold": [year for year in cached.medals_albums if album_id in cached.medals_albums[year]['gold']],
|
||||||
|
"silver": [year for year in cached.medals_albums if album_id in cached.medals_albums[year]['silver']],
|
||||||
|
"bronze": [year for year in cached.medals_albums if album_id in cached.medals_albums[year]['bronze']],
|
||||||
|
},
|
||||||
|
"topweeks":len([e for e in cached.weekly_topalbums if e == album_id]),
|
||||||
|
"id":album_id
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
def get_predefined_rulesets(dbconn=None):
|
def get_predefined_rulesets(dbconn=None):
|
||||||
validchars = "-_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
|
validchars = "-_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
|
||||||
|
@ -14,16 +14,21 @@ medals_artists = {
|
|||||||
medals_tracks = {
|
medals_tracks = {
|
||||||
# year: {'gold':[],'silver':[],'bronze':[]}
|
# year: {'gold':[],'silver':[],'bronze':[]}
|
||||||
}
|
}
|
||||||
|
medals_albums = {
|
||||||
|
# year: {'gold':[],'silver':[],'bronze':[]}
|
||||||
|
}
|
||||||
|
|
||||||
weekly_topartists = []
|
weekly_topartists = []
|
||||||
weekly_toptracks = []
|
weekly_toptracks = []
|
||||||
|
weekly_topalbums = []
|
||||||
|
|
||||||
@runyearly
|
@runyearly
|
||||||
def update_medals():
|
def update_medals():
|
||||||
|
|
||||||
global medals_artists, medals_tracks
|
global medals_artists, medals_tracks, medals_albums
|
||||||
medals_artists.clear()
|
medals_artists.clear()
|
||||||
medals_tracks.clear()
|
medals_tracks.clear()
|
||||||
|
medals_albums.clear()
|
||||||
|
|
||||||
with sqldb.engine.begin() as conn:
|
with sqldb.engine.begin() as conn:
|
||||||
for year in mjt.ranges(step="year"):
|
for year in mjt.ranges(step="year"):
|
||||||
@ -31,11 +36,14 @@ def update_medals():
|
|||||||
|
|
||||||
charts_artists = sqldb.count_scrobbles_by_artist(since=year.first_stamp(),to=year.last_stamp(),resolve_ids=False,dbconn=conn)
|
charts_artists = sqldb.count_scrobbles_by_artist(since=year.first_stamp(),to=year.last_stamp(),resolve_ids=False,dbconn=conn)
|
||||||
charts_tracks = sqldb.count_scrobbles_by_track(since=year.first_stamp(),to=year.last_stamp(),resolve_ids=False,dbconn=conn)
|
charts_tracks = sqldb.count_scrobbles_by_track(since=year.first_stamp(),to=year.last_stamp(),resolve_ids=False,dbconn=conn)
|
||||||
|
charts_albums = sqldb.count_scrobbles_by_album(since=year.first_stamp(),to=year.last_stamp(),resolve_ids=False,dbconn=conn)
|
||||||
|
|
||||||
entry_artists = {'gold':[],'silver':[],'bronze':[]}
|
entry_artists = {'gold':[],'silver':[],'bronze':[]}
|
||||||
entry_tracks = {'gold':[],'silver':[],'bronze':[]}
|
entry_tracks = {'gold':[],'silver':[],'bronze':[]}
|
||||||
|
entry_albums = {'gold':[],'silver':[],'bronze':[]}
|
||||||
medals_artists[year.desc()] = entry_artists
|
medals_artists[year.desc()] = entry_artists
|
||||||
medals_tracks[year.desc()] = entry_tracks
|
medals_tracks[year.desc()] = entry_tracks
|
||||||
|
medals_albums[year.desc()] = entry_albums
|
||||||
|
|
||||||
for entry in charts_artists:
|
for entry in charts_artists:
|
||||||
if entry['rank'] == 1: entry_artists['gold'].append(entry['artist_id'])
|
if entry['rank'] == 1: entry_artists['gold'].append(entry['artist_id'])
|
||||||
@ -47,6 +55,11 @@ def update_medals():
|
|||||||
elif entry['rank'] == 2: entry_tracks['silver'].append(entry['track_id'])
|
elif entry['rank'] == 2: entry_tracks['silver'].append(entry['track_id'])
|
||||||
elif entry['rank'] == 3: entry_tracks['bronze'].append(entry['track_id'])
|
elif entry['rank'] == 3: entry_tracks['bronze'].append(entry['track_id'])
|
||||||
else: break
|
else: break
|
||||||
|
for entry in charts_albums:
|
||||||
|
if entry['rank'] == 1: entry_albums['gold'].append(entry['album_id'])
|
||||||
|
elif entry['rank'] == 2: entry_albums['silver'].append(entry['album_id'])
|
||||||
|
elif entry['rank'] == 3: entry_albums['bronze'].append(entry['album_id'])
|
||||||
|
else: break
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -54,9 +67,10 @@ def update_medals():
|
|||||||
@rundaily
|
@rundaily
|
||||||
def update_weekly():
|
def update_weekly():
|
||||||
|
|
||||||
global weekly_topartists, weekly_toptracks
|
global weekly_topartists, weekly_toptracks, weekly_topalbums
|
||||||
weekly_topartists.clear()
|
weekly_topartists.clear()
|
||||||
weekly_toptracks.clear()
|
weekly_toptracks.clear()
|
||||||
|
weekly_topalbums.clear()
|
||||||
|
|
||||||
with sqldb.engine.begin() as conn:
|
with sqldb.engine.begin() as conn:
|
||||||
for week in mjt.ranges(step="week"):
|
for week in mjt.ranges(step="week"):
|
||||||
@ -65,6 +79,7 @@ def update_weekly():
|
|||||||
|
|
||||||
charts_artists = sqldb.count_scrobbles_by_artist(since=week.first_stamp(),to=week.last_stamp(),resolve_ids=False,dbconn=conn)
|
charts_artists = sqldb.count_scrobbles_by_artist(since=week.first_stamp(),to=week.last_stamp(),resolve_ids=False,dbconn=conn)
|
||||||
charts_tracks = sqldb.count_scrobbles_by_track(since=week.first_stamp(),to=week.last_stamp(),resolve_ids=False,dbconn=conn)
|
charts_tracks = sqldb.count_scrobbles_by_track(since=week.first_stamp(),to=week.last_stamp(),resolve_ids=False,dbconn=conn)
|
||||||
|
charts_albums = sqldb.count_scrobbles_by_album(since=week.first_stamp(),to=week.last_stamp(),resolve_ids=False,dbconn=conn)
|
||||||
|
|
||||||
for entry in charts_artists:
|
for entry in charts_artists:
|
||||||
if entry['rank'] == 1: weekly_topartists.append(entry['artist_id'])
|
if entry['rank'] == 1: weekly_topartists.append(entry['artist_id'])
|
||||||
@ -72,3 +87,6 @@ def update_weekly():
|
|||||||
for entry in charts_tracks:
|
for entry in charts_tracks:
|
||||||
if entry['rank'] == 1: weekly_toptracks.append(entry['track_id'])
|
if entry['rank'] == 1: weekly_toptracks.append(entry['track_id'])
|
||||||
else: break
|
else: break
|
||||||
|
for entry in charts_albums:
|
||||||
|
if entry['rank'] == 1: weekly_topalbums.append(entry['album_id'])
|
||||||
|
else: break
|
||||||
|
@ -246,7 +246,7 @@ def albums_db_to_dict(rows,dbconn=None):
|
|||||||
]
|
]
|
||||||
|
|
||||||
def album_db_to_dict(row,dbconn=None):
|
def album_db_to_dict(row,dbconn=None):
|
||||||
return albums_db_to_dict([row],dbconn=dbconn)
|
return albums_db_to_dict([row],dbconn=dbconn)[0]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -814,6 +814,35 @@ def count_scrobbles_by_track(since,to,resolve_ids=True,dbconn=None):
|
|||||||
result = rank(result,key='scrobbles')
|
result = rank(result,key='scrobbles')
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
@cached_wrapper
|
||||||
|
@connection_provider
|
||||||
|
def count_scrobbles_by_album(since,to,resolve_ids=True,dbconn=None):
|
||||||
|
|
||||||
|
jointable = sql.join(
|
||||||
|
DB['scrobbles'],
|
||||||
|
DB['tracks'],
|
||||||
|
DB['scrobbles'].c.track_id == DB['tracks'].c.id
|
||||||
|
)
|
||||||
|
|
||||||
|
op = sql.select(
|
||||||
|
sql.func.count(sql.func.distinct(DB['scrobbles'].c.timestamp)).label('count'),
|
||||||
|
DB['tracks'].c.album_id
|
||||||
|
).select_from(jointable).where(
|
||||||
|
DB['scrobbles'].c.timestamp<=to,
|
||||||
|
DB['scrobbles'].c.timestamp>=since,
|
||||||
|
DB['tracks'].c.album_id != None
|
||||||
|
).group_by(DB['tracks'].c.album_id).order_by(sql.desc('count'))
|
||||||
|
result = dbconn.execute(op).all()
|
||||||
|
|
||||||
|
if resolve_ids:
|
||||||
|
counts = [row.count for row in result]
|
||||||
|
albums = get_albums_map([row.album_id for row in result],dbconn=dbconn)
|
||||||
|
result = [{'scrobbles':row.count,'album':albums[row.album_id]} for row in result]
|
||||||
|
else:
|
||||||
|
result = [{'scrobbles':row.count,'album_id':row.album_id} for row in result]
|
||||||
|
result = rank(result,key='scrobbles')
|
||||||
|
return result
|
||||||
|
|
||||||
@cached_wrapper
|
@cached_wrapper
|
||||||
@connection_provider
|
@connection_provider
|
||||||
def count_scrobbles_by_track_of_artist(since,to,artist,dbconn=None):
|
def count_scrobbles_by_track_of_artist(since,to,artist,dbconn=None):
|
||||||
@ -909,6 +938,22 @@ def get_artists_map(artist_ids,dbconn=None):
|
|||||||
return artists
|
return artists
|
||||||
|
|
||||||
|
|
||||||
|
@cached_wrapper_individual
|
||||||
|
@connection_provider
|
||||||
|
def get_albums_map(album_ids,dbconn=None):
|
||||||
|
op = DB['albums'].select().where(
|
||||||
|
DB['albums'].c.id.in_(album_ids)
|
||||||
|
)
|
||||||
|
result = dbconn.execute(op).all()
|
||||||
|
|
||||||
|
albums = {}
|
||||||
|
result = list(result)
|
||||||
|
# this will get a list of albumdicts in the correct order of our rows
|
||||||
|
albumdicts = albums_db_to_dict(result,dbconn=dbconn)
|
||||||
|
for row,albumdict in zip(result,albumdicts):
|
||||||
|
albums[row.id] = albumdict
|
||||||
|
return albums
|
||||||
|
|
||||||
### associations
|
### associations
|
||||||
|
|
||||||
@cached_wrapper
|
@cached_wrapper
|
||||||
@ -975,6 +1020,16 @@ def get_artist(id,dbconn=None):
|
|||||||
artistinfo = result[0]
|
artistinfo = result[0]
|
||||||
return artist_db_to_dict(artistinfo,dbconn=dbconn)
|
return artist_db_to_dict(artistinfo,dbconn=dbconn)
|
||||||
|
|
||||||
|
@cached_wrapper
|
||||||
|
@connection_provider
|
||||||
|
def get_album(id,dbconn=None):
|
||||||
|
op = DB['albums'].select().where(
|
||||||
|
DB['albums'].c.id==id
|
||||||
|
)
|
||||||
|
result = dbconn.execute(op).all()
|
||||||
|
|
||||||
|
albuminfo = result[0]
|
||||||
|
return album_db_to_dict(albuminfo,dbconn=dbconn)
|
||||||
|
|
||||||
@cached_wrapper
|
@cached_wrapper
|
||||||
@connection_provider
|
@connection_provider
|
||||||
|
Loading…
Reference in New Issue
Block a user