diff --git a/audio/player.py b/audio/player.py index e3979a8..57e3c14 100644 --- a/audio/player.py +++ b/audio/player.py @@ -1,4 +1,5 @@ # Copyright 2021 (c) Anna Schumaker. +import db import lib import tagdb from gi.repository import GObject @@ -12,8 +13,10 @@ class Player(bass.BassPlayer): bass.BassPlayer.__init__(self) self.Autopause = scale.AutoPauseScale() self.Selector = selector.TagdbSelector() + self.playlist = None self.track = None + self.set_playlist(db.find_playlist(lib.settings.get_int("audio.plstateid"))) self.change_track(tagdb.Tracks[lib.settings.get_int("audio.trackid")]) if self.track: self.track.add_to_playlist("Previous") @@ -46,9 +49,23 @@ class Player(bass.BassPlayer): def next(self): self.play_track(self.Selector.next()) def previous(self): self.play_track(self.Selector.previous()) + def set_playlist(self, plist): + if plist is None: + plist = db.user.Table.find("Collection") + if plist != self.playlist: + self.emit("playlist-changed", self.playlist, plist) + @GObject.Signal(arg_types=(tagdb.track.Track, tagdb.track.Track)) def track_changed(self, prev, new): self.track = new if self.track: lib.settings.set("audio.trackid", new.trackid) self.uri = new.filepath().absolute().as_uri() + + @GObject.Signal(arg_types=(db.playlist.Playlist, db.playlist.Playlist)) + def playlist_changed(self, prev, new): + self.playlist = new + if self.playlist: + if new.current >= new.get_n_tracks() - 1: + new.current = -1 + lib.settings.set("audio.plstateid", new.plstateid) diff --git a/audio/test_player.py b/audio/test_player.py index 9d3c160..4bb1d01 100644 --- a/audio/test_player.py +++ b/audio/test_player.py @@ -1,4 +1,5 @@ # Copyright 2021 (c) Anna Schumaker. +import db import lib import pathlib import tagdb @@ -52,6 +53,9 @@ class TestPlayer(unittest.TestCase): def on_track_changed(self, player, prev, new): self.changed = (prev, new) + def on_playlist_changed(self, player, prev, new): + self.changed = (prev, new) + def test_player_init(self): play = player.Player() self.assertIsInstance(play, bass.BassPlayer) @@ -60,6 +64,40 @@ class TestPlayer(unittest.TestCase): self.assertIsInstance(play.Selector, selector.Selector) self.assertIsNone(play.track) + self.assertEqual(play.playlist, db.user.Table.find("Collection")) + self.assertEqual(lib.settings.get_int("audio.plstateid"), + db.user.Table.find("Collection").plstateid) + + def test_set_playlist(self): + collection = db.user.Table.find("Collection") + plist = db.user.Table.find("Test Playlist") + play = player.Player() + play.connect("playlist-changed", self.on_playlist_changed) + + play.set_playlist(plist) + self.assertEqual(play.playlist, plist) + self.assertEqual(self.changed, (collection, plist)) + self.assertEqual(lib.settings.get_int("audio.plstateid"), plist.plstateid) + + self.changed = None + play.set_playlist(plist) + self.assertIsNone(self.changed) + + play2 = player.Player() + self.assertEqual(play2.playlist, plist) + + play2.set_playlist(None) + self.assertEqual(play2.playlist, collection) + + def test_set_playlist_reset(self): + plist = db.user.Table.find("Test Playlist") + plist.add_track(db.make_fake_track(1, 1, "Test 1", "/a/b/c/1.ogg")) + plist.current = 0 + + play = player.Player() + play.set_playlist(plist) + self.assertEqual(plist.current, -1) + def test_change_track(self): play = player.Player() play.connect("track-changed", self.on_track_changed)