import os from playlist import Playlist from abcontroller import ABController from session_manager import SessionManager from notifier import Notifier from player_vlc import Player class SoloTool: def __init__(self, playerOverride=None): self._player = Player() if playerOverride is None else playerOverride self._playlist = Playlist(self._playlistCallback) self._abController = ABController(enabled=False, callback=self._abControllerCallback) self._sessionManager = SessionManager(self._playlist, self._abController) self._notifier = Notifier(self._player) def _playlistCallback(self, path): self._player.setCurrentSong(path) self._abController.setCurrentSong(path) def _abControllerCallback(self, position): self._player.setPlaybackPosition(position) def tick(self): position = self._player.getPlaybackPosition() self._abController.positionChanged(position) def addSong(self, path): if os.path.isfile(path): self._sessionManager.addSong(path) def setSong(self, index): previous = self._playlist.getCurrentSongIndex() self._playlist.setCurrentSong(index) new = self._playlist.getCurrentSongIndex() if previous != new: self._notifier.notify(Notifier.CURRENT_SONG_EVENT, new) def nextSong(self): previous = self._playlist.getCurrentSongIndex() self._playlist.nextSong() new = self._playlist.getCurrentSongIndex() if previous != new: self._notifier.notify(Notifier.CURRENT_SONG_EVENT, new) def previousSong(self): previous = self._playlist.getCurrentSongIndex() self._playlist.previousSong() new = self._playlist.getCurrentSongIndex() if previous != new: self._notifier.notify(Notifier.CURRENT_SONG_EVENT, new) def getSongs(self): return self._playlist.getSongs() def storeAbLimits(self, aLimit, bLimit): self._abController.storeLimits(aLimit, bLimit) def loadAbLimits(self, index): previous = self._abController.getLoadedIndex() self._abController.loadLimits(index) new = self._abController.getLoadedIndex() if previous != new: self._notifier.notify(Notifier.CURRENT_AB_EVENT, new) def setAbLimits(self, aLimit, bLimit): self._abController.setLimits(aLimit, bLimit) def getStoredAbLimits(self): currentSong = self._playlist.getCurrentSong() if currentSong is not None: return self._abController.getStoredLimits(currentSong) else: return list() def setAbLimitEnable(self, enable): previous = self._abController.isEnabled() self._abController.setEnable(enable) new = self._abController.isEnabled() if previous != new: self._notifier.notify(Notifier.AB_LIMIT_ENABLED_EVENT, new) def isAbLimitEnabled(self): return self._abController.isEnabled() def nextStoredAbLimits(self): previous = self._abController.getLoadedIndex() self._abController.nextStoredAbLimits() new = self._abController.getLoadedIndex() if previous != new: self._notifier.notify(Notifier.CURRENT_AB_EVENT, new) def previousStoredAbLimits(self): previous = self._abController.getLoadedIndex() self._abController.previousStoredAbLimits() new = self._abController.getLoadedIndex() if previous != new: self._notifier.notify(Notifier.CURRENT_AB_EVENT, new) def jumpToA(self): a = self._abController.getCurrentLimits()[0] # XXX assumes that player.setPlaybackPosition is thread-safe! self._player.setPlaybackPosition(a) def loadSession(self, path): with open(path, "r") as f: self._sessionManager.loadSession(f) def saveSession(self, path): with open(path, "w") as f: self._sessionManager.saveSession(f) def play(self): self._player.play() def pause(self): self._player.pause() def stop(self): self._player.stop() def isPlaying(self): return self._player.isPlaying() def setPlaybackRate(self, rate): previous = self._player.getPlaybackRate() self._player.setPlaybackRate(rate) new = self._player.getPlaybackRate() if previous != new: self._notifier.notify(Notifier.PLAYBACK_RATE_EVENT, new) def getPlaybackRate(self): return self._player.getPlaybackRate() def setPlaybackPosition(self, position): self._player.setPlaybackPosition(position) def getPlaybackPosition(self): return self._player.getPlaybackPosition() def setPlaybackVolume(self, volume): self._player.setPlaybackVolume(volume) def getPlaybackVolume(self): return self._player.getPlaybackVolume() def registerPlayingStateCallback(self, callback): self._notifier.registerCallback(Notifier.PLAYING_STATE_EVENT, callback) def registerPlaybackVolumeCallback(self, callback): self._notifier.registerCallback(Notifier.PLAYBACK_VOLUME_EVENT, callback) def registerPlaybackRateCallback(self, callback): self._notifier.registerCallback(Notifier.PLAYBACK_RATE_EVENT, callback) def registerCurrentSongCallback(self, callback): self._notifier.registerCallback(Notifier.CURRENT_SONG_EVENT, callback) def registerCurrentAbLimitsCallback(self, callback): self._notifier.registerCallback(Notifier.CURRENT_AB_EVENT, callback) def registerAbLimitEnabledCallback(self, callback): self._notifier.registerCallback(Notifier.AB_LIMIT_ENABLED_EVENT, callback)