# -*- coding: utf-8 -*- from __future__ import unicode_literals import random import output import sound_lib import logging from sound_lib.stream import URLStream from sound_lib.main import BassError from mysc.repeating_timer import RepeatingTimer from pubsub import pub player = None log = logging.getLogger("player") def setup(): global player if player == None: player = audioPlayer() class audioPlayer(object): def __init__(self): self.is_playing = False self.stream = None self.vol = 100 self.is_working = False self.queue = [] self.stopped = True def play(self, url, set_info=True): if self.stream != None and self.stream.is_playing == True: try: self.stream.stop() except BassError: log.exception("error when stopping the file") self.stream = None self.stopped = True if hasattr(self, "worker") and self.worker != None: self.worker.cancel() self.worker = None self.queue = [] # Make sure that there are no other sounds trying to be played. if self.is_working == False: self.is_working = True try: self.stream = URLStream(url=bytes(url["url"], "utf-8")) except BassError: log.debug("Error when playing the file %r") % (url,) return # Translators: {0} will be replaced with a song's title and {1} with the artist. if set_info: msg = _("Playing {0} by {1}").format(url["title"], url["artist"]) pub.sendMessage("update-status-bar", status=msg) self.stream.volume = self.vol/100.0 self.stream.play() self.stopped = False self.is_working = False def stop(self): if self.stream != None and self.stream.is_playing == True: self.stream.stop() self.stopped = True if hasattr(self, "worker") and self.worker != None: self.worker.cancel() self.worker = None self.queue = [] def pause(self): if self.stream != None: if self.stream.is_playing == True: self.stream.pause() self.stopped = True else: try: self.stream.play() self.stopped = False except BassError: pass @property def volume(self): if self.stream != None: return self.vol @volume.setter def volume(self, vol): if vol <= 100 and vol >= 0: self.vol = vol if self.stream != None: self.stream.volume = self.vol/100.0 def play_all(self, list_of_urls, shuffle=False): self.stop() # Skip all country restricted tracks as they are not playable here. self.queue = [i for i in list_of_urls if i["url"] != ""] if shuffle: random.shuffle(self.queue) self.play(self.queue[0]) self.queue.remove(self.queue[0]) self.worker = RepeatingTimer(5, self.player_function) self.worker.start() def player_function(self): if self.stream != None and self.stream.is_playing == False and self.stopped == False and len(self.stream) == self.stream.position: if len(self.queue) == 0: self.worker.cancel() return self.play(self.queue[0]) self.queue.remove(self.queue[0]) def check_is_playing(self): if self.stream == None: return False if self.stream != None and self.stream.is_playing == False: return False else: return True