python: release 3.0.6109
[vlc/bindings/python.git] / generated / 3.0 / examples / video_sync / mini_player.py
1 #
2 # PyQt5-based video-sync example for VLC Python bindings
3 # Copyright (C) 2009-2010 the VideoLAN team
4 #
5 # This program is free software; you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation; either version 2 of the License, or
8 # (at your option) any later version.
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program; if not, write to the Free Software
17 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
18 #
19 """
20 This module contains a bare-bones VLC player class to play videos.
21
22 Author: Saveliy Yusufov, Columbia University, sy2685@columbia.edu
23 Date: 25 January 2019
24 """
25
26 import os
27 import sys
28 import queue
29 import platform
30
31 from PyQt5 import QtWidgets, QtGui, QtCore
32 import vlc
33 from network import Client
34
35
36 class MiniPlayer(QtWidgets.QMainWindow):
37     """Stripped-down PyQt5-based media player class to sync with "master" video.
38     """
39
40     def __init__(self, data_queue, master=None):
41         QtWidgets.QMainWindow.__init__(self, master)
42         self.setWindowTitle("Mini Player")
43         self.statusbar = self.statusBar()
44         self.statusbar.showMessage("Ready")
45
46         # Create a basic vlc instance
47         self.instance = vlc.Instance()
48
49         self.media = None
50
51         # Create an empty vlc media player
52         self.mediaplayer = self.instance.media_player_new()
53
54         self.init_ui()
55         self.open_file()
56
57         self.timer = QtCore.QTimer(self)
58         self.timer.setInterval(10)
59         self.timer.timeout.connect(self.update_ui)
60
61         self.data_queue = data_queue
62         self.timer.start()
63
64     def init_ui(self):
65         """Set up the user interface
66         """
67         self.widget = QtWidgets.QWidget(self)
68         self.setCentralWidget(self.widget)
69
70         # In this widget, the video will be drawn
71         if platform.system() == "Darwin":  # for MacOS
72             self.videoframe = QtWidgets.QMacCocoaViewContainer(0)
73         else:
74             self.videoframe = QtWidgets.QFrame()
75
76         self.palette = self.videoframe.palette()
77         self.palette.setColor(QtGui.QPalette.Window, QtGui.QColor(0, 0, 0))
78         self.videoframe.setPalette(self.palette)
79         self.videoframe.setAutoFillBackground(True)
80
81         self.vboxlayout = QtWidgets.QVBoxLayout()
82         self.vboxlayout.addWidget(self.videoframe)
83         self.widget.setLayout(self.vboxlayout)
84
85     def open_file(self):
86         """Open a media file in a MediaPlayer
87         """
88         dialog_txt = "Choose Media File"
89         filename = QtWidgets.QFileDialog.getOpenFileName(self, dialog_txt, os.path.expanduser('~'))
90         if not filename[0]:
91             return
92
93         # getOpenFileName returns a tuple, so use only the actual file name
94         self.media = self.instance.media_new(filename[0])
95
96         # Put the media in the media player
97         self.mediaplayer.set_media(self.media)
98
99         # Parse the metadata of the file
100         self.media.parse()
101
102         # Set the title of the track as the window title
103         self.setWindowTitle("{}".format(self.media.get_meta(0)))
104
105         # The media player has to be 'connected' to the QFrame (otherwise the
106         # video would be displayed in it's own window). This is platform
107         # specific, so we must give the ID of the QFrame (or similar object) to
108         # vlc. Different platforms have different functions for this
109         if platform.system() == "Linux":  # for Linux using the X Server
110             self.mediaplayer.set_xwindow(int(self.videoframe.winId()))
111         elif platform.system() == "Windows":  # for Windows
112             self.mediaplayer.set_hwnd(int(self.videoframe.winId()))
113         elif platform.system() == "Darwin":  # for MacOS
114             self.mediaplayer.set_nsobject(int(self.videoframe.winId()))
115
116         # Start playing the video as soon as it loads
117         self.mediaplayer.play()
118
119     def update_ui(self):
120         self.update_statusbar()
121
122         try:
123             val = self.data_queue.get(block=False)
124         except queue.Empty:
125             return
126
127         if val == '<':
128             self.mediaplayer.set_rate(self.mediaplayer.get_rate() * 0.5)
129             return
130         if val == '>':
131             self.mediaplayer.set_rate(self.mediaplayer.get_rate() * 2)
132             return
133         if val == 'P':
134             self.mediaplayer.play()
135             return
136         if val == 'p':
137             self.mediaplayer.pause()
138             return
139         if val == 'S':
140             self.mediaplayer.stop()
141             return
142
143         val = int(val)
144         if val != self.mediaplayer.get_time():
145             self.mediaplayer.set_time(val)
146
147     def update_statusbar(self):
148         mtime = QtCore.QTime(0, 0, 0, 0)
149         time = mtime.addMSecs(self.mediaplayer.get_time())
150         self.statusbar.showMessage(time.toString())
151
152
153 def main():
154     """Entry point for our simple vlc player
155     """
156     app = QtWidgets.QApplication(sys.argv)
157
158     data_queue = queue.Queue()
159
160     player = MiniPlayer(data_queue)
161     player.show()
162     player.resize(480, 480)
163
164     _ = Client("localhost", 10000, data_queue)
165     sys.exit(app.exec_())
166
167
168 if __name__ == "__main__":
169     main()