Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-python-vlc for
openSUSE:Factory checked in at 2022-12-04 14:58:46
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-python-vlc (Old)
and /work/SRC/openSUSE:Factory/.python-python-vlc.new.1835 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-python-vlc"
Sun Dec 4 14:58:46 2022 rev:12 rq:1039902 version:3.0.18121
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-python-vlc/python-python-vlc.changes
2022-03-01 17:04:29.092348030 +0100
+++
/work/SRC/openSUSE:Factory/.python-python-vlc.new.1835/python-python-vlc.changes
2022-12-04 14:59:17.280593004 +0100
@@ -1,0 +2,6 @@
+Sat Dec 3 21:50:45 UTC 2022 - Yogalakshmi Arunachalam <[email protected]>
+
+- Update to version 3.0.18121
+ No Changelog
+
+-------------------------------------------------------------------
Old:
----
python-vlc-3.0.16120.tar.gz
New:
----
python-vlc-3.0.18121.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-python-vlc.spec ++++++
--- /var/tmp/diff_new_pack.UlKiVw/_old 2022-12-04 14:59:17.748595700 +0100
+++ /var/tmp/diff_new_pack.UlKiVw/_new 2022-12-04 14:59:17.752595723 +0100
@@ -17,7 +17,7 @@
Name: python-python-vlc
-Version: 3.0.16120
+Version: 3.0.18121
Release: 0
Summary: VLC bindings for python
License: LGPL-2.0-or-later
++++++ python-vlc-3.0.16120.tar.gz -> python-vlc-3.0.18121.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/python-vlc-3.0.16120/PKG-INFO
new/python-vlc-3.0.18121/PKG-INFO
--- old/python-vlc-3.0.16120/PKG-INFO 2022-02-28 20:33:24.841742800 +0100
+++ new/python-vlc-3.0.18121/PKG-INFO 2022-11-16 12:06:24.821384000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: python-vlc
-Version: 3.0.16120
+Version: 3.0.18121
Summary: VLC bindings for python.
Home-page: http://wiki.videolan.org/PythonBinding
Author: Olivier Aubert
@@ -9,7 +9,6 @@
Maintainer-email: [email protected]
License: LGPL-2.1+
Keywords: vlc,video
-Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: GNU Lesser General Public License v2 or
later (LGPLv2+)
@@ -31,6 +30,5 @@
player. Note that it relies on an already present install of VLC.
It has been automatically generated from the include files of
- vlc 3.0.16, using generator 1.20.
+ vlc 3.0.18, using generator 1.21.
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/python-vlc-3.0.16120/examples/cocoavlc.py
new/python-vlc-3.0.18121/examples/cocoavlc.py
--- old/python-vlc-3.0.16120/examples/cocoavlc.py 2021-10-08
11:14:06.000000000 +0200
+++ new/python-vlc-3.0.18121/examples/cocoavlc.py 2022-11-16
11:55:28.000000000 +0100
@@ -1,4 +1,4 @@
-#! /usr/bin/env python3
+#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Example of using PyCocoa <https://PyPI.org/project/PyCocoa> to create a
@@ -6,18 +6,19 @@
# The Python-VLC binding <https://PyPI.Python.org/pypi/python-vlc> and the
# corresponding VLC App, see <https://www.VideoLan.org/index.html>.
-# PyCocoa version 21.8.18 or later must be installed.
+# PyCocoa version 21.11.02 or later must be installed (on macOS Monterey)
-# This VLC player has been tested with VLC 3.0.10-12, 3.0.6-8, 3.0.4,
+# This VLC player has been tested with VLC 3.0.10-16, 3.0.6-8, 3.0.4,
# 3.0.1-2, 2.2.8 and 2.2.6 and the compatible vlc.py Python-VLC binding
-# using 64-bit Python 3.10.0.rc1, 3.9.6, 3.9.0-1, 3.8.10, 3.8.6, 3.7.0-4,
-# 3.6.4-5 and 2.7.14-18 on macOS 11.5.2 Big Sur (aka 10.16), 10.15.6
-# Catalina, 10.14.6 Mojave and 10.13.4-6 High Sierra. This player
-# does not work with PyPy <https://PyPy.org> nor with Intel(R) Python
-# <https://Software.Intel.com/en-us/distribution-for-python>. Python
-# 3.10.0rc1, 3.9.6 and macOS' Python 2.7.16 run on Apple Silicon (C{arm64}),
-# all other Python versions run on Intel (C{x86_64}) or I{emulated} Intel
-# (C{"arm64_x86_64"}, see function C{pycocoa.machine}).
+# using 64-bit Python 3.10.0, 3.9.6, 3.9.0-1, 3.8.10, 3.8.6, 3.7.0-4,
+# 3.6.4-5 and 2.7.14-18 on macOS 12.0.1 Monterey, 11.5.2-6.1 Big Sur
+# (aka 10.16), 10.15.6 Catalina, 10.14.6 Mojave and 10.13.4-6 High Sierra.
+# This player does not work with PyPy <https://PyPy.org> nor with Intel(R)
+# Python <https://Software.Intel.com/en-us/distribution-for-python>.
+
+# Python 3.10.0, 3.9.6 and macOS' Python 2.7.16 run on Apple Silicon
+# (C{arm64} I{natively}), all other Python versions run on Intel (C{x86_64})
+# or I{emulated} Intel (C{"arm64_x86_64"}, see function C{pycocoa.machine}).
# MIT License <https://OpenSource.org/licenses/MIT>
#
@@ -45,7 +46,7 @@
return 'see <https://PyPI.org/project/%s>' % (package,)
__all__ = ('AppVLC',) # PYCHOK expected
-__version__ = '21.08.18'
+__version__ = '21.11.02'
try:
import vlc
@@ -479,11 +480,16 @@
else:
Thread(target=self._sizer).start()
- def _sizer(self, secs=0.1):
+ def _sizer(self, secs=0.25):
while True:
- w, h = self.player.video_get_size(0)
+ p = self.player
+ # wiggle the video to fill the window
+ s = p.video_get_scale()
+ p.video_set_scale(0.0 if s else 1.0)
+ p.video_set_scale(s)
# the first call(s) returns (0, 0),
# subsequent calls return (w, h)
+ w, h = p.video_get_size(0)
if h > 0 and w > 0:
# window's contents' aspect ratio
self.window.ratio = self.sized = w, h
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/python-vlc-3.0.16120/examples/psgvlc.py
new/python-vlc-3.0.18121/examples/psgvlc.py
--- old/python-vlc-3.0.16120/examples/psgvlc.py 1970-01-01 01:00:00.000000000
+0100
+++ new/python-vlc-3.0.18121/examples/psgvlc.py 2022-11-16 11:55:28.000000000
+0100
@@ -0,0 +1,156 @@
+#! /usr/bin/env python3
+# -*- coding: utf-8 -*-
+
+u'''Bare Bones VLC Media Player Demo with Playlist.
+
+1 - Originally the Demo_Media_Player_VLC_Based.py duplicated from
+ <https://GitHub.com/PySimpleGUI/PySimpleGUI/blob/master/DemoPrograms>
+ and modified to work and showing videos on recent macOS versions.
+
+2 - This script uses PySimpleGUI under its LGPL3+ stipulations.
+
+3 - You will need to install the Python bindings for VLC, for example
+ using pip: python3 -m pip install python-vlc
+
+4 - You need the VLC player itself from <https://www.VideoLan.org>.
+
+5 - On macOS, you also need to get tkvlc.py from this location
+ <https://GitHub.com/oaubert/python-vlc/tree/master/examples>
+ to get video and audio.
+
+6 - On macOS, the video plays full-frame, overwriting the buttons.
+
+7 - Original <https://GitHub.com/israel-dryer/Media-Player> by Israel
+ Dryer, modified to be a PySimpleGUI Demo Program and a python-vlc
+ example for you to customize. Uses the VLC player to playback
+ local media files (and YouTube streams).
+'''
+import sys
+if sys.version_info[0] < 3: # Python 3.4+ only
+ sys.exit('%s requires Python 3.4 or later' % (sys.argv[0],))
+ # import Tkinter as tk
+import PySimpleGUI as sg
+import vlc
+
+__all__ = ('libtk',)
+__version__ = '22.11.07' # mrJean1 at Gmail
+
+_Load_ = 'Load'
+_Next_ = 'Next'
+_Path_ = 'Media URL or local path:'
+_Pause_ = 'Pause'
+_Play_ = 'Play'
+_Prev_ = 'Previous'
+_Stop_ = 'Stop'
+
+# GUI definition & setup
+sg.theme('DarkBlue')
+
+def Bn(name): # a PySimpleGUI "User Defined Element" (see docs)
+ return sg.Button(name, size=(8, 1), pad=(1, 1))
+
+layout = [[sg.Input(default_text=_Path_, size=(40, 1), key='-VIDEO_PATH-'),
sg.Button(_Load_)],
+ [sg.Frame('', [], size=(300, 170), key='-VID_OUT-')], # was
[sg.Image('', ...)],
+ [Bn(_Prev_), Bn(_Play_), Bn(_Next_), Bn(_Pause_), Bn(_Stop_)],
+ [sg.Text('Load media to start', key='-MESSAGE_AREA-')]]
+
+window = sg.Window('PySimpleGUI VLC Player', layout,
element_justification='center', finalize=True, resizable=True)
+
+window['-VID_OUT-'].expand(True, True) # type: sg.Element
+
+# Media Player Setup
+inst = vlc.Instance()
+list_player = inst.media_list_player_new()
+media_list = inst.media_list_new([])
+list_player.set_media_list(media_list)
+player = list_player.get_media_player()
+# tell VLC where to render the video(s)
+tk_id = window['-VID_OUT-'].Widget.winfo_id()
+libtk = ''
+if sg.running_linux():
+ player.set_xwindow(tk_id)
+elif sg.running_windows():
+ player.set_hwnd(tk_id)
+elif sg.running_mac():
+ try:
+ from tkvlc import _GetNSView, libtk
+ ns = _GetNSView(tk_id)
+ except ImportError:
+ ns = None
+ libtk = 'none, install tkvlc.py from
<https://GitHub.com/oaubert/python-vlc> examples'
+ if ns: # drawable NSview
+ player.set_nsobject(ns)
+ else: # no video, only audio
+ player.set_xwindow(tk_id)
+else: # running trinket, etc.
+ player.set_hwnd(tk_id) # TBD
+
+if __name__ == '__main__': # MCCABE 20
+
+ if len(sys.argv) > 1:
+ if sys.argv[1].lower() in ('-v', '--version'):
+ # show all versions, this vlc.py, libvlc, etc. (sample output on
macOS):
+ # ...
+ # % python3 ./psgvlc.py -v
+ # psgvlc.py: 22.11.06
+ # tkinter: 8.6
+ # libTk:
/Library/Frameworks/Python.framework/Versions/3.11/lib/libtk8.6.dylib
+ # vlc.py: 3.0.12119 (Mon May 31 18:25:17 2021 3.0.12)
+ # libVLC: 3.0.16 Vetinari (0x3001000)
+ # plugins: /Applications/VLC.app/Contents/MacOS/plugins
+ # Python: 3.11.0 (64bit) macOS 13.0 arm64
+ for t in ((sys.argv[0], __version__), (sg.tk.__name__,
sg.tk.TkVersion), ('libTk', libtk)):
+ print('{}: {}'.format(*t))
+ try:
+ vlc.print_version()
+ vlc.print_python()
+ except AttributeError:
+ pass
+ sys.exit(0)
+
+ if sys.argv[1]:
+ media_list.add_media(sys.argv[1])
+ list_player.set_media_list(media_list)
+
+ # The Event Loop
+ while True:
+ # run with a timeout so that current location can be updated
+ event, values = window.read(timeout=1000)
+
+ if event == sg.WIN_CLOSED:
+ break
+
+ if event == _Pause_:
+ list_player.pause()
+ elif event == _Stop_:
+ list_player.stop()
+ elif event == _Next_:
+ list_player.next()
+ list_player.play()
+ elif event == _Prev_:
+ list_player.previous() # first call causes current video to start
over
+ list_player.previous() # second call moves back 1 video from
current
+ list_player.play()
+ elif event == _Play_:
+ list_player.play()
+ elif event == _Load_:
+ path = values['-VIDEO_PATH-']
+ if path and _Path_ not in path:
+ media_list.add_media(path)
+ list_player.set_media_list(media_list)
+ window['-VIDEO_PATH-'].update(_Path_) # only add a legit
submit
+
+ # update elapsed time if a video loaded and playing
+ if player.is_playing():
+ text = '{:02d}:{:02d}'.format(*divmod(player.get_time() // 1000,
60)) + ' / ' + \
+ '{:02d}:{:02d}'.format(*divmod(player.get_length() // 1000,
60))
+ if sg.running_mac():
+ print('{}: {}'.format(sys.argv[0], text))
+
+ elif not media_list.count():
+ text = 'Load media to start'
+ else:
+ text = 'Ready to play media'
+ window['-MESSAGE_AREA-'].update(text)
+
+ window.close()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/python-vlc-3.0.16120/examples/tkvlc.py
new/python-vlc-3.0.18121/examples/tkvlc.py
--- old/python-vlc-3.0.16120/examples/tkvlc.py 2021-10-08 11:15:06.000000000
+0200
+++ new/python-vlc-3.0.18121/examples/tkvlc.py 2022-11-16 11:55:28.000000000
+0100
@@ -18,79 +18,119 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
#
-"""A simple example for VLC python bindings using tkinter.
-Requires Python 3.4 or later.
+'''A simple example for VLC python bindings using tkinter.
+
Author: Patrick Fay
Date: 23-09-2015
-"""
+'''
-# Tested with Python 3.7.4, tkinter/Tk 8.6.9 on macOS 10.13.6 only.
-__version__ = '20.05.04' # mrJean1 at Gmail
+# Tested with VLC 3.0.16, 3.0.12, 3.0.11, 3.0.10, 3.0.8 and 3.0.6 with
+# the compatible vlc.py Python-VLC binding, Python 3.11.0, 3.10.0, 3.9.0
+# and 3.7.4 with tkinter/Tk 8.6.9 on macOS 13.0 (amd64 M1), 11.6.1 (10.16
+# amd64 M1), 11.0.1 (10.16 x86-64) and 10.13.6 only.
+__version__ = '22.11.11' # mrJean1 at Gmail
-# import external libraries
-import vlc
-# import standard libraries
import sys
-if sys.version_info[0] < 3:
- import Tkinter as Tk
- from Tkinter import ttk
- from Tkinter.filedialog import askopenfilename
- from Tkinter.tkMessageBox import showerror
-else:
+try: # Python 3.4+ only
import tkinter as Tk
- from tkinter import ttk
+ from tkinter import ttk # PYCHOK ttk = Tk.ttk
from tkinter.filedialog import askopenfilename
from tkinter.messagebox import showerror
-from os.path import basename, expanduser, isfile, join as joined
-from pathlib import Path
+ from pathlib import Path
+except ImportError:
+ sys.exit('%s requires Python 3.4 or later' % (sys.argv[0],))
+ # import Tkinter as Tk
+import os
import time
+import vlc
+
+_dragging = False # use -dragging option
_isMacOS = sys.platform.startswith('darwin')
_isWindows = sys.platform.startswith('win')
_isLinux = sys.platform.startswith('linux')
-if _isMacOS:
- from ctypes import c_void_p, cdll
+_TKVLC_LIBTK_PATH = 'TKVLC_LIBTK_PATH'
+
+if _isMacOS: # MCCABE 14
+ from ctypes import cdll, c_void_p
+ from ctypes.util import find_library as _find
+
# libtk = cdll.LoadLibrary(ctypes.util.find_library('tk'))
- # returns the tk library /usr/lib/libtk.dylib from macOS,
- # but we need the tkX.Y library bundled with Python 3+,
- # to match the version number of tkinter, _tkinter, etc.
+ # returns (None or) the tk library /usr/lib/libtk.dylib
+ # from macOS, but we need the tkX.Y library bundled with
+ # Python 3+ or one matching the version of tkinter
+
+ # Homebrew-built Python, Tcl/Tk, etc. are installed in
+ # different places, usually something like /usr/- or
+ # /opt/local/Cellar/tcl-tk/8.6.11_1/lib/libtk8.6.dylib,
+ # found by command line `find /opt -name libtk8.6.dylib`
+
+ def _find_lib(name, *paths):
+ # 1. built into Python
+ for p in (getattr(sys, 'base_prefix', ''), sys.prefix):
+ if p:
+ yield p + '/lib/' + name
+ # 2. from ctypes.find_library, env variable
+ for p in paths:
+ if p: # is not None
+ p = os.path.expanduser(p)
+ yield p
+ if not p.endswith(name):
+ yield p + '/' + name
+ # 3. try Homebrew basement
+ from glob import iglob
+ for t in ('/opt', '/usr'):
+ t += '/local/Cellar/tcl-tk/*/lib/' + name
+ for p in iglob(t):
+ yield p
+ assert os.path.sep == '/'
+
try:
- libtk = 'libtk%s.dylib' % (Tk.TkVersion,)
- prefix = getattr(sys, 'base_prefix', sys.prefix)
- libtk = joined(prefix, 'lib', libtk)
- dylib = cdll.LoadLibrary(libtk)
- # getNSView = dylib.TkMacOSXDrawableView is the
+ env = os.environ.get(_TKVLC_LIBTK_PATH, '')
+ lib = 'libtk%s.dylib' % (Tk.TkVersion,)
+ for libtk in _find_lib(lib, _find(lib), *env.split(os.pathsep)):
+ if libtk and lib in libtk and os.access(libtk, os.F_OK):
+ break
+ else: # not found anywhere
+ if env: # bad env?
+ t = 'no %s in %%s=%r' % (lib, env)
+ else: # env not set, suggest
+ t = 'no %s found, use %%s to set a path' % (lib,)
+ raise NameError(t % (_TKVLC_LIBTK_PATH,))
+
+ lib = cdll.LoadLibrary(libtk)
+ # getNSView = tklib.TkMacOSXDrawableView is the
# proper function to call, but that is non-public
# (in Tk source file macosx/TkMacOSXSubwindows.c)
- # and dylib.TkMacOSXGetRootControl happens to call
- # dylib.TkMacOSXDrawableView and return the NSView
- _GetNSView = dylib.TkMacOSXGetRootControl
+ # Fortunately, tklib.TkMacOSXGetRootControl calls
+ # tklib.TkMacOSXDrawableView and returns the NSView
+ _GetNSView = lib.TkMacOSXGetRootControl
# C signature: void *_GetNSView(void *drawable) to get
# the Cocoa/Obj-C NSWindow.contentView attribute, the
# drawable NSView object of the (drawable) NSWindow
_GetNSView.restype = c_void_p
- _GetNSView.argtypes = c_void_p,
- del dylib
+ _GetNSView.argtypes = (c_void_p,)
- except (NameError, OSError): # image or symbol not found
- def _GetNSView(unused):
+ except (NameError, OSError) as x: # lib, image or symbol not found
+ libtk = str(x) # imported by psgvlc.py
+
+ def _GetNSView(unused): # imported by psgvlc.py
return None
- libtk = "N/A"
- C_Key = "Command-" # shortcut key modifier
+ del cdll, c_void_p, env, _find
+ C_Key = 'Command-' # shortcut key modifier
else: # *nix, Xwindows and Windows, UNTESTED
- libtk = "N/A"
- C_Key = "Control-" # shortcut key modifier
+ libtk = 'N/A'
+ C_Key = 'Control-' # shortcut key modifier
class _Tk_Menu(Tk.Menu):
- '''Tk.Menu extended with .add_shortcut method.
- Note, this is a kludge just to get Command-key shortcuts to
- work on macOS. Other modifiers like Ctrl-, Shift- and Option-
- are not handled in this code.
+ '''Tk.Menu extended with .add_shortcut method. Note, this is a
+ kludge just to get Command-key shortcuts to work on macOS.
+ Modifiers like Ctrl-, Shift- and Option- are not handled!
'''
_shortcuts_entries = {}
_shortcuts_widget = None
@@ -109,7 +149,7 @@
elif _isMacOS:
# keys show as upper-case, always
- self.add_command(label=label, accelerator='Command-' + key,
+ self.add_command(label=label, accelerator=C_Key + key,
command=command, **kwds)
self.bind_shortcut(key, command, label)
@@ -119,15 +159,15 @@
self.bind_shortcut(key, command, label)
def bind_shortcut(self, key, command, label=None):
- """Bind shortcut key, default modifier Command/Control.
- """
+ '''Bind shortcut key, default modifier Command/Control.
+ '''
# The accelerator modifiers on macOS are Command-,
# Ctrl-, Option- and Shift-, but for .bind[_all] use
# <Command-..>, <Ctrl-..>, <Option_..> and <Shift-..>,
# <https://www.Tcl.Tk/man/tcl8.6/TkCmd/bind.htm#M6>
if self._shortcuts_widget:
if C_Key.lower() not in key.lower():
- key = "<%s%s>" % (C_Key, key.lstrip('<').rstrip('>'))
+ key = '<%s%s>' % (C_Key, key.lstrip('<').rstrip('>'))
self._shortcuts_widget.bind(key, command)
# remember the shortcut key for this menu item
if label is not None:
@@ -147,85 +187,100 @@
'''
self._shortcuts_widget = widget
- def entryconfig(self, item, **kwds):
- """Update shortcut key binding if menu entry changed.
- """
+ def entryconfig(self, item, **kwds): # PYCHOK signature
+ '''Update shortcut key binding if menu entry changed.
+ '''
Tk.Menu.entryconfig(self, item, **kwds)
# adjust the shortcut key binding also
if self._shortcuts_widget:
key = self._shortcuts_entries.get(item, None)
- if key is not None and "command" in kwds:
- self._shortcuts_widget.bind(key, kwds["command"])
+ if key is not None and 'command' in kwds:
+ self._shortcuts_widget.bind(key, kwds['command'])
class Player(Tk.Frame):
- """The main window has to deal with events.
- """
- _geometry = ''
- _stopped = None
+ '''The main window has to deal with events.
+ '''
+ _debugs = 0
+ _geometry = ''
+ _MIN_WIDTH = 600
+ _stopped = None
- def __init__(self, parent, title=None, video=''):
+ def __init__(self, parent, title=None, video='', debug=False): # PYCHOK
called!
Tk.Frame.__init__(self, parent)
+ self.debug = bool(debug)
self.parent = parent # == root
- self.parent.title(title or "tkVLCplayer")
- self.video = expanduser(video)
+ self.parent.title(title or 'tkVLCplayer')
+ self.video = os.path.expanduser(video)
# Menu Bar
- # File Menu
menubar = Tk.Menu(self.parent)
self.parent.config(menu=menubar)
-
+ # File Menu
fileMenu = _Tk_Menu(menubar)
fileMenu.bind_shortcuts_to(parent) # XXX must be root?
- fileMenu.add_shortcut("Open...", 'o', self.OnOpen)
+ fileMenu.add_shortcut('Open...', 'o', self.OnOpen)
+ fileMenu.add_separator()
+ fileMenu.add_shortcut('Play', 'p', self.OnPlay) # Play/Pause
+ fileMenu.add_command(label='Stop', command=self.OnStop)
+ fileMenu.add_separator()
+ fileMenu.add_shortcut('Mute', 'm', self.OnMute)
fileMenu.add_separator()
- fileMenu.add_shortcut("Play", 'p', self.OnPlay) # Play/Pause
- fileMenu.add_command(label="Stop", command=self.OnStop)
+ fileMenu.add_shortcut('Close', 'w' if _isMacOS else 's', self.OnClose)
fileMenu.add_separator()
- fileMenu.add_shortcut("Mute", 'm', self.OnMute)
+ fileMenu.add_shortcut('Buttons Up', 'a', self.OnAnchor)
+ self.anchorIndex = fileMenu.index('Buttons Up')
fileMenu.add_separator()
- fileMenu.add_shortcut("Close", 'w' if _isMacOS else 's', self.OnClose)
- if _isMacOS: # intended for and tested on macOS
- fileMenu.add_separator()
- fileMenu.add_shortcut("Full Screen", 'f', self.OnFullScreen)
- menubar.add_cascade(label="File", menu=fileMenu)
+ fileMenu.add_shortcut('Full Screen', 'f', self.OnScreen)
+ self.fullIndex = fileMenu.index('Full Screen')
+ menubar.add_cascade(label='File', menu=fileMenu)
self.fileMenu = fileMenu
- self.playIndex = fileMenu.index("Play")
- self.muteIndex = fileMenu.index("Mute")
+ self.playIndex = fileMenu.index('Play')
+ self.muteIndex = fileMenu.index('Mute')
- # first, top panel shows video
-
- self.videopanel = ttk.Frame(self.parent)
- self.canvas = Tk.Canvas(self.videopanel)
+ # first, panel shows video
+ self.videoPanel = ttk.Frame(self.parent)
+ self.canvas = Tk.Canvas(self.videoPanel)
self.canvas.pack(fill=Tk.BOTH, expand=1)
- self.videopanel.pack(fill=Tk.BOTH, expand=1)
+ self.videoPanel.pack(fill=Tk.BOTH, expand=1)
# panel to hold buttons
- self.buttons_panel = Tk.Toplevel(self.parent)
- self.buttons_panel.title("")
- self.is_buttons_panel_anchor_active = False
-
- buttons = ttk.Frame(self.buttons_panel)
- self.playButton = ttk.Button(buttons, text="Play", command=self.OnPlay)
- stop = ttk.Button(buttons, text="Stop", command=self.OnStop)
- self.muteButton = ttk.Button(buttons, text="Mute", command=self.OnMute)
- self.playButton.pack(side=Tk.LEFT)
+ self.buttonsPanel = Tk.Toplevel(self.parent)
+ self.buttonsPanel.title('')
+ self.buttonsPanel_anchored = False
+ self.buttonsPanel_clicked = False
+ self.buttonsPanel_dragged = False
+
+ buttons = ttk.Frame(self.buttonsPanel)
+ self.playButton = ttk.Button(buttons, text='Play',
command=self.OnPlay, underline=0)
+ stop = ttk.Button(buttons, text='Stop',
command=self.OnStop)
+ self.muteButton = ttk.Button(buttons, text='Mute',
command=self.OnMute, underline=0)
+ self.playButton.pack(side=Tk.LEFT, padx=8)
stop.pack(side=Tk.LEFT)
- self.muteButton.pack(side=Tk.LEFT)
-
+ self.muteButton.pack(side=Tk.LEFT, padx=8)
self.volMuted = False
self.volVar = Tk.IntVar()
self.volSlider = Tk.Scale(buttons, variable=self.volVar,
command=self.OnVolume,
- from_=0, to=100, orient=Tk.HORIZONTAL,
length=200,
+ from_=0, to=100, orient=Tk.HORIZONTAL,
length=170,
showvalue=0, label='Volume')
- self.volSlider.pack(side=Tk.RIGHT)
+ self.volSlider.pack(side=Tk.LEFT)
+
+ self.anchorButton = ttk.Button(buttons, text='Up',
command=self.OnAnchor,
+ width=2) # in characters
+ self.anchorButton.pack(side=Tk.RIGHT, padx=8)
buttons.pack(side=Tk.BOTTOM, fill=Tk.X)
+ # <https://www.PythonTutorial.net/tkinter/tkinter-window>
+ # <https://TkDocs.com/tutorial/windows.html>
+ # self.buttonsPanel.attributes('-topmost', 1)
+
+ self.buttonsPanel.update()
+ self.videoPanel.update()
# panel to hold player time slider
- timers = ttk.Frame(self.buttons_panel)
+ timers = ttk.Frame(self.buttonsPanel)
self.timeVar = Tk.DoubleVar()
self.timeSliderLast = 0
self.timeSlider = Tk.Scale(timers, variable=self.timeVar,
command=self.OnTime,
@@ -235,7 +290,6 @@
self.timeSliderUpdate = time.time()
timers.pack(side=Tk.BOTTOM, fill=Tk.X)
-
# VLC player
args = []
if _isLinux:
@@ -243,110 +297,149 @@
self.Instance = vlc.Instance(args)
self.player = self.Instance.media_player_new()
- self.parent.bind("<Configure>", self.OnConfigure) # catch window
resize, etc.
+ self.parent.bind('<Configure>', self.OnConfigure) # catch window
resize, etc.
self.parent.update()
# After parent.update() otherwise panel is ignored.
- self.buttons_panel.overrideredirect(True)
+ self.buttonsPanel.overrideredirect(True)
+ self.buttonsPanel_anchored = True # down, under the video panel
- # Estetic, to keep our video panel at least as wide as our buttons
panel.
- self.parent.minsize(width=502, height=0)
+ if _dragging: # Detect dragging of the buttons panel.
+ self.buttonsPanel.bind('<Button-1>', self._Button1Down)
+ self.buttonsPanel.bind('<B1-Motion>', self._Button1Motion)
+ self.buttonsPanel.bind('<ButtonRelease-1>', self._Button1Up)
- if _isMacOS:
- # Only tested on MacOS so far. Enable for other OS after verified
tests.
- self.is_buttons_panel_anchor_active = True
-
- # Detect dragging of the buttons panel.
- self.buttons_panel.bind("<Button-1>", lambda event: setattr(self,
"has_clicked_on_buttons_panel", event.y < 0))
- self.buttons_panel.bind("<B1-Motion>",
self._DetectButtonsPanelDragging)
- self.buttons_panel.bind("<ButtonRelease-1>", lambda _:
setattr(self, "has_clicked_on_buttons_panel", False))
- self.has_clicked_on_buttons_panel = False
- else:
- self.is_buttons_panel_anchor_active = False
+ # Keep the video panel at least as wide as thebuttons panel.
+ self.parent.minsize(width=self._MIN_WIDTH, height=0)
+
+ self._AnchorPanels(force=True)
- self._AnchorButtonsPanel()
+ self.OnTick() # set up the timer
- self.OnTick() # set the timer up
+ if self.video: # play for a second
+ self.OnPlay()
+ self.parent.after(1000, self.OnPause)
+
+ def _Button1Down(self, *unused): # only if -dragging
+ self._debug(self._Button1Down)
+ # Left-mouse-button pressed inside the buttons
+ # panel, but not in and over a slider-/button.
+ self.buttonsPanel_clicked = True
+ self.buttonsPanel_dragged = False
+
+ def _Button1Motion(self, *unused): # only if -dragging
+ self._debug(self._Button1Motion)
+ # Mouse dragged, moved with left-mouse-button down?
+ self.buttonsPanel_dragged = self.buttonsPanel_clicked
+
+ def _Button1Up(self, *unused): # only if -dragging
+ self._debug(self._Button1Up)
+ # Left-mouse-button release
+ if self.buttonsPanel_clicked:
+ if self.buttonsPanel_dragged:
+ # If the mouse was dragged in the buttons
+ # panel on the background, un-/anchor it.
+ self.OnAnchor()
+# if _dragged:
+# self.buttonsPanel.unbind('<Button-1>')
+# self.buttonsPanel.unbind('<B1-Motion>')
+# self.buttonsPanel.unbind('<ButtonRelease-1>')
+ self.buttonsPanel_clicked = False
+ self.buttonsPanel_dragged = False
+
+ def _debug(self, where, **kwds):
+ # Print where an event is are handled.
+ if self.debug:
+ self._debugs += 1
+ d = dict(anchored=self.buttonsPanel_anchored,
+ clicked=self.buttonsPanel_clicked,
+ dragged=self.buttonsPanel_dragged,
+ playing=self.player.is_playing(),
+ stopped=self._stopped)
+ d.update(kwds)
+ d = ', '.join('%s=%s' % t for t in sorted(d.items()))
+ print('%4s: %s %s' % (self._debugs, where.__name__, d))
+
+ def _AnchorPanels(self, force=False):
+ # Un-/anchor the buttons under the video panel, at the same width.
+ self._debug(self._AnchorPanels)
+ if (force or self.buttonsPanel_anchored):
+ video = self.parent
+ h = video.winfo_height()
+ w = video.winfo_width()
+ x = video.winfo_x() # i.e. same as the video
+ y = video.winfo_y() + h + 32 # i.e. below the video
+ h = self.buttonsPanel.winfo_height() # unchanged
+ w = max(w, self._MIN_WIDTH) # i.e. same a video width
+ self.buttonsPanel.geometry('%sx%s+%s+%s' % (w, h, x, y))
+
+ def OnAnchor(self, *unused):
+ '''Toggle buttons panel anchoring.
+ '''
+ c = self.OnAnchor
+ self._debug(c)
+ self.buttonsPanel_anchored = not self.buttonsPanel_anchored
+ if self.buttonsPanel_anchored:
+ a = 'Up'
+ self._AnchorPanels(force=True)
+ else: # move the panel to the top left corner
+ a = 'Down'
+ h = self.buttonsPanel.winfo_height() # unchanged
+ self.buttonsPanel.geometry('%sx%s+8+32' % (self._MIN_WIDTH, h))
+ self.anchorButton.config(text=a, width=len(a))
+ a = 'Buttons ' + a
+ self.fileMenu.entryconfig(self.anchorIndex, label=a, command=c)
+ # self.fileMenu.bind_shortcut('a', c) # XXX handled
def OnClose(self, *unused):
- """Closes the window and quit.
- """
- # print("_quit: bye")
+ '''Closes the window and quit.
+ '''
+ self._debug(self.OnClose)
+ # print('_quit: bye')
self.parent.quit() # stops mainloop
self.parent.destroy() # this is necessary on Windows to avoid
# ... Fatal Python Error: PyEval_RestoreThread: NULL tstate
- def _DetectButtonsPanelDragging(self, _):
- """If our last click was on the boarder
- we disable the anchor.
- """
- if self.has_clicked_on_buttons_panel:
- self.is_buttons_panel_anchor_active = False
- self.buttons_panel.unbind("<Button-1>")
- self.buttons_panel.unbind("<B1-Motion>")
- self.buttons_panel.unbind("<ButtonRelease-1>")
-
- def _AnchorButtonsPanel(self):
- video_height = self.parent.winfo_height()
- panel_x = self.parent.winfo_x()
- panel_y = self.parent.winfo_y() + video_height + 23 # 23 seems to put
the panel just below our video.
- panel_height = self.buttons_panel.winfo_height()
- panel_width = self.parent.winfo_width()
- self.buttons_panel.geometry("%sx%s+%s+%s" % (panel_width,
panel_height, panel_x, panel_y))
-
def OnConfigure(self, *unused):
- """Some widget configuration changed.
- """
+ '''Some widget configuration changed.
+ '''
+ self._debug(self.OnConfigure)
# <https://www.Tcl.Tk/man/tcl8.6/TkCmd/bind.htm#M12>
self._geometry = '' # force .OnResize in .OnTick, recursive?
-
- if self.is_buttons_panel_anchor_active:
- self._AnchorButtonsPanel()
-
- def OnFullScreen(self, *unused):
- """Toggle full screen, macOS only.
- """
- # <https://www.Tcl.Tk/man/tcl8.6/TkCmd/wm.htm#M10>
- f = not self.parent.attributes("-fullscreen") # or .wm_attributes
- if f:
- self._previouscreen = self.parent.geometry()
- self.parent.attributes("-fullscreen", f) # or .wm_attributes
- self.parent.bind("<Escape>", self.OnFullScreen)
- else:
- self.parent.attributes("-fullscreen", f) # or .wm_attributes
- self.parent.geometry(self._previouscreen)
- self.parent.unbind("<Escape>")
+ self._AnchorPanels()
def OnMute(self, *unused):
- """Mute/Unmute audio.
- """
+ '''Mute/Unmute audio.
+ '''
+ self._debug(self.OnMute)
+ self.buttonsPanel_clicked = False
# audio un/mute may be unreliable, see vlc.py docs.
self.volMuted = m = not self.volMuted # self.player.audio_get_mute()
self.player.audio_set_mute(m)
- u = "Unmute" if m else "Mute"
+ u = 'Unmute' if m else 'Mute'
self.fileMenu.entryconfig(self.muteIndex, label=u)
self.muteButton.config(text=u)
# update the volume slider text
self.OnVolume()
def OnOpen(self, *unused):
- """Pop up a new dialow window to choose a file, then play the selected
file.
- """
+ '''Pop up a new dialow window to choose a file, then play the selected
file.
+ '''
# if a file is already running, then stop it.
self.OnStop()
# Create a file dialog opened in the current home directory, where
- # you can display all kind of files, having as title "Choose a video".
- video = askopenfilename(initialdir = Path(expanduser("~")),
- title = "Choose a video",
- filetypes = (("all files", "*.*"),
- ("mp4 files", "*.mp4"),
- ("mov files", "*.mov")))
+ # you can display all kind of files, having as title 'Choose a video'.
+ video = askopenfilename(initialdir = Path(os.path.expanduser('~')),
+ title = 'Choose a video',
+ filetypes = (('all files', '*.*'),
+ ('mp4 files', '*.mp4'),
+ ('mov files', '*.mov')))
self._Play(video)
def _Pause_Play(self, playing):
# re-label menu item and button, adjust callbacks
p = 'Pause' if playing else 'Play'
- c = self.OnPlay if playing is None else self.OnPause
+ c = self.OnPlay if playing is None else self.OnPause # PYCHOK attr
self.fileMenu.entryconfig(self.playIndex, label=p, command=c)
# self.fileMenu.bind_shortcut('p', c) # XXX handled
self.playButton.config(text=p, command=c)
@@ -354,17 +447,17 @@
def _Play(self, video):
# helper for OnOpen and OnPlay
- if isfile(video): # Creation
+ if os.path.isfile(video): # Creation
m = self.Instance.media_new(str(video)) # Path, unicode
self.player.set_media(m)
- self.parent.title("tkVLCplayer - %s" % (basename(video),))
+ self.parent.title('tkVLCplayer - %s' % (os.path.basename(video),))
# set the window id where to render VLC's video output
- h = self.videopanel.winfo_id() # .winfo_visualid()?
+ h = self.canvas.winfo_id() # .winfo_visualid()?
if _isWindows:
self.player.set_hwnd(h)
elif _isMacOS:
- # XXX 1) using the videopanel.winfo_id() handle
+ # XXX 1) using the videoPanel.winfo_id() handle
# causes the video to play in the entire panel on
# macOS, covering the buttons, sliders, etc.
# XXX 2) .winfo_id() to return NSView on macOS?
@@ -376,29 +469,33 @@
else:
self.player.set_xwindow(h) # fails on Windows
# FIXME: this should be made cross-platform
- self.OnPlay()
+ self.OnPlay(None)
def OnPause(self, *unused):
- """Toggle between Pause and Play.
- """
+ '''Toggle between Pause and Play.
+ '''
+ self._debug(self.OnPause)
+ self.buttonsPanel_clicked = False
if self.player.get_media():
self._Pause_Play(not self.player.is_playing())
self.player.pause() # toggles
def OnPlay(self, *unused):
- """Play video, if none is loaded, open the dialog window.
- """
+ '''Play video, if not loaded, open the dialog window.
+ '''
+ self._debug(self.OnPlay)
+ self.buttonsPanel_clicked = False
# if there's no video to play or playing,
# open a Tk.FileDialog to select a file
if not self.player.get_media():
if self.video:
- self._Play(expanduser(self.video))
+ self._Play(os.path.expanduser(self.video))
self.video = ''
else:
self.OnOpen()
# Try to play, if this fails display an error message
elif self.player.play(): # == -1
- self.showError("Unable to play the video.")
+ self.showError('Unable to play the video.')
else:
self._Pause_Play(True)
# set volume slider to audio level
@@ -406,10 +503,12 @@
if vol > 0:
self.volVar.set(vol)
self.volSlider.set(vol)
+ self.OnResize()
def OnResize(self, *unused):
- """Adjust the window/frame to the video aspect ratio.
- """
+ '''Adjust the video panel to the video aspect ratio.
+ '''
+ self._debug(self.OnResize)
g = self.parent.geometry()
if g != self._geometry and self.player:
u, v = self.player.video_get_size() # often (0, 0)
@@ -429,12 +528,36 @@
else: # ... for portrait
# adjust the window width
w = round(float(h) * u / v)
- self.parent.geometry("%sx%s+%s+%s" % (w, h, x, y))
+ self.parent.geometry('%sx%s+%s+%s' % (w, h, x, y))
self._geometry = self.parent.geometry() # actual
+ self._AnchorPanels()
+
+ def OnScreen(self, *unused):
+ '''Toggle full/off screen.
+ '''
+ c = self.OnScreen
+ self._debug(c)
+ # <https://www.Tcl.Tk/man/tcl8.6/TkCmd/wm.htm#M10>
+ f = not self.parent.attributes('-fullscreen') # or .wm_attributes
+ if f:
+ self._previouscreen = self.parent.geometry()
+ self.parent.attributes('-fullscreen', f) # or .wm_attributes
+ self.parent.bind('<Escape>', c)
+ f = 'Off'
+ else:
+ self.parent.attributes('-fullscreen', f) # or .wm_attributes
+ self.parent.geometry(self._previouscreen)
+ self.parent.unbind('<Escape>')
+ f = 'Full'
+ f += ' Screen'
+ self.fileMenu.entryconfig(self.fullIndex, label=f, command=c)
+ # self.fileMenu.bind_shortcut('f', c) # XXX handled
def OnStop(self, *unused):
- """Stop the player, resets media.
- """
+ '''Stop the player, resets media.
+ '''
+ self._debug(self.OnStop)
+ self.buttonsPanel_clicked = False
if self.player:
self.player.stop()
self._Pause_Play(None)
@@ -448,8 +571,8 @@
# [h264 @ 0x7f84fb061200] no frame!
def OnTick(self):
- """Timer tick, update the time slider to the video time.
- """
+ '''Timer tick, update the time slider to the video time.
+ '''
if self.player:
# since the self.player.get_length may change while
# playing, re-set the timeSlider to the correct range
@@ -467,19 +590,18 @@
# adjust window to video aspect ratio, done periodically
# on purpose since the player.video_get_size() only
# returns non-zero sizes after playing for a while
- if not self._geometry:
- self.OnResize()
+ self.OnResize()
def OnTime(self, *unused):
if self.player:
t = self.timeVar.get()
if self.timeSliderLast != int(t):
- # this is a hack. The timer updates the time slider.
- # This change causes this rtn (the 'slider has changed' rtn)
- # to be invoked. I can't tell the difference between when
- # the user has manually moved the slider and when the timer
- # changed the slider. But when the user moves the slider
- # tkinter only notifies this rtn about once per second and
+ # This is a hack. The timer updates the time slider and
+ # that change causes this rtn (the 'slider has changed')
+ # to be invoked. I can't tell the difference between the
+ # user moving the slider manually and the timer changing
+ # the slider. When the user moves the slider, tkinter
+ # only notifies this method about once per second and
# when the slider has quit moving.
# Also, the tkinter notification value has no fractional
# seconds. The timer update rtn saves off the last update
@@ -496,62 +618,72 @@
self.timeSliderUpdate = time.time()
def OnVolume(self, *unused):
- """Volume slider changed, adjust the audio volume.
- """
+ '''Volume slider changed, adjust the audio volume.
+ '''
+ self._debug(self.OnVolume)
+ self.buttonsPanel_clicked = False
+ self.buttonsPanel_dragged = False
vol = min(self.volVar.get(), 100)
- v_M = "%d%s" % (vol, " (Muted)" if self.volMuted else '')
- self.volSlider.config(label="Volume " + v_M)
+ v_M = '%d%s' % (vol, ' (Muted)' if self.volMuted else '')
+ self.volSlider.config(label='Volume ' + v_M)
if self.player and not self._stopped:
# .audio_set_volume returns 0 if success, -1 otherwise,
# e.g. if the player is stopped or doesn't have media
if self.player.audio_set_volume(vol): # and
self.player.get_media():
- self.showError("Failed to set the volume: %s." % (v_M,))
+ self.showError('Failed to set the volume: %s.' % (v_M,))
def showError(self, message):
- """Display a simple error dialog.
- """
+ '''Display a simple error dialog.
+ '''
self.OnStop()
showerror(self.parent.title(), message)
-if __name__ == "__main__":
+if __name__ == '__main__': # MCCABE 13
+ _argv0 = sys.argv[0]
+ _debug = False
_video = ''
while len(sys.argv) > 1:
arg = sys.argv.pop(1)
if arg.lower() in ('-v', '--version'):
- # show all versions, sample output on macOS:
+ # show all versions, this vlc.py, libvlc, etc. (sample output on
macOS):
# % python3 ./tkvlc.py -v
- # tkvlc.py: 2019.07.28 (tkinter 8.6
/Library/Frameworks/Python.framework/Versions/3.7/lib/libtk8.6.dylib)
- # vlc.py: 3.0.6109 (Sun Mar 31 20:14:16 2019 3.0.6)
- # LibVLC version: 3.0.6 Vetinari (0x3000600)
- # LibVLC compiler: clang: warning: argument unused during
compilation: '-mmacosx-version-min=10.7' [-Wunused-command-line-argument]
- # Plugin path: /Applications/VLC3.0.6.app/Contents/MacOS/plugins
- # Python: 3.7.4 (64bit) macOS 10.13.6
-
- # Print version of this vlc.py and of the libvlc
- print('%s: %s (%s %s %s)' % (basename(__file__), __version__,
- Tk.__name__, Tk.TkVersion, libtk))
+ # tkvlc.py: 22.11.10
+ # tkinter: 8.6
+ # libTk:
/Library/Frameworks/Python.framework/Versions/3.11/lib/libtk8.6.dylib
+ # vlc.py: 3.0.12119 (Mon May 31 18:25:17 2021 3.0.12)
+ # libVLC: 3.0.16 Vetinari (0x3001000)
+ # plugins: /Applications/VLC.app/Contents/MacOS/plugins
+ # Python: 3.11.0 (64bit) macOS 13.0.1 arm64
+ for t in ((_argv0, __version__), (Tk.__name__, Tk.TkVersion),
('libTk', libtk)):
+ print('%s: %s' % t)
try:
vlc.print_version()
vlc.print_python()
except AttributeError:
pass
sys.exit(0)
-
+ elif '-debug'.startswith(arg) and len(arg) > 2:
+ _debug = True
+ elif '-dragging'.startswith(arg) and len(arg) > 2:
+ _dragging = True # detect dragging in buttons panel for Buttons
Up/Down
elif arg.startswith('-'):
- print('usage: %s [-v | --version] [<video_file_name>]' %
(sys.argv[0],))
+ print('usage: %s [-v | --version] [-debug] [-dragging]
[<video_file_name>]' % (_argv0,))
sys.exit(1)
-
elif arg: # video file
- _video = expanduser(arg)
- if not isfile(_video):
- print('%s error: no such file: %r' % (sys.argv[0], arg))
+ _video = os.path.expanduser(arg)
+ if not os.path.isfile(_video):
+ print('%s error: no such file: %r' % (_argv0, arg))
sys.exit(1)
# Create a Tk.App() to handle the windowing event loop
root = Tk.Tk()
- player = Player(root, video=_video)
- root.protocol("WM_DELETE_WINDOW", player.OnClose) # XXX unnecessary (on
macOS)
+ player = Player(root, video=_video, debug=_debug)
+ root.protocol('WM_DELETE_WINDOW', player.OnClose) # XXX unnecessary (on
macOS)
+ if _isWindows: # see
<https://GitHub.com/python/cpython/blob/3.11/Lib/tkinter/__init__.py>
+ root.iconify()
+ root.update()
+ root.deiconify()
root.mainloop()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/python-vlc-3.0.16120/python_vlc.egg-info/PKG-INFO
new/python-vlc-3.0.18121/python_vlc.egg-info/PKG-INFO
--- old/python-vlc-3.0.16120/python_vlc.egg-info/PKG-INFO 2022-02-28
20:33:24.000000000 +0100
+++ new/python-vlc-3.0.18121/python_vlc.egg-info/PKG-INFO 2022-11-16
12:06:24.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: python-vlc
-Version: 3.0.16120
+Version: 3.0.18121
Summary: VLC bindings for python.
Home-page: http://wiki.videolan.org/PythonBinding
Author: Olivier Aubert
@@ -9,7 +9,6 @@
Maintainer-email: [email protected]
License: LGPL-2.1+
Keywords: vlc,video
-Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: GNU Lesser General Public License v2 or
later (LGPLv2+)
@@ -31,6 +30,5 @@
player. Note that it relies on an already present install of VLC.
It has been automatically generated from the include files of
- vlc 3.0.16, using generator 1.20.
+ vlc 3.0.18, using generator 1.21.
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/python-vlc-3.0.16120/python_vlc.egg-info/SOURCES.txt
new/python-vlc-3.0.18121/python_vlc.egg-info/SOURCES.txt
--- old/python-vlc-3.0.16120/python_vlc.egg-info/SOURCES.txt 2022-02-28
20:33:24.000000000 +0100
+++ new/python-vlc-3.0.18121/python_vlc.egg-info/SOURCES.txt 2022-11-16
12:06:24.000000000 +0100
@@ -9,6 +9,7 @@
examples/gtk2vlc.py
examples/gtkvlc.py
examples/play_buffer.py
+examples/psgvlc.py
examples/pyobjcvlc.py
examples/pyqt5vlc.py
examples/qtvlc.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/python-vlc-3.0.16120/setup.py
new/python-vlc-3.0.18121/setup.py
--- old/python-vlc-3.0.16120/setup.py 2022-02-28 20:29:27.000000000 +0100
+++ new/python-vlc-3.0.18121/setup.py 2022-11-16 12:04:32.000000000 +0100
@@ -4,7 +4,7 @@
from setuptools import setup
setup(name='python-vlc',
- version = '3.0.16120',
+ version = '3.0.18121',
author='Olivier Aubert',
author_email='[email protected]',
maintainer='Olivier Aubert',
@@ -35,5 +35,5 @@
player. Note that it relies on an already present install of VLC.
It has been automatically generated from the include files of
- vlc 3.0.16, using generator 1.20.
+ vlc 3.0.18, using generator 1.21.
""")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/python-vlc-3.0.16120/vlc.py
new/python-vlc-3.0.18121/vlc.py
--- old/python-vlc-3.0.16120/vlc.py 2022-02-28 20:29:27.000000000 +0100
+++ new/python-vlc-3.0.18121/vlc.py 2022-11-16 12:04:29.000000000 +0100
@@ -51,10 +51,10 @@
import logging
logger = logging.getLogger(__name__)
-__version__ = "3.0.16120"
-__libvlc_version__ = "3.0.16"
-__generator_version__ = "1.20"
-build_date = "Mon Feb 28 20:29:27 2022 3.0.16"
+__version__ = "3.0.18121"
+__libvlc_version__ = "3.0.18"
+__generator_version__ = "1.21"
+build_date = "Wed Nov 16 12:04:29 2022 3.0.18"
# The libvlc doc states that filenames are expected to be in UTF8, do
# not rely on sys.getfilesystemencoding() which will be confused,
@@ -4915,6 +4915,18 @@
None, Instance, ctypes.c_int, ctypes.c_int,
ListPOINTER(ctypes.c_char_p))
return f(p_instance, i_id, i_options, ppsz_options)
+def libvlc_errmsg():
+ '''A human-readable error message for the last LibVLC error in the calling
+ thread. The resulting string is valid until another error occurs (at least
+ until the next LibVLC call).
+ @warning
+ This will be None if there was no error.
+ '''
+ f = _Cfunctions.get('libvlc_errmsg', None) or \
+ _Cfunction('libvlc_errmsg', (), None,
+ ctypes.c_char_p)
+ return f()
+
def libvlc_clearerr():
'''Clears the LibVLC error status for the current thread. This is optional.
By default, the error status is automatically overridden when a new error
@@ -8361,7 +8373,7 @@
# libvlc_printerr
# libvlc_set_exit_handler
-# 39 function(s) not wrapped as methods:
+# 40 function(s) not wrapped as methods:
# libvlc_audio_equalizer_get_band_count
# libvlc_audio_equalizer_get_band_frequency
# libvlc_audio_equalizer_get_preset_count
@@ -8378,6 +8390,7 @@
# libvlc_dialog_post_action
# libvlc_dialog_post_login
# libvlc_dialog_set_context
+# libvlc_errmsg
# libvlc_event_type_name
# libvlc_free
# libvlc_get_changeset
@@ -8475,6 +8488,38 @@
l.extend(sorted('%s=%s' % t for t in kwds.items()))
print('Debug callback (%s)' % ', '.join(l))
+def print_python():
+ from platform import architecture, machine, mac_ver, uname, win32_ver
+ if 'intelpython' in sys.executable:
+ t = 'Intel-'
+ # elif 'PyPy ' in sys.version:
+ # t = 'PyPy-'
+ else:
+ t = ''
+ t = '%sPython: %s (%s)' % (t, sys.version.split()[0], architecture()[0])
+ if win32_ver()[0]:
+ t = t, 'Windows', win32_ver()[0]
+ elif mac_ver()[0]:
+ t = t, ('iOS' if sys.platform == 'ios' else 'macOS'), mac_ver()[0],
machine()
+ else:
+ try:
+ import distro # <http://GitHub.com/nir0s/distro>
+ t = t, bytes_to_str(distro.name()), bytes_to_str(distro.version())
+ except ImportError:
+ t = (t,) + uname()[0:3:2]
+ print(' '.join(t))
+
+def print_version():
+ """Print version of this vlc.py and of the libvlc"""
+ try:
+ print('%s: %s (%s)' % (os.path.basename(__file__), __version__,
build_date))
+ print('libVLC: %s (%#x)' % (bytes_to_str(libvlc_get_version()),
libvlc_hex_version()))
+ # print('libVLC %s' % bytes_to_str(libvlc_get_compiler()))
+ if plugin_path:
+ print('plugins: %s' % plugin_path)
+ except Exception:
+ print('Error: %s' % sys.exc_info()[1])
+
if __name__ == '__main__':
logging.basicConfig(level=logging.DEBUG)
@@ -8506,38 +8551,6 @@
player.get_position() * 100))
sys.stdout.flush()
- def print_python():
- from platform import architecture, mac_ver, uname, win32_ver
- if 'intelpython' in sys.executable:
- t = 'Intel-'
- # elif 'PyPy ' in sys.version:
- # t = 'PyPy-'
- else:
- t = ''
- t = '%sPython: %s (%s)' % (t, sys.version.split()[0],
architecture()[0])
- if win32_ver()[0]:
- t = t, 'Windows', win32_ver()[0]
- elif mac_ver()[0]:
- t = t, ('iOS' if sys.platform == 'ios' else 'macOS'), mac_ver()[0]
- else:
- try:
- import distro # <http://GitHub.com/nir0s/distro>
- t = t, bytes_to_str(distro.name()),
bytes_to_str(distro.version())
- except ImportError:
- t = (t,) + uname()[0:3:2]
- print(' '.join(t))
-
- def print_version():
- """Print version of this vlc.py and of the libvlc"""
- try:
- print('%s: %s (%s)' % (os.path.basename(__file__), __version__,
build_date))
- print('LibVLC version: %s (%#x)' %
(bytes_to_str(libvlc_get_version()), libvlc_hex_version()))
- print('LibVLC compiler: %s' % bytes_to_str(libvlc_get_compiler()))
- if plugin_path:
- print('Plugin path: %s' % plugin_path)
- except Exception:
- print('Error: %s' % sys.exc_info()[1])
-
if '-h' in sys.argv[:2] or '--help' in sys.argv[:2]:
print('Usage: %s [options] <movie_filename>' % sys.argv[0])
print('Once launched, type ? for help.')