class VideoPlayer: def __init__(self): self.yt_player = YouTubePlayer() self.streamer = Streamer() self.file_player = FilePlayer() self.players_cache = Cache(_cache_size) def set_status_func(self, status_func): self.yt_player.set_status_func(status_func) self.streamer.set_status_func(status_func) def _get_player(self, url): c = self.players_cache.get(url) if c is not None: return c if self.file_player.can_play(url): c = self.file_player elif self.yt_player.can_play(url): c = self.yt_player elif self.streamer.can_play(url): c = self.streamer if c is not None: self.players_cache.add(url, c) return c return None def get_qualities(self, url): p = self._get_player(url) if p is None: return None else: return p.get_qualities(url) def can_play(self, url): try: return self._get_player(url) is not None except: return False def is_playing(self): return self.yt_player.is_playing() or self.streamer.is_playing() \ or self.file_player.is_playing() def play(self, url, quality): p = self._get_player(url) if p is None: raise Exception('No player found') p.play(url, quality) def is_playlist(self): return self.yt_player.is_playlist() def playlist_next(self): self.yt_player.playlist_next() def stop(self): self.yt_player.stop() self.streamer.stop() self.file_player.stop()
class Play(QtCore.QThread): sig = QtCore.pyqtSignal(float, int, int, bool) def __init__(self, parent=None, *data): super(Play, self).__init__(parent) self.parent = parent self.id = data[0] # block and delete download audio binary if play new track self.lock_audio_load = False self.parent.is_stop = False self.sig.connect(self.parent.updateProgress) self.playback = Streamer(self.parent.volume) self.start() def run(self): self._set_unlock_load() uri, ext = helpers.search.get_youtube_streams(self.id, self.parent.cache_dir) full_dir = self.parent.cache_dir + 'cache.%s' % ext if os.path.isfile(full_dir): os.remove(full_dir) f = open(full_dir, 'wb') r = requests.get(uri, stream=True) for data in r.iter_content(1024): if not self._get_lock_load(): f.write(data) if data == None: break else: f.close() os.remove(full_dir) break f.close() if not self._get_lock_load(): self.playback.play(full_dir) if self.parent.is_stop == True: self.__del__() def _set_lock_load(self): self.lock_audio_load = True def _set_unlock_load(self): self.lock_audio_load = False def _get_lock_load(self): return self.lock_audio_load def pause(self): self.playback.pause() def set_volume(self, value): self.playback.player.audio_set_volume(value) def set_position(self, value): self.playback.player.set_position(value) def stop(self): self.playback.stop() return def _get_position(self): position = self.playback.player.get_position() time = self.playback.player.get_time() length = self.playback.player.get_length() is_playing = self.playback.is_playing() self.sig.emit(position, time, length, is_playing) def __del__(self): self.quit() self.wait()