trackdb: Store the LibraryPath pointer in the track

This makes it so tracks can get to their libraries directly

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
Anna Schumaker 2021-06-18 10:42:11 -04:00
parent 8fcd84e7d3
commit f4a1ef67e8
4 changed files with 32 additions and 21 deletions

View File

@ -38,7 +38,7 @@ class LibraryPath:
with IDLock as A, self.lock as B:
try:
trak = track.Track(NextID, path)
trak = track.Track(NextID, path, self)
self.tracks[NextID] = trak
NextID += 1
except Exception as e:
@ -48,11 +48,11 @@ class LibraryPath:
def __scan_remove__(self):
with self.lock:
removed = [ (id, track) for (id, track) in self.tracks.items() if not track.filepath.exists() ]
removed = [ (id, track) for (id, track) in self.tracks.items() if not track.filepath().exists() ]
for (id, track) in removed:
del self.tracks[id]
TrackRemoved.publish(track, self)
return set([ track.filepath for (id, track) in self.tracks.items() ])
return set([ track.filepath() for (id, track) in self.tracks.items() ])
def __do_scan__(self):
track_set = self.__scan_remove__()

View File

@ -81,8 +81,8 @@ class TestLibraryPath(unittest.TestCase):
self.assertEqual(library.NextID, 16)
lib.tracks[library.NextID] = track.Track(library.NextID,
pathlib.Path(test_tracks) / "01 - Test Track.ogg")
lib.tracks[library.NextID].filepath = pathlib.Path("No Such File")
pathlib.Path(test_tracks) / "01 - Test Track.ogg", lib)
lib.tracks[library.NextID].path = pathlib.Path("No Such File")
lib.scan().join()
self.assertEqual(len(lib.tracks), 12)
self.assertEqual(self.count_added, 16)

View File

@ -1,5 +1,6 @@
# Copyright 2020 (c) Anna Schumaker.
from lib import publisher
from . import library
from . import track
import datetime
import pathlib
@ -10,6 +11,7 @@ test_tracks = pathlib.Path("./trier/Test Album")
class TestTrack(unittest.TestCase):
def setUp(self):
self.count_updated = 0
self.lib = library.LibraryPath(test_tracks)
track.TrackUpdated.register(self.on_track_updated)
def tearDown(self):
@ -19,41 +21,46 @@ class TestTrack(unittest.TestCase):
self.count_updated += 1
def test_track_init(self):
trak = track.Track(1, test_tracks / "01 - Test Track.ogg")
trak = track.Track(1, test_tracks / "01 - Test Track.ogg", self.lib)
self.assertEqual(trak.trackid, 1)
self.assertEqual(trak.filepath, test_tracks / "01 - Test Track.ogg")
self.assertEqual(trak.filepath(), test_tracks / "01 - Test Track.ogg")
self.assertIsInstance(track.TrackUpdated, publisher.Publisher)
def test_track_album(self):
trak = track.Track(1, test_tracks / "01 - Test Track.ogg")
trak = track.Track(1, test_tracks / "01 - Test Track.ogg", self.lib)
self.assertEqual(trak.album, "Test Album")
self.assertEqual(trak["album"], "Test Album")
def test_track_artist(self):
trak = track.Track(1, test_tracks / "01 - Test Track.ogg")
trak = track.Track(1, test_tracks / "01 - Test Track.ogg", self.lib)
self.assertEqual(trak.artist, "Test Artist")
self.assertEqual(trak["artist"], "Test Artist")
trak2 = track.Track(2, test_tracks / "02 - Test {Disc 2}.ogg")
trak2 = track.Track(2, test_tracks / "02 - Test {Disc 2}.ogg", self.lib)
self.assertEqual(trak2.artist, "Test Album Artist")
def test_track_decade(self):
trak = track.Track(1, test_tracks / "01 - Test Track.ogg")
trak = track.Track(1, test_tracks / "01 - Test Track.ogg", self.lib)
self.assertEqual(trak.decade(), 2010)
trak.year = 1974
self.assertEqual(trak.decade(), 1970)
def test_track_discnumber(self):
trak = track.Track(1, test_tracks / "01 - Test Track.ogg")
trak = track.Track(1, test_tracks / "01 - Test Track.ogg", self.lib)
self.assertEqual(trak.discnumber, 1)
self.assertEqual(trak["discnumber"], "01")
def test_track_filepath(self):
trak = track.Track(1, test_tracks / "01 - Test Track.ogg", self.lib)
self.assertEqual(trak.path, pathlib.Path("01 - Test Track.ogg"))
self.assertEqual(trak.filepath(), test_tracks / "01 - Test Track.ogg")
def test_track_genres(self):
trak = track.Track(1, test_tracks / "02 - Test {Disc 2}.ogg")
trak = track.Track(1, test_tracks / "02 - Test {Disc 2}.ogg", self.lib)
self.assertEqual(trak.genre, [ "Test", "Genre", "List" ])
self.assertEqual(trak["genre"], "Test, Genre, List")
def test_track_length(self):
trak = track.Track(1, test_tracks / "01 - Test Track.ogg")
trak = track.Track(1, test_tracks / "01 - Test Track.ogg", self.lib)
self.assertEqual(trak.length, 10)
self.assertEqual(trak["length"], "0:10")
trak.length = 61
@ -62,7 +69,7 @@ class TestTrack(unittest.TestCase):
self.assertEqual(trak["length"], "0:03")
def test_track_played(self):
trak = track.Track(1, test_tracks / "01 - Test Track.ogg")
trak = track.Track(1, test_tracks / "01 - Test Track.ogg", self.lib)
trak.playcount = 0
trak.lastplayed = None
self.assertEqual(trak["playcount"], "0")
@ -79,22 +86,22 @@ class TestTrack(unittest.TestCase):
self.assertEqual(self.count_updated, 2)
def test_track_title(self):
trak = track.Track(1, test_tracks / "01 - Test Track.ogg")
trak = track.Track(1, test_tracks / "01 - Test Track.ogg", self.lib)
self.assertEqual(trak.title, "Test Track")
self.assertEqual(trak["title"], "Test Track")
def test_track_tracknumber(self):
trak = track.Track(1, test_tracks / "01 - Test Track.ogg")
trak = track.Track(1, test_tracks / "01 - Test Track.ogg", self.lib)
self.assertEqual(trak.tracknumber, 1)
self.assertEqual(trak["tracknumber"], "01")
trak.tracknumber = 10
self.assertEqual(trak["tracknumber"], "10")
def test_track_year(self):
trak = track.Track(1, test_tracks / "01 - Test Track.ogg")
trak = track.Track(1, test_tracks / "01 - Test Track.ogg", self.lib)
self.assertEqual(trak.year, 2019)
self.assertEqual(trak["year"], "2019")
trak2 = track.Track(2, test_tracks / "02 - Test {Disc 2}.ogg")
trak2 = track.Track(2, test_tracks / "02 - Test {Disc 2}.ogg", self.lib)
self.assertEqual(trak2.year, 2019)
self.assertEqual(trak2["year"], "2019")

View File

@ -7,9 +7,10 @@ import re
TrackUpdated = publisher.Publisher()
class Track:
def __init__(self, trackid, filepath):
def __init__(self, trackid, filepath, library):
self.trackid = trackid
self.filepath = filepath
self.path = filepath.relative_to(library.path)
self.library = library
self.lastplayed = None
self.playcount = None
@ -43,6 +44,9 @@ class Track:
def decade(self):
return (self.year // 10) * 10
def filepath(self):
return self.library.path / self.path
def played(self):
self.playcount += 1
self.lastplayed = datetime.date.today()