コード例 #1
0
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()
コード例 #2
0
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()