Доступ к экземпляру плеера во время потоков - PullRequest
0 голосов
/ 19 октября 2019

Я пытаюсь создать простой медиаплеер, используя python-vlc lib. Также я пытаюсь запустить это в отдельном потоке, чтобы у меня могли одновременно выполняться другие задачи.

Теперь у меня возникают проблемы с тем, чтобы игрок фактически воспроизводил всю длину плейлиста. Но теперь событие потока, которое запускается, когда плейлист заканчивается, не дает мне доступа к проигрывателю для таких задач, как «пропустить одну песню вперед», «настроить громкость» и т. Д. Во время фактического воспроизведения.

Я не оченьзнаком с потоками и поэтому задавался вопросом, какие будут лучшие решения для его установки.

# import built-in modules
from itertools import count
import os
from threading import Event, Thread

# import third-party modules
import vlc


class Player:

    def __init__(self):
        self.played = count()
        self.finished = Event()
        vlc_instance = vlc.Instance()
        self.media_player = vlc_instance.media_player_new()
        self.media_list = vlc_instance.media_list_new()

        self.media_list_player = vlc_instance.media_list_player_new()
        self.media_list_player.set_media_player(self.media_player)

        event_manager = self.media_player.event_manager()
        event_manager.event_attach(vlc.EventType.MediaPlayerEndReached, self.end_reached)

    def add_media(self, filename):
        self.media_list.add_media(filename)

    def play(self):
        self.media_list_player.set_media_list(self.media_list)
        self.media_list_player.play()

    def previous(self):
        self.media_list_player.previous()

    def next(self):
        self.media_list_player.next()

    def wait(self):
        self.finished.wait()

    def end_reached(self, event):
        if event.type.value == vlc.EventType.MediaPlayerEndReached.value:
            if next(self.played) == self.media_list.count():
                self.finished.set()


def start_up(directory):
    player = Player()

    for track in os.listdir(directory):
        path = os.path.join(directory, track)
        player.add_media(path)
    player.play()

    #this keeps the thread alive until the event is set to True
    player.wait()


if __name__ == '__main__':
    directory = '/path/to/music/folder'
    x = Thread(target=start_up, args=[directory])
    x.start()
...