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:
Anna Schumaker 2021-11-17 14:46:09 -05:00
parent 574d03bad6
commit 45b7f9595c
2 changed files with 55 additions and 0 deletions

View File

@ -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)

View File

@ -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)