From 3cda4caa76150848650c0cd731fdcb3b547b5dfa Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Wed, 12 Apr 2023 16:22:08 -0400 Subject: [PATCH] db: Give the Tagger a function for untagging Tracks This is used to remove a Track from each of its Playlists before deleting. Signed-off-by: Anna Schumaker --- emmental/db/tagger.py | 14 ++++++++++++++ tests/db/test_tagger.py | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/emmental/db/tagger.py b/emmental/db/tagger.py index b6faf00..240cfa2 100644 --- a/emmental/db/tagger.py +++ b/emmental/db/tagger.py @@ -262,3 +262,17 @@ class Thread(threading.Thread): self._mtime = mtime self._tags = None self._condition.notify() + + +def untag_track(db: GObject.TYPE_PYOBJECT, track: tracks.Track) -> None: + """Untag a Track.""" + medium = track.get_medium() + year = track.get_year() + + playlists = [plist for plist in db.playlists.store] + playlists.extend([medium, medium.get_album()]) + playlists.extend(track.get_artists()) + playlists.extend([year, year.parent, track.get_library()]) + + for plist in playlists: + plist.remove_track(track) diff --git a/tests/db/test_tagger.py b/tests/db/test_tagger.py index 952489a..0450952 100644 --- a/tests/db/test_tagger.py +++ b/tests/db/test_tagger.py @@ -400,3 +400,37 @@ class TestTaggerThread(tests.util.TestCase): emmental.db.connection.Connection) self.assertEqual(audio_tags.artists[0].name, "Some Artist") self.assertEqual(audio_tags.artists[1].name, "Some Artist") + + +class TestUntag(tests.util.TestCase): + """Test untagging a Track.""" + + def setUp(self): + """Set up common variables.""" + super().setUp() + self.sql.playlists.load(now=True) + + self.file = pathlib.Path("/a/b/c.ogg") + self.library = self.sql.libraries.create(self.file.parent) + self.raw_tags = {"album": ["Album Name"], + "artist": ["Track Artist"], + "date": ["1988-06"], + "title": ["Test Title"], + "tracknumber": ["3"], + "musicbrainz_releasetrackid": ["ab-cd-ef"]} + self.audio_tags = emmental.audio.tagger._Tags(self.file, self.raw_tags, + 12345, 678.9) + self.tagged = emmental.db.tagger.Tags(self.sql, self.audio_tags, + self.library) + + for tbl in self.sql.playlist_tables(): + tbl.queue.complete() + + def test_untag_track(self): + """Test untagging a Track before deleting.""" + emmental.db.tagger.untag_track(self.sql, self.tagged.track) + + for tbl in self.sql.playlist_tables(): + for plist in tbl.store: + with self.subTest(table=tbl, playlist=plist.name): + self.assertFalse(plist.has_track(self.tagged.track))