From 24675bf202ec5d67727c5b7bc61856d3c8a192b8 Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Wed, 18 Oct 2023 11:54:34 -0400 Subject: [PATCH] db: Save and restore the track added date when deleting a Track I found that deleted and restorted tracks were incorrectly showing up in the "New Tracks" playlist. I can fix this by saving the track added date when the tracks is deleted. The only thing I can't do easily is get the added date for tracks that have already been deleted, so I set this to the date of the database upgrade. Fixes: #64 ("Save the tracks.added date when deleting") Signed-off-by: Anna Schumaker --- emmental/db/upgrade-v2.sql | 35 +++++++++++++++++++++++++++++++++++ tests/db/test_tracks.py | 11 +++++++++-- 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/emmental/db/upgrade-v2.sql b/emmental/db/upgrade-v2.sql index c45856c..0a783f9 100644 --- a/emmental/db/upgrade-v2.sql +++ b/emmental/db/upgrade-v2.sql @@ -1,3 +1,38 @@ /* Copyright 2023 (c) Anna Schumaker */ PRAGMA user_version = 2; + +/* + * The `saved_track_data` table is missing the date added field, which + * causes restored tracks to show up in the "New Tracks" playlist again. + * We can fix this by storing the date that the track was initially added + * to the database, and restoring it later. + */ + +ALTER TABLE saved_track_data + ADD COLUMN added DATE DEFAULT NULL; + +UPDATE saved_track_data SET added = CURRENT_DATE; + +DROP TRIGGER tracks_delete_save; +CREATE TRIGGER tracks_delete_save BEFORE DELETE ON tracks + WHEN OLD.mbid != "" BEGIN + INSERT INTO saved_track_data + (mbid, favorite, playcount, lastplayed, laststarted, added) + VALUES (OLD.mbid, OLD.favorite, OLD.playcount, + OLD.lastplayed, OLD.laststarted, OLD.added); + END; + +DROP TRIGGER tracks_insert_restore; +CREATE TRIGGER tracks_insert_restore AFTER INSERT ON tracks + WHEN NEW.mbid != "" BEGIN + UPDATE tracks SET favorite = saved_track_data.favorite, + playcount = saved_track_data.playcount, + lastplayed = saved_track_data.lastplayed, + laststarted = saved_track_data.laststarted, + added = saved_track_data.added + FROM saved_track_data + WHERE tracks.mbid = saved_track_data.mbid AND + tracks.mbid = NEW.mbid; + DELETE FROM saved_track_data WHERE mbid = NEW.mbid; + END; diff --git a/tests/db/test_tracks.py b/tests/db/test_tracks.py index 187ecb3..fea280f 100644 --- a/tests/db/test_tracks.py +++ b/tests/db/test_tracks.py @@ -248,9 +248,13 @@ class TestTrackTable(tests.util.TestCase): def test_create_restore(self): """Test restoring saved track data.""" now = datetime.datetime.now() + today = datetime.date.today() + yesterday = today - datetime.timedelta(days=1) self.sql("""INSERT INTO saved_track_data - (mbid, favorite, playcount, lastplayed, laststarted) - VALUES (?, ?, ?, ? , ?)""", "ab-cd-ef", True, 42, now, now) + (mbid, favorite, playcount, + lastplayed, laststarted, added) + VALUES (?, ?, ?, ? , ?, ?)""", + "ab-cd-ef", True, 42, now, now, yesterday) track1 = self.tracks.create(self.library, pathlib.Path("/a/b/1.ogg"), self.medium, self.year) @@ -258,6 +262,7 @@ class TestTrackTable(tests.util.TestCase): self.assertEqual(track1.playcount, 0) self.assertIsNone(track1.lastplayed) self.assertIsNone(track1.laststarted) + self.assertEqual(track1.added, today) row = self.sql("SELECT COUNT(*) FROM saved_track_data").fetchone() self.assertEqual(row["COUNT(*)"], 1) @@ -268,6 +273,7 @@ class TestTrackTable(tests.util.TestCase): self.assertEqual(track2.playcount, 42) self.assertEqual(track2.lastplayed, now) self.assertEqual(track2.laststarted, now) + self.assertEqual(track2.added, yesterday) row = self.sql("SELECT COUNT(*) FROM saved_track_data").fetchone() self.assertEqual(row["COUNT(*)"], 0) @@ -308,6 +314,7 @@ class TestTrackTable(tests.util.TestCase): self.assertEqual(rows[0]["laststarted"], now) self.assertEqual(rows[0]["lastplayed"], now) self.assertEqual(rows[0]["playcount"], 42) + self.assertEqual(rows[0]["added"], datetime.date.today()) def test_filter(self): """Test filtering the Track table."""