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 <Anna@NoWheyCreamery.com>
This commit is contained in:
Anna Schumaker 2019-03-11 17:02:59 -04:00
parent 752ebece3d
commit 8a4d3219d2
4 changed files with 37 additions and 8 deletions

View File

@ -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)

View File

@ -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():

View File

@ -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)

View File

@ -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):