From 298b58a54e3f78412294690aae1969ae271c0ddf Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Sun, 16 Apr 2023 15:54:30 -0400 Subject: [PATCH] playlist: Add a Playlist model This model builds on the TrackidModel to make it more Playlist and Track focused instead of trackid centric. Signed-off-by: Anna Schumaker --- emmental/playlist/playlist.py | 44 +++++++++++++++++++ tests/playlist/test_playlist.py | 78 +++++++++++++++++++++++++++++++++ 2 files changed, 122 insertions(+) create mode 100644 emmental/playlist/playlist.py create mode 100644 tests/playlist/test_playlist.py diff --git a/emmental/playlist/playlist.py b/emmental/playlist/playlist.py new file mode 100644 index 0000000..80d85f5 --- /dev/null +++ b/emmental/playlist/playlist.py @@ -0,0 +1,44 @@ +# Copyright 2023 (c) Anna Schumaker. +"""A TrackidModel with extra features.""" +from gi.repository import GObject +from . import model +from .. import db + + +class Playlist(model.TrackidModel): + """A TrackidModel with extra Playlist features.""" + + def __init__(self, sql: db.Connection, + playlist: db.playlist.Playlist = None): + """Initialize the Playlist instance.""" + super().__init__(sql=sql) + self.__playlist = None + + if playlist is not None: + self.playlist = playlist + + def add_track(self, track: db.tracks.Track) -> None: + """Add a track to the playlist.""" + if self.__playlist is not None: + self.__playlist.add_track(track) + + def index(self, track: db.tracks.Track) -> int | None: + """Find the index of a track in the list.""" + if track is not None: + return super().index(track.trackid) + + def remove_track(self, track: db.tracks.Track) -> None: + """Remove a track from the playlist.""" + if self.__playlist is not None: + self.__playlist.remove_track(track) + + @GObject.Property(type=db.playlist.Playlist) + def playlist(self) -> db.playlist.Playlist | None: + """Get the current db playlist.""" + return self.__playlist + + @playlist.setter + def playlist(self, new: db.playlist.Playlist | None) -> None: + """Set a new db playlist to the playlist.""" + self.__playlist = new + self.trackid_set = None if new is None else new.tracks diff --git a/tests/playlist/test_playlist.py b/tests/playlist/test_playlist.py new file mode 100644 index 0000000..573ca9e --- /dev/null +++ b/tests/playlist/test_playlist.py @@ -0,0 +1,78 @@ +# Copyright 2023 (c) Anna Schumaker. +"""Tests our PlaylistModel.""" +import pathlib +import tests.util +import emmental.playlist.playlist + + +class TestPlaylist(tests.util.TestCase): + """Tests the Playlist Gio.ListModel.""" + + def setUp(self): + """Set up common variables.""" + super().setUp() + self.db_plist = self.sql.playlists.create("Test Playlist") + self.playlist = emmental.playlist.playlist.Playlist(self.sql) + + self.library = self.sql.libraries.create(pathlib.Path("/a/b")) + self.album = self.sql.albums.create("Test Album", "Artist", "2023") + self.medium = self.sql.media.create(self.album, "", number=1) + self.year = self.sql.years.create(2023) + + self.track1 = self.sql.tracks.create(self.library, + pathlib.Path("/a/b/1.ogg"), + self.medium, self.year, number=1) + self.track2 = self.sql.tracks.create(self.library, + pathlib.Path("/a/b/2.ogg"), + self.medium, self.year, number=2) + + def test_init(self): + """Test that the Playlist was set up correctly.""" + self.assertIsInstance(self.playlist, + emmental.playlist.model.TrackidModel) + self.assertEqual(self.playlist.sql, self.sql) + self.assertIsNone(self.playlist._Playlist__playlist) + + plist2 = emmental.playlist.playlist.Playlist(self.sql, self.db_plist) + self.assertEqual(plist2.playlist, self.db_plist) + + def test_add_track(self): + """Test the playlist add_track() function.""" + self.playlist.add_track(self.track1) + + self.playlist.playlist = self.db_plist + self.playlist.add_track(self.track1) + self.assertListEqual(self.playlist.trackids, [self.track1.trackid]) + + def test_index(self): + """Test the playlist index() function.""" + self.assertIsNone(self.playlist.index(self.track1)) + + self.playlist.playlist = self.db_plist + self.playlist.add_track(self.track1) + + self.assertEqual(self.playlist.index(self.track1), 0) + self.assertIsNone(self.playlist.index(self.track2)) + self.assertIsNone(self.playlist.index(None)) + + def test_remove_track(self): + """Test the playlist remove_track() function.""" + self.playlist.remove_track(self.track1) + + self.db_plist.add_track(self.track1) + self.playlist.playlist = self.db_plist + self.playlist.remove_track(self.track1) + self.assertListEqual(self.playlist.trackids, []) + + def test_playlist(self): + """Test the playlist property.""" + self.assertIsNone(self.playlist.playlist) + + self.playlist.playlist = self.db_plist + self.assertEqual(self.playlist._Playlist__playlist, self.db_plist) + self.assertEqual(self.playlist.playlist, self.db_plist) + self.assertEqual(self.playlist.trackid_set, self.db_plist.tracks) + + self.playlist.playlist = None + self.assertIsNone(self.playlist.playlist) + self.assertIsNone(self.playlist.trackid_set)