From ea6d70a650b29837515c097ea41cc61b72f73c12 Mon Sep 17 00:00:00 2001 From: krateng Date: Sun, 17 Apr 2022 17:37:17 +0200 Subject: [PATCH] Implemented experimental merging server-side --- dev/releases/branch.yml | 3 ++- maloja/apis/native_v1.py | 13 +++++++++++++ maloja/database/__init__.py | 14 ++++++++++++++ maloja/database/sqldb.py | 25 +++++++++++++++++++++++++ 4 files changed, 54 insertions(+), 1 deletion(-) diff --git a/dev/releases/branch.yml b/dev/releases/branch.yml index c0e84e5..9b2b089 100644 --- a/dev/releases/branch.yml +++ b/dev/releases/branch.yml @@ -1 +1,2 @@ -- "[Feature] Can now edit track titles and artist names from web interface" +- "[Feature] Implemented track title and artist name editing from web interface" +- "[Feature] Implemented track and artist merging from web interface" diff --git a/maloja/apis/native_v1.py b/maloja/apis/native_v1.py index 53489b7..2f5087f 100644 --- a/maloja/apis/native_v1.py +++ b/maloja/apis/native_v1.py @@ -602,3 +602,16 @@ def edit_artist(id,name): def edit_track(id,title): """Internal Use Only""" return database.edit_track(id,{'title':title}) + + +@api.post("merge_tracks") +@authenticated_function(api=True) +def merge_tracks(target_id,source_ids): + """Internal Use Only""" + return database.merge_tracks(target_id,source_ids) + +@api.post("merge_artists") +@authenticated_function(api=True) +def merge_artists(target_id,source_ids): + """Internal Use Only""" + return database.merge_artists(target_id,source_ids) diff --git a/maloja/database/__init__.py b/maloja/database/__init__.py index 7086d64..45c7f79 100644 --- a/maloja/database/__init__.py +++ b/maloja/database/__init__.py @@ -162,7 +162,21 @@ def edit_track(id,trackinfo): dbcache.invalidate_entity_cache() dbcache.invalidate_caches() +@waitfordb +def merge_artists(target_id,source_ids): + sources = [sqldb.get_artist(id) for id in source_ids] + target = sqldb.get_artist(target_id) + log(f"Merging {sources} into {target}") + sqldb.merge_artists(target_id,source_ids) + dbcache.invalidate_entity_cache() +@waitfordb +def merge_tracks(target_id,source_ids): + sources = [sqldb.get_track(id) for id in source_ids] + target = sqldb.get_track(target_id) + log(f"Merging {sources} into {target}") + sqldb.merge_tracks(target_id,source_ids) + dbcache.invalidate_entity_cache() diff --git a/maloja/database/sqldb.py b/maloja/database/sqldb.py index 1992b3d..ff4037d 100644 --- a/maloja/database/sqldb.py +++ b/maloja/database/sqldb.py @@ -379,6 +379,31 @@ def edit_track(id,trackdict,dbconn=None): result = dbconn.execute(op) +### Merge + +@connection_provider +def merge_tracks(target_id,source_ids,dbconn=None): + + op = DB['scrobbles'].update().where( + DB['scrobbles'].c.track_id.in_(source_ids) + ).values( + track_id=target_id + ) + result = dbconn.execute(op) + clean_db() + +@connection_provider +def merge_artists(target_id,source_ids,dbconn=None): + + op = DB['trackartists'].update().where( + DB['trackartists'].c.artist_id.in_(source_ids) + ).values( + artist_id=target_id + ) + result = dbconn.execute(op) + clean_db() + + ### Functions that get rows according to parameters