audio: Pick the next track from the current playlist

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
Anna Schumaker 2021-11-20 15:46:47 -05:00
parent 45b7f9595c
commit 27ad8d72b4
6 changed files with 51 additions and 66 deletions

View File

@ -22,7 +22,7 @@ class Artwork(Gtk.AspectFrame):
self.on_track_changed(player, None, player.track)
def __set_from_cover_jpg__(self, track):
cover = track.filepath().parent / "cover.jpg"
cover = track.path.parent / "cover.jpg"
if cover.exists():
self.picture.set_filename(str(cover))
return True

View File

@ -22,7 +22,7 @@ class TrackArtist(Gtk.Label):
self.add_css_class("subtitle")
def on_track_changed(self, player, old, new):
text = f"by {new.artist}" if new else "The Cheesy Music Player"
text = f"by {new.artist.name}" if new else "The Cheesy Music Player"
self.set_markup(f"<big>{GLib.markup_escape_text(text)}</big>")

View File

@ -1,53 +1,52 @@
# Copyright 2021 (c) Anna Schumaker.
import db
import lib
import tagdb
from gi.repository import GObject
from . import bass
from . import scale
from . import selector
class Player(bass.BassPlayer):
def __init__(self):
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")
self.change_track(db.track.Table.get(lib.settings.get_int("audio.trackid")))
def change_track(self, track, reset=False):
def change_track(self, track, reset=False, add_prev=True):
if self.track and self.play_percent > (2 / 3):
self.track.played()
if reset:
self.uri = None
self.emit("track-changed", self.track, track)
if track and add_prev:
db.user.Table.find("Previous").add_track(track)
def do_about_to_finish(self):
if self.Autopause.get_value() != 0:
self.Autopause.decrement()
self.change_track(self.Selector.next())
self.change_track(self.playlist.next_track())
def do_eos(self):
self.Autopause.decrement()
self.change_track(self.Selector.next())
self.change_track(self.playlist.next_track())
self.playing = self.Autopause.keep_playing
def play(self): self.playing = True
def pause(self): self.playing = False
def playpause(self): self.playing = not self.playing
def play_track(self, track):
self.change_track(track, reset=True)
def play_track(self, track, add_prev=True):
self.change_track(track, reset=True, add_prev=add_prev)
self.play()
def next(self): self.play_track(self.Selector.next())
def previous(self): self.play_track(self.Selector.previous())
def next(self): self.play_track(self.playlist.next_track())
def previous(self):
previous = db.user.Table.find("Previous")
self.play_track(previous.previous_track(), add_prev=False)
def set_playlist(self, plist):
if plist is None:
@ -55,12 +54,12 @@ class Player(bass.BassPlayer):
if plist != self.playlist:
self.emit("playlist-changed", self.playlist, plist)
@GObject.Signal(arg_types=(tagdb.track.Track, tagdb.track.Track))
@GObject.Signal(arg_types=(db.track.Track, db.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()
lib.settings.set("audio.trackid", new.rowid)
self.uri = new.path.absolute().as_uri()
@GObject.Signal(arg_types=(db.playlist.Playlist, db.playlist.Playlist))
def playlist_changed(self, prev, new):

View File

@ -1,20 +1,20 @@
# Copyright 2021 (c) Anna Schumaker.
import audio
import db
import pathlib
import tagdb
import unittest
from gi.repository import Gtk
test_album = pathlib.Path("./data/Test Album/")
test_track = test_album / "01 - Test Track.ogg"
class TestAudio(unittest.TestCase):
def test_init(self):
self.assertIsInstance(audio.Player, audio.player.Player)
def test_play_track(self):
lib = tagdb.Library.add(test_album)
lib.scan().join()
track = [ t for t in lib.tracks if t.tracknumber == 1 ][0]
db.reset()
track = db.make_fake_track(1, 10, "Test Track", test_track, test_album)
self.assertTrue(audio.play_track(track))
self.assertTrue(audio.Player.playing)

View File

@ -1,14 +1,19 @@
# Copyright 2021 (c) Anna Schumaker.
import db
import unittest
from gi.repository import GObject
from gi.repository import Gtk
from . import nowplaying
class FakeArtist(GObject.GObject):
def __init__(self):
self.name = "Test Artist"
class FakeTrack(GObject.GObject):
def __init__(self):
GObject.GObject.__init__(self)
self.title = "Test Title"
self.artist = "Test Artist"
self.artist = FakeArtist()
class FakePlayer(GObject.GObject):
def __init__(self):

View File

@ -2,14 +2,13 @@
import db
import lib
import pathlib
import tagdb
import scanner
import unittest
from gi.repository import GLib
from gi.repository import Gst
from . import bass
from . import player
from . import scale
from . import selector
main_context = GLib.main_context_default()
test_album = pathlib.Path("./data/Test Album/")
@ -17,38 +16,18 @@ test_track = test_album / "01 - Test Track.ogg"
test_uri = test_track.absolute().as_uri()
class FakeSelector(selector.Selector):
def __init__(self, library):
selector.Selector.__init__(self)
t1 = [ t for t in library.tracks if t.tracknumber == 1 ][0]
t2 = [ t for t in library.tracks if t.tracknumber == 11 ][0]
self.tracks = [ t1, t2 ]
self.cur = -1
def next(self):
self.cur += 1
return self.tracks[self.cur]
def previous(self):
self.cur -= 1
return self.tracks[self.cur]
class TestPlayer(unittest.TestCase):
def setUpClass():
tagdb.reset()
lib = tagdb.Library.add(test_album)
lib.scan().join()
db.reset()
lib = db.library.Table.find(test_album)
scanner.Queue.push(scanner.task.DirectoryTask(lib, test_album))
while scanner.Queue.run() == GLib.SOURCE_CONTINUE: pass
def setUp(self):
self.changed = None
lib.settings.reset()
self.library = tagdb.Library.store[test_album]
self.track = [ t for t in self.library.tracks if t.tracknumber == 1 ][0]
def tearDownClass():
tagdb.reset()
self.library = db.library.Table.lookup(test_album)
self.track = db.track.Table.lookup(test_track)
def on_track_changed(self, player, prev, new):
self.changed = (prev, new)
@ -56,12 +35,11 @@ class TestPlayer(unittest.TestCase):
def on_playlist_changed(self, player, prev, new):
self.changed = (prev, new)
def test_player_init(self):
def test_init(self):
play = player.Player()
self.assertIsInstance(play, bass.BassPlayer)
self.assertIsInstance(play.bus, Gst.Bus)
self.assertIsInstance(play.Autopause, scale.AutoPauseScale)
self.assertIsInstance(play.Selector, selector.Selector)
self.assertIsNone(play.track)
self.assertEqual(play.playlist, db.user.Table.find("Collection"))
@ -106,13 +84,13 @@ class TestPlayer(unittest.TestCase):
play.change_track(self.track, reset=True)
self.assertEqual(play.track, self.track)
self.assertEqual(lib.settings.get_int("audio.trackid"), self.track.trackid)
self.assertEqual(lib.settings.get_int("audio.trackid"), self.track.rowid)
self.assertEqual(self.changed, (None, self.track) )
tagdb.tags.User["Previous"].tracks.clear()
db.sql.execute("DELETE FROM temp_playlist_map")
play2 = player.Player()
self.assertEqual(play2.track, self.track)
self.assertIn(self.track, tagdb.tags.User["Previous"].tracks)
self.assertEqual(db.user.Table.find("Previous").get_track(0), self.track)
def test_play_track(self):
play = player.Player()
@ -121,7 +99,7 @@ class TestPlayer(unittest.TestCase):
self.assertTrue(play.playing)
play.pause()
def test_player_play_pause(self):
def test_play_pause(self):
play = player.Player()
play.play_track(self.track)
@ -142,20 +120,23 @@ class TestPlayer(unittest.TestCase):
play.pause()
self.assertFalse(play.playing)
def test_player_next_previous(self):
select = FakeSelector(self.library)
def test_next_previous(self):
collection = db.user.Table.find("Collection")
play = player.Player()
play.set_playlist(collection)
play.connect("track-changed", self.on_track_changed)
play.Selector = select
track0 = collection.get_track(0)
track1 = collection.get_track(1)
play.next()
self.assertEqual(play.track.trackid, 1)
self.assertEqual(self.changed, (None, tagdb.Tracks[1]) )
self.assertEqual(play.track, track0)
self.assertEqual(self.changed, (None, track0))
play.next()
self.assertEqual(play.track.trackid, 11)
self.assertEqual(self.changed, (tagdb.Tracks[1], tagdb.Tracks[11]) )
self.assertEqual(play.track, track1)
self.assertEqual(self.changed, (track0, track1))
play.previous()
self.assertEqual(play.track.trackid, 1)
self.assertEqual(self.changed, (tagdb.Tracks[11], tagdb.Tracks[1]) )
self.assertEqual(play.track, track0)
self.assertEqual(self.changed, (track1, track0))