db: Give playlists a next_track() function

For picking the next track (with or without random enabled)

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
Anna Schumaker 2021-11-13 16:11:39 -05:00
parent 8a4590f0ed
commit 7a46ffdf47
2 changed files with 48 additions and 5 deletions

View File

@ -1,4 +1,5 @@
# Copyright 2021 (c) Anna Schumaker.
import random
from gi.repository import GObject
from . import sql
from . import state
@ -65,6 +66,14 @@ class Playlist(GObject.GObject):
def remove_track(self, track):
self.emit("track-removed", track)
def next_track(self):
n = self.get_n_tracks()
if self.random and n > 0:
self.current += random.randint(1, int((3*n)/4))
else:
self.current += 1
return self.get_current_track()
def refresh(self):
self.emit("refreshed")
@ -82,11 +91,12 @@ class Playlist(GObject.GObject):
@current.setter
def current(self, newval):
if newval >= self.get_n_tracks():
if self.get_n_tracks() == 0: newval = -1
elif self.random: newval = newval % self.get_n_tracks()
n_tracks = self.get_n_tracks()
if newval >= n_tracks:
if n_tracks == 0: newval = -1
elif self.random: newval = newval % n_tracks
elif self.loop: newval = 0
else: newval = -1
else: newval = n_tracks
self._plstate.set_property("current", newval)
@GObject.Property(type=bool,default=False)

View File

@ -1,5 +1,6 @@
# Copyright 2021 (c) Anna Schumaker.
import db
import random
import unittest
from gi.repository import GObject
from . import playlist
@ -58,7 +59,11 @@ class TestPlaylist(unittest.TestCase):
self.assertEqual(plist.get_current_track(), plist.get_track(1))
plist.set_property("current", 2)
self.assertEqual(plist.get_property("current"), -1)
self.assertEqual(plist.get_property("current"), 2)
self.assertIsNone(plist.get_current_track())
plist.set_property("current", 3)
self.assertEqual(plist.get_property("current"), 2)
self.assertIsNone(plist.get_current_track())
def test_loop(self):
@ -127,6 +132,34 @@ class TestPlaylist(unittest.TestCase):
plist.set_property("sort", [ "tracks.number ASC" ])
self.assertEqual(plist.get_property("current"), 1)
def test_next_track(self):
plist = db.user.Table.find("Test Playlist")
self.assertIsNone(plist.next_track())
self.assertEqual(plist.get_property("current"), -1)
plist.add_track(db.make_fake_track(1, 1, "Track 1", "/a/b/c/1.ogg"))
plist.add_track(db.make_fake_track(2, 2, "Track 2", "/a/b/c/2.ogg"))
self.assertEqual(plist.next_track(), plist.get_track(0))
self.assertEqual(plist.next_track(), plist.get_track(1))
self.assertIsNone(plist.next_track())
self.assertIsNone(plist.next_track())
def test_random_next_track(self):
plist = db.user.Table.find("Test Playlist")
plist.random = True
self.assertIsNone(plist.next_track())
self.assertEqual(plist.get_property("current"), -1)
plist.add_track(db.make_fake_track(1, 1, "Track 1", "/a/b/c/1.ogg"))
plist.add_track(db.make_fake_track(2, 2, "Track 2", "/a/b/c/2.ogg"))
plist.add_track(db.make_fake_track(3, 3, "Track 3", "/a/b/c/3.ogg"))
random.seed(20210318)
self.assertEqual(plist.next_track(), plist.get_track(1))
self.assertEqual(plist.next_track(), plist.get_track(2))
self.assertEqual(plist.next_track(), plist.get_track(0))
self.assertEqual(plist.next_track(), plist.get_track(2))
class TestMappedPlaylist(unittest.TestCase):
def test_init(self):