Я пытаюсь создать простой медиаплеер, используя 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()