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 <Anna@NoWheyCreamery.com>
This commit is contained in:
parent
072264a77c
commit
24675bf202
|
@ -1,3 +1,38 @@
|
||||||
/* Copyright 2023 (c) Anna Schumaker */
|
/* Copyright 2023 (c) Anna Schumaker */
|
||||||
|
|
||||||
PRAGMA user_version = 2;
|
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;
|
||||||
|
|
|
@ -248,9 +248,13 @@ class TestTrackTable(tests.util.TestCase):
|
||||||
def test_create_restore(self):
|
def test_create_restore(self):
|
||||||
"""Test restoring saved track data."""
|
"""Test restoring saved track data."""
|
||||||
now = datetime.datetime.now()
|
now = datetime.datetime.now()
|
||||||
|
today = datetime.date.today()
|
||||||
|
yesterday = today - datetime.timedelta(days=1)
|
||||||
self.sql("""INSERT INTO saved_track_data
|
self.sql("""INSERT INTO saved_track_data
|
||||||
(mbid, favorite, playcount, lastplayed, laststarted)
|
(mbid, favorite, playcount,
|
||||||
VALUES (?, ?, ?, ? , ?)""", "ab-cd-ef", True, 42, now, now)
|
lastplayed, laststarted, added)
|
||||||
|
VALUES (?, ?, ?, ? , ?, ?)""",
|
||||||
|
"ab-cd-ef", True, 42, now, now, yesterday)
|
||||||
|
|
||||||
track1 = self.tracks.create(self.library, pathlib.Path("/a/b/1.ogg"),
|
track1 = self.tracks.create(self.library, pathlib.Path("/a/b/1.ogg"),
|
||||||
self.medium, self.year)
|
self.medium, self.year)
|
||||||
|
@ -258,6 +262,7 @@ class TestTrackTable(tests.util.TestCase):
|
||||||
self.assertEqual(track1.playcount, 0)
|
self.assertEqual(track1.playcount, 0)
|
||||||
self.assertIsNone(track1.lastplayed)
|
self.assertIsNone(track1.lastplayed)
|
||||||
self.assertIsNone(track1.laststarted)
|
self.assertIsNone(track1.laststarted)
|
||||||
|
self.assertEqual(track1.added, today)
|
||||||
|
|
||||||
row = self.sql("SELECT COUNT(*) FROM saved_track_data").fetchone()
|
row = self.sql("SELECT COUNT(*) FROM saved_track_data").fetchone()
|
||||||
self.assertEqual(row["COUNT(*)"], 1)
|
self.assertEqual(row["COUNT(*)"], 1)
|
||||||
|
@ -268,6 +273,7 @@ class TestTrackTable(tests.util.TestCase):
|
||||||
self.assertEqual(track2.playcount, 42)
|
self.assertEqual(track2.playcount, 42)
|
||||||
self.assertEqual(track2.lastplayed, now)
|
self.assertEqual(track2.lastplayed, now)
|
||||||
self.assertEqual(track2.laststarted, now)
|
self.assertEqual(track2.laststarted, now)
|
||||||
|
self.assertEqual(track2.added, yesterday)
|
||||||
|
|
||||||
row = self.sql("SELECT COUNT(*) FROM saved_track_data").fetchone()
|
row = self.sql("SELECT COUNT(*) FROM saved_track_data").fetchone()
|
||||||
self.assertEqual(row["COUNT(*)"], 0)
|
self.assertEqual(row["COUNT(*)"], 0)
|
||||||
|
@ -308,6 +314,7 @@ class TestTrackTable(tests.util.TestCase):
|
||||||
self.assertEqual(rows[0]["laststarted"], now)
|
self.assertEqual(rows[0]["laststarted"], now)
|
||||||
self.assertEqual(rows[0]["lastplayed"], now)
|
self.assertEqual(rows[0]["lastplayed"], now)
|
||||||
self.assertEqual(rows[0]["playcount"], 42)
|
self.assertEqual(rows[0]["playcount"], 42)
|
||||||
|
self.assertEqual(rows[0]["added"], datetime.date.today())
|
||||||
|
|
||||||
def test_filter(self):
|
def test_filter(self):
|
||||||
"""Test filtering the Track table."""
|
"""Test filtering the Track table."""
|
||||||
|
|
Loading…
Reference in New Issue