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) self.on_track_changed(player, None, player.track)
def __set_from_cover_jpg__(self, track): def __set_from_cover_jpg__(self, track):
cover = track.filepath().parent / "cover.jpg" cover = track.path.parent / "cover.jpg"
if cover.exists(): if cover.exists():
self.picture.set_filename(str(cover)) self.picture.set_filename(str(cover))
return True return True

View File

@ -22,7 +22,7 @@ class TrackArtist(Gtk.Label):
self.add_css_class("subtitle") self.add_css_class("subtitle")
def on_track_changed(self, player, old, new): 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>") self.set_markup(f"<big>{GLib.markup_escape_text(text)}</big>")

View File

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

View File

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

View File

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

View File

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