audio: Give the Player a set_playlist() function
With a callback to notify when the current playlist changes. Additionally, I make sure to reset playlist.current if the playlist has previously finished playing. Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
parent
574d03bad6
commit
45b7f9595c
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue