From e0763ec72763d31ea53b2179d3e85a8dc76a4701 Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Thu, 7 Mar 2019 17:00:58 -0500 Subject: [PATCH] curds: Add basic playlist class The intention is that different playlist types will create a subclass of this class to do whatever work they need. Signed-off-by: Anna Schumaker --- curds/playlist/__init__.py | 1 + curds/playlist/playlist.py | 20 ++++++++++++ curds/playlist/test_playlist.py | 57 +++++++++++++++++++++++++++++++++ test_emmental.py | 2 ++ 4 files changed, 80 insertions(+) create mode 100644 curds/playlist/__init__.py create mode 100644 curds/playlist/playlist.py create mode 100644 curds/playlist/test_playlist.py diff --git a/curds/playlist/__init__.py b/curds/playlist/__init__.py new file mode 100644 index 0000000..f11a543 --- /dev/null +++ b/curds/playlist/__init__.py @@ -0,0 +1 @@ +# Copyright 2019 (c) Anna Schumaker. diff --git a/curds/playlist/playlist.py b/curds/playlist/playlist.py new file mode 100644 index 0000000..bf61487 --- /dev/null +++ b/curds/playlist/playlist.py @@ -0,0 +1,20 @@ +# Copyright 2019 (c) Anna Schumaker. + +class Playlist(list): + def __init__(self, name): + self.name = name + + def add(self, track): + if track is not None: + self.append(track) + + def runtime(self): + m, s = divmod(sum([ track.length for track in self ]), 60) + h, m = divmod(m, 60) + d, h = divmod(h, 24) + res = [ ] + if d > 0: res.append(f"{int(d)} day{'s' if d != 1 else ''}") + if h > 0: res.append(f"{int(h)} hour{'s' if h != 1 else ''}") + if m > 0: res.append(f"{int(m)} minute{'s' if m != 1 else ''}") + if s > 0: res.append(f"{int(s)} second{'s' if s != 1 else ''}") + return ", ".join(res) diff --git a/curds/playlist/test_playlist.py b/curds/playlist/test_playlist.py new file mode 100644 index 0000000..62f9d8d --- /dev/null +++ b/curds/playlist/test_playlist.py @@ -0,0 +1,57 @@ +# Copyright 2019 (c) Anna Schumaker. +from . import playlist +from .. import tags +import os +import unittest + +test_library = os.path.abspath("./trier/Test Library") + +class TestPlaylist(unittest.TestCase): + def setUp(self): + tags.tag_map.clear() + + def test_playlist_init(self): + plist = playlist.Playlist("Test Playlist") + self.assertIsInstance(plist, list) + self.assertEqual(plist.name, "Test Playlist") + self.assertEqual(len(plist), 0) + self.assertEqual(plist.runtime(), "") + + def test_playlist_add(self): + path = os.path.join(test_library, "Test Artist 01", "Test Album 1") + plist = playlist.Playlist("Test Playlist") + + plist.add(tags.Track.add(os.path.join(path, "01 - Test Track 01.ogg"))) + self.assertEqual(len(plist), 1) + self.assertEqual(plist.runtime(), "1 second") + + plist.add(tags.Track.add(os.path.join(path, "02 - Test Track 02.ogg"))) + self.assertEqual(len(plist), 2) + self.assertEqual(plist.runtime(), "3 seconds") + + plist.add(None) + self.assertEqual(len(plist), 2) + self.assertEqual(plist.runtime(), "3 seconds") + self.assertNotIn(None, plist) + + def test_playlist_runtime(self): + path = os.path.join(test_library, "Test Artist 01", "Test Album 1") + track = tags.Track.add(os.path.join(path, "01 - Test Track 01.ogg")) + plist = playlist.Playlist("Test Playlist") + + plist.add(track) + self.assertEqual(plist.runtime(), "1 second") + track.length = 2 + self.assertEqual(plist.runtime(), "2 seconds") + track.length = 60 + self.assertEqual(plist.runtime(), "1 minute") + track.length = 120 + self.assertEqual(plist.runtime(), "2 minutes") + track.length = 3600 + self.assertEqual(plist.runtime(), "1 hour") + track.length = 7200 + self.assertEqual(plist.runtime(), "2 hours") + track.length = 86400 + self.assertEqual(plist.runtime(), "1 day") + track.length = 172800 + self.assertEqual(plist.runtime(), "2 days") diff --git a/test_emmental.py b/test_emmental.py index f15c526..bd272e0 100644 --- a/test_emmental.py +++ b/test_emmental.py @@ -8,3 +8,5 @@ class TestEmmental(unittest.TestCase): self.assertIsNotNone(curds.data) self.assertIsNotNone(curds.tags) self.assertIsNotNone(curds.threadqueue) + self.assertIsNotNone(curds.playlist) + self.assertIsNotNone(curds.playlist.playlist)