]> git.sesse.net Git - vlc/blobdiff - bindings/python-ctypes/header.py
python: remove get_vlc_id
[vlc] / bindings / python-ctypes / header.py
index e81c6f8fdcef805254eeeab1f5cf2d2c2fc49e00..cfe047b0e9375c5e2ff58402c02b1855ade12a18 100755 (executable)
@@ -33,6 +33,7 @@ create a libvlc Instance. From this instance, you can then create
 L{MediaPlayer} and L{MediaListPlayer} instances.
 """
 
+import logging
 import ctypes
 import sys
 
@@ -46,11 +47,26 @@ elif sys.platform == 'win32':
     plugin_path=None
     path=ctypes.util.find_library('libvlc.dll')
     if path is None:
-        # Try a standard location.
-        p='c:\\Program Files\\VideoLAN\\VLC\\libvlc.dll'
-        if os.path.exists(p):
-            plugin_path=os.path.dirname(p)
-            os.chdir(plugin_path)
+        # Try to use registry settings
+        import _winreg
+        plugin_path_found = None
+        subkey, name = 'Software\\VideoLAN\\VLC','InstallDir'
+        for hkey in _winreg.HKEY_LOCAL_MACHINE, _winreg.HKEY_CURRENT_USER:
+            try:
+                reg = _winreg.OpenKey(hkey, subkey)
+                plugin_path_found, type_id = _winreg.QueryValueEx(reg, name)
+                _winreg.CloseKey(reg)
+                break
+            except _winreg.error:
+                pass
+        if plugin_path_found:
+            plugin_path = plugin_path_found
+        else:
+            # Try a standard location.
+            p='c:\\Program Files\\VideoLAN\\VLC\\libvlc.dll'
+            if os.path.exists(p):
+                plugin_path=os.path.dirname(p)
+        os.chdir(plugin_path)
         # If chdir failed, this will not work and raise an exception
         path='libvlc.dll'
     else:
@@ -76,19 +92,42 @@ class LibVLCException(Exception):
     pass
 
 # From libvlc_structures.h
-class VLCException(ctypes.Structure):
-    """libvlc exception.
-    """
-    _fields_= [
-                ('raised', ctypes.c_int),
-                ('code', ctypes.c_int),
-                ('message', ctypes.c_char_p),
-                ]
-    def init(self):
-        libvlc_exception_init(self)
 
-    def clear(self):
-        libvlc_exception_clear(self)
+# This is version-dependent, depending on the presence of libvlc_exception_get_message.
+
+if hasattr(dll, 'libvlc_exception_get_message'):
+    # New-style message passing
+    class VLCException(ctypes.Structure):
+        """libvlc exception.
+        """
+        _fields_= [
+                    ('raised', ctypes.c_int),
+                    ]
+
+        @property
+        def message(self):
+            return dll.libvlc_exception_get_message()
+
+        def init(self):
+            libvlc_exception_init(self)
+
+        def clear(self):
+            libvlc_exception_clear(self)
+else:
+    # Old-style exceptions
+    class VLCException(ctypes.Structure):
+        """libvlc exception.
+        """
+        _fields_= [
+                    ('raised', ctypes.c_int),
+                    ('code', ctypes.c_int),
+                    ('message', ctypes.c_char_p),
+                    ]
+        def init(self):
+            libvlc_exception_init(self)
+
+        def clear(self):
+            libvlc_exception_clear(self)
 
 class PlaylistItem(ctypes.Structure):
     _fields_= [
@@ -186,10 +225,13 @@ def check_vlc_exception(result, func, args):
     """Error checking method for functions using an exception in/out parameter.
     """
     ex=args[-1]
+    if not isinstance(ex, (VLCException, MediaControlException)):
+        logging.warn("python-vlc: error when processing function %s. Please report this as a bug to vlc-devel@videolan.org" % str(func))
+        return result
     # Take into account both VLCException and MediacontrolException:
     c=getattr(ex, 'raised', getattr(ex, 'code', 0))
     if c:
-        raise LibVLCException(args[-1].message)
+        raise LibVLCException(ex.message)
     return result
 
 ### End of header.py ###