emmental/audio/player.py

76 lines
2.3 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 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):
if self.play_percent > (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 previous(self, *args):
self.uri = None
self.load_track(tagdb.Stack.previous())
self.playing = True
@GObject.Signal(arg_types=(tagdb.track.Track, tagdb.track.Track))
def track_changed(self, prev, new):
pass