oaubert / python-vlc

Python vlc bindings
GNU Lesser General Public License v2.1
381 stars 108 forks source link

MediaListEndReached event is never triggered #254

Open hughmcmaster opened 1 year ago

hughmcmaster commented 1 year ago

I've been testing media list events and found that MediaListEndReached is never triggered. MediaListItemAdded and MediaListItemDeleted are triggered correctly, however.

To demonstrate the bug, here is a working example.

Can you please fix this event, as it is would be very useful.

import sys
import vlc
import tkinter as tk
import time

class Player:
    def __init__(self, video=None, args=[]):
        if (sys.platform.startswith('linux')):
            args.append('--no-xlib')

        self.vlc_instance = vlc.Instance(args)
        self.medialist = self.vlc_instance.media_list_new()
        self.mlplayer = self.vlc_instance.media_list_player_new()
        self.player = self.mlplayer.get_media_player()
        self.medialist.add_media(vlc.Media(video))

        self.__set_gui()
        self.__set_bindings()

    def __set_gui(self):
        self.root = tk.Tk()
        self.root.minsize(width=800, height=450)
        self.root.protocol('WM_DELETE_WINDOW', self.exit)

        self.videopanel = tk.Frame(self.root)
        self.canvas = tk.Canvas(self.videopanel, bg='red', highlightthickness=0)
        self.canvas.pack(fill=tk.BOTH, expand=1)
        self.videopanel.pack(fill=tk.BOTH, expand=1)

        self.player.set_xwindow(self.videopanel.winfo_id())
        self.root.update()

    def __set_bindings(self):
        self.root.bind('e', lambda event: self.exit())

    def __callback(self, event):
        print(event.type)

    def start(self):
        self.mlplayer.set_media_list(self.medialist)
        self.mlplayer.play()

        self.em = self.medialist.event_manager()
        self.em.event_attach(vlc.EventType.MediaListEndReached, self.__callback)
        self.root.mainloop()

    def exit(self):
        self.mlplayer.stop()
        self.root.quit()
        self.root.destroy()

player = Player(video='video.mp4', args=['--no-autoscale'])
player.start()