Anna Schumaker
fa2cbcc261
I use the state change callbacks to send a position-changed signal on a regular interval when playback is going. Seeking is handled by setting the position property to a new value. Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
92 lines
2.7 KiB
Python
92 lines
2.7 KiB
Python
# Copyright 2021 (c) Anna Schumaker.
|
|
from . import artwork
|
|
from . import bass
|
|
from . import scale
|
|
from . import controls
|
|
from lib import publisher
|
|
from lib import settings
|
|
from gi.repository import GObject
|
|
from gi.repository import Gst, GLib
|
|
import tagdb
|
|
|
|
|
|
class Player(bass.BassPlayer):
|
|
def __init__(self):
|
|
bass.BassPlayer.__init__(self)
|
|
self.Autopause = scale.AutoPauseScale()
|
|
|
|
self.bus.connect("message::eos", self.next)
|
|
self.bus.connect("message::tag", self.on_tag)
|
|
|
|
self.Artwork = artwork.Artwork()
|
|
|
|
self.track = tagdb.Tracks[settings.get_int("audio.trackid")]
|
|
self.load_set_state(self.track, Gst.State.PAUSED)
|
|
if self.track:
|
|
self.track.add_to_playlist("Previous")
|
|
|
|
def get_state(self):
|
|
(ret, state, pending) = self.playbin.get_state(Gst.CLOCK_TIME_NONE)
|
|
if ret == Gst.StateChangeReturn.SUCCESS:
|
|
return state
|
|
return ret
|
|
|
|
def get_volume(self):
|
|
return self.playbin.get_property("volume")
|
|
|
|
def load_track(self, track):
|
|
prev = self.track
|
|
self.track = track
|
|
if track is not None:
|
|
settings.set("audio.trackid", track.trackid)
|
|
self.uri = track.filepath().absolute().as_uri()
|
|
self.emit("track-changed", prev, self.track)
|
|
|
|
def load_set_state(self, track, state):
|
|
self.uri = None
|
|
self.load_track(track)
|
|
if track is not None:
|
|
self.playbin.set_state(state)
|
|
|
|
def next(self, *args):
|
|
duration = self.duration
|
|
if duration > 0 and (self.runtime() / duration) > (2 / 3):
|
|
self.track.played()
|
|
|
|
(track, cont) = tagdb.Stack.next()
|
|
state = Gst.State.PLAYING if cont else Gst.State.PAUSED
|
|
self.load_set_state(track, state)
|
|
|
|
def on_tag(self, bus, message):
|
|
taglist = message.parse_tag()
|
|
(res, sample) = taglist.get_sample("image")
|
|
if res == True:
|
|
self.Artwork.set_from_sample(sample)
|
|
else:
|
|
self.Artwork.reset()
|
|
|
|
def play(self): self.playing = True
|
|
def pause(self): self.playing = False
|
|
def playpause(self, *args): self.playing = not self.playing
|
|
|
|
def play_track(self, track):
|
|
if track == self.track:
|
|
return False
|
|
self.load_set_state(track, Gst.State.PLAYING)
|
|
return True
|
|
|
|
def previous(self, *args):
|
|
self.play_track(tagdb.Stack.previous())
|
|
|
|
def runtime(self):
|
|
if self.playbin.clock == None:
|
|
return 0
|
|
return self.playbin.clock.get_time() - self.playbin.base_time
|
|
|
|
def set_volume(self, volume):
|
|
self.playbin.set_property("volume", volume)
|
|
|
|
@GObject.Signal(arg_types=(tagdb.track.Track, tagdb.track.Track))
|
|
def track_changed(self, prev, new):
|
|
pass
|