From 55486c20c3dbf7360c6d9d0554f12342f5d1e8f1 Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Fri, 28 Apr 2023 10:54:49 -0400 Subject: [PATCH] playlist: Give Playlists a track-requested signal We need to do some bookkeeping inside the Playlist before notifying the Factory that a track has been requested. Signed-off-by: Anna Schumaker --- emmental/playlist/playlist.py | 12 ++++++++++++ tests/playlist/test_playlist.py | 26 ++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/emmental/playlist/playlist.py b/emmental/playlist/playlist.py index fe81962..89ccbaa 100644 --- a/emmental/playlist/playlist.py +++ b/emmental/playlist/playlist.py @@ -139,6 +139,13 @@ class Playlist(model.TrackidModel): if self.__playlist is not None: self.__playlist.remove_track(track) + def request_track(self, track: db.tracks.Track) -> None: + """Request a track for playback directly.""" + if self.index(track) is not None: + if not self.can_go_next: + self.__picked.trackids = set() + self.emit("track-requested", track) + @GObject.Property(type=db.tracks.Track) def current_track(self) -> db.tracks.Track | None: """Get the current Track of the Playlist.""" @@ -217,3 +224,8 @@ class Playlist(model.TrackidModel): def sort_order(self, new_order: str) -> None: if self.__playlist is not None: self.__playlist.sort_order = new_order + + @GObject.Signal(arg_types=(db.tracks.Track,)) + def track_requested(self, track: db.tracks.Track) -> None: + """Signal that a track has been requested for playback.""" + self.current_track = track diff --git a/tests/playlist/test_playlist.py b/tests/playlist/test_playlist.py index 7c2a792..cee9e42 100644 --- a/tests/playlist/test_playlist.py +++ b/tests/playlist/test_playlist.py @@ -210,6 +210,32 @@ class TestPlaylist(tests.util.TestCase): self.assertEqual(self.db_plist.current_trackid, self.track1.trackid) notify.assert_called() + def test_request_track(self): + """Test the Playlist request_track() function.""" + requested = unittest.mock.Mock() + self.playlist.connect("track-requested", requested) + + self.playlist.request_track(self.track1) + requested.assert_not_called() + + self.playlist.playlist = self.db_plist + self.playlist.request_track(self.track1) + requested.assert_not_called() + + self.db_plist.add_track(self.track1) + self.playlist.request_track(self.track1) + requested.assert_called_with(self.playlist, self.track1) + self.assertEqual(self.playlist.current_track, self.track1) + + self.db_plist.add_track(self.track2) + self.playlist.request_track(self.track2) + self.assertFalse(self.playlist.can_go_next) + + self.playlist.request_track(self.track1) + self.assertSetEqual(self.playlist._Playlist__picked.trackids, + {self.track1.trackid}) + self.assertTrue(self.playlist.can_go_next) + def test_current_track(self): """Test the Playlist current-track property.""" self.assertIsNone(self.playlist.current_track)