Остановка python-vlc: player.stop() не работает

#python #pafy #python-vlc

Вопрос:

Я пытаюсь воспроизвести видео на YouTube с помощью pafy и vlc:

 def run(command, args, voice_instance):
    if command == "pune":
        search_query = " ".join(args)
        result = YoutubeSearch(search_query, max_results=10).to_dict()[0]

        video_title = result["title"]
        url_suffix = result["url_suffix"]

        url = f"https://www.youtube.com/{url_suffix}"
        video = pafy.new(url)
        best = video.getbest()
        playurl = best.url
        Instance = vlc.Instance("--no-video")
        player = Instance.media_player_new()
        Media = Instance.media_new(playurl)
        Media.get_mrl()
        player.set_media(Media)
        voice_instance.say(f'Pun {video_title}')
        player.play()
    
    if "oprește" in command:
        print('1')
        player.stop()
        print('2')
 

Он воспроизводит видео, но когда я говорю opreste , что он печатает 1, затем останавливается, и видео все еще воспроизводится.

Есть какие-нибудь идеи о том, как я мог бы это исправить ?

Комментарии:

1. Вероятно, нам нужно просмотреть больше вашего кода, чтобы понять, как вы вызываете run, чтобы дать вам реальный ответ, но из того, что вы опубликовали, похоже, что игрок будет неопределенным, когда вы вызовете его во второй раз. Вам нужно где-то отслеживать переменную игрока.

2. Это всего лишь дополнение для github.com/AlfredoSequeida/karen Это весь мой код без импорта.я не могу придумать никакого способа отслеживать переменную проигрывателя. я пробовал некоторые вещи, но ничего не работает. Ты знаешь, как я мог это сделать ?

Ответ №1:

Стреляю от бедра, но если все, что вы можете сделать, это предоставить единственную функцию, может быть, вы сможете сохранить свой плеер как глобальную переменную?

 def run(command, args, voice_instance):

    if globals().get('player'):
        instance = globals()['instance']
        player = globals()['player']
    else:
        instance = globals()['instance'] = vlc.Instance("--no-video")
        player = globals()['player'] = instance.media_player_new()    

    if command == "pune":
        search_query = " ".join(args)
        result = YoutubeSearch(search_query, max_results=10).to_dict()[0]

        video_title = result["title"]
        url_suffix = result["url_suffix"]

        url = f"https://www.youtube.com/{url_suffix}"
        video = pafy.new(url)
        best = video.getbest()
        playurl = best.url

        media = instance.media_new(playurl)
        media.get_mrl()
        player.set_media(media)

        voice_instance.say(f'Pun {video_title}')
        player.play()
    
    if "oprește" in command:
        print('1')
        player.stop()
        print('2')
        # and possibly garbage collect the player
        # del globals()['player']
        # del globals()['instance']