class TrackThreader(): def __init__(self): self.track = None self.onEndCustomCallback = None self.volume = volumizer.getJSON()['config']['milli'] def __play_track(self, track, callback = None): self.setVolume(volumizer.getJSON()['config']['milli']) if(callback == None): track.play() else: callback(track) self.__oversee_track(track) #This makes track to disapear after it's done playing def __oversee_track(self, track): while (track.isBusy() or track.isPaused()) and not track.shouldEnd(): continue if(self.onEndCustomCallback == None): if(self.track != None): print(self.track.getPath() + " finished playing.") self.setTrack(None) else: self.__play_track(track, self.onEndCustomCallback) def getThread(self, path): self.track = Track(path, self.volume) self.playingThread = threading.Thread(target = self.__play_track, args=(self.track, )) self.playingThread.daemon = True return {'thread' : self.playingThread, 'track' : self.track} def currentTrack(self): return self.track def setTrack(self, track): self.track = track def setVolume(self, volume): self.volume = volume if self.track != None: self.track.setVolume(volume) def registerOnEndCustomCallback(self, callback): self.onEndCustomCallback = callback
class Playlist: def __init__(self, tracks, volume = 1): self.position = -1 self.threadCount = len(tracks) self.volume = volume self.currentTrack = None self.tracks = tracks def loadTracks(self, tracks): self.tracks = tracks self.threadCount = len(tracks) def play(self, position = 0, onError = None): if len(self.tracks) > 0 and len(self.tracks) > position: self.position = position if onError == None: self.currentTrack = Track(self.tracks[self.position]) else: self.currentTrack = Track(self.tracks[self.position], onError) self.currentTrack.setVolume(self.volume) self.currentTrack.play() else: raise IndexError('Wrong track position') def nextTrack(self, onError = None): if onError != None: self.play(self.position + 1, onError) else: self.play(self.position + 1) def previousTrack(self, onError = None): if onError != None: self.play(self.position - 1, onError) else: self.play(self.position - 1) def nextTrackAvilable(self): if len(self.tracks) > self.position + 1: return True return False def prevTrackAvilable(self): if len(self.tracks) > 0 and self.position - 1 >= 0: return True return False def setVolume(self, volume): if(volume > 1): volume = 1 elif(volume < 0): volume = 0 self.volume = volume self.currentTrack.setVolume(volume) def pause(self): self.currentTrack.pause() def unpause(self): self.currentTrack.unpause() def stop(self): self.currentTrack.stop() def isPaused(self): return self.currentTrack.isPaused() def isMuted(self): if self.currentTrack != None: return self.currentTrack.isMuted() return False def getVolume(self): return self.volume def isPlaying(self): if self.currentTrack != None: return self.currentTrack.isPlaying() return None def isPaused(self): if self.currentTrack != None: return self.currentTrack.isPaused() return None def getPosition(self): return self.position; def dispose(self): self.currentTrack.dispose() def onTrackEnd(self, callback): callback(self.position) def getTracks(self): return self.tracks def playbackInfo(self, code): base_response = { 'code' : code, 'position' : self.position, 'total' : len(self.tracks) } base_response.update(self.currentTrack.playbackInfo()) response = {'playlist' : base_response } return response def shouldGoNext(self): data = self.currentTrack.playbackInfo() current = self.currentTrack.getPlaybackPosition() total = data.get('playback').get('total').get('millis') if current >= total or current == -1: return True return False