From 8a4d3219d28c4a3a33e41095242fa8c00b7bc61d Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Mon, 11 Mar 2019 17:02:59 -0400 Subject: [PATCH] curds: Create "new-album" and "new-track" notifications And update the playlist manager to use the new-track, rather than relying on "on-scan" Signed-off-by: Anna Schumaker --- curds/playlist/manager.py | 4 ++-- curds/tags.py | 12 ++++++++---- curds/test_tags_album.py | 15 ++++++++++++++- curds/test_tags_track.py | 14 +++++++++++++- 4 files changed, 37 insertions(+), 8 deletions(-) diff --git a/curds/playlist/manager.py b/curds/playlist/manager.py index 1b8f7f5..9f1cd0b 100644 --- a/curds/playlist/manager.py +++ b/curds/playlist/manager.py @@ -17,7 +17,7 @@ class PlaylistManager(dict): self["Collection"] = playlist.Playlist("collection") self["Library"] = LibraryManager() - notify.Notify.notify_me("on-scan", self.on_scan) + notify.Notify.notify_me("new-track", self.on_new_track) - def on_scan(self, plist, track): + def on_new_track(self, track): self["Collection"].add(track) diff --git a/curds/tags.py b/curds/tags.py index 2c0835b..c83f998 100644 --- a/curds/tags.py +++ b/curds/tags.py @@ -1,5 +1,6 @@ # Copyright 2019 (c) Anna Schumaker. from . import data +from . import notify import mutagen import os import re @@ -11,8 +12,11 @@ class Tag: def extract(info, key, default): return info.get(key, [ default ])[0] - def lookup(tag): - return tag_map.setdefault(hash(tag), tag) + def lookup(tag, cb): + ret = tag_map.setdefault(hash(tag), tag) + if ret == tag: + notify.Notify.notify(cb, ret) + return ret class Album(Tag): @@ -34,7 +38,7 @@ class Album(Tag): return hash((self.album, self.albumartist, self.date)) def lookup(info): - return Tag.lookup(Album(info)) + return Tag.lookup(Album(info), "new-album") class Track(Tag): @@ -67,7 +71,7 @@ class Track(Tag): def add(path): track = Track(path) - return track if Tag.lookup(track) == track else None + return track if Tag.lookup(track, "new-track") == track else None def save(): diff --git a/curds/test_tags_album.py b/curds/test_tags_album.py index 2d6d0ed..b7947ea 100644 --- a/curds/test_tags_album.py +++ b/curds/test_tags_album.py @@ -1,4 +1,5 @@ # Copyright 2019 (c) Anna Schumaker. +from . import notify from . import tags import unittest @@ -6,6 +7,11 @@ album_info = {"album" : [ "Test Album" ], "albumartist" : [ "Test Artist" ], "date" : [ "2019" ], "genre" : [ "Test" ], "tracktotal" : [ "1" ]} class TestAlbumTag(unittest.TestCase): + def setUp(self): + notify.Notify.clear() + tags.tag_map.clear() + self.cb_album = None + def test_album_init_basic(self): a = tags.Album(album_info) self.assertIsInstance(a, tags.Tag) @@ -45,13 +51,20 @@ class TestAlbumTag(unittest.TestCase): self.assertEqual(tags.Album({"album" : [ "Test Album;CdFive" ]}).album, "Test Album") self.assertEqual(tags.Album({"album" : [ "Test Album CD 9/10" ]}).album, "Test Album") self.assertEqual(tags.Album({"album" : [ "Disc One: Test Album" ]}).album, "Disc One: Test Album") + + def on_new_album(self, album): + self.cb_album = album + def test_album_lookup(self): - tags.tag_map.clear() + notify.Notify.notify_me("new-album", self.on_new_album) a = tags.Album.lookup(album_info) self.assertIsNotNone(a) self.assertIn(a, tags.tag_map.values()) + self.assertEqual(a, self.cb_album) + self.cb_album = None for i in range(10): b = tags.Album.lookup(album_info) self.assertEqual(a, b) + self.assertIsNone(self.cb_album) self.assertEqual(len(tags.tag_map), 1) diff --git a/curds/test_tags_track.py b/curds/test_tags_track.py index 6883cce..7bc679e 100644 --- a/curds/test_tags_track.py +++ b/curds/test_tags_track.py @@ -1,4 +1,5 @@ # Copyright 2019 (c) Anna Schumaker. +from . import notify from . import tags import os import unittest @@ -6,6 +7,11 @@ import unittest test_tracks = os.path.abspath("./trier/Test Album") class TestTrackTag(unittest.TestCase): + def setUp(self): + notify.Notify.clear() + tags.tag_map.clear() + self.cb_track = None + def test_track_init_basic(self): p = [ test_tracks, "01 - Test Track.ogg" ] t = tags.Track(os.path.join(*p)) @@ -50,16 +56,22 @@ class TestTrackTag(unittest.TestCase): self.assertEqual(tags.Track(join(test_tracks, "09 - Test {Disc 02}.ogg")).discnumber, 2) self.assertEqual(tags.Track(join(test_tracks, "10 - Test {Disc 20}.ogg")).discnumber, 20) + def on_new_track(self, track): + self.cb_track = track + def test_track_add(self): - tags.tag_map.clear() + notify.Notify.notify_me("new-track", self.on_new_track) t = tags.Track.add(os.path.join(test_tracks, "01 - Test Track.ogg")) self.assertIsNotNone(t) self.assertIn(t, tags.tag_map.values()) self.assertIn(t.album, tags.tag_map.values()) + self.assertEqual(t, self.cb_track) + self.cb_track = None for i in range(10): u = tags.Track.add(os.path.join(test_tracks, "01 - Test Track.ogg")) self.assertIsNone(u) + self.assertIsNone(self.cb_track) self.assertEqual(len(tags.tag_map), 2) def test_track_getitem(self):