Skip to content

Commit

Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix compilation for Python3.12
Browse files Browse the repository at this point in the history
supermihi committed Nov 17, 2023

Verified

This commit was signed with the committer’s verified signature.
pradyunsg Pradyun Gedam
1 parent 7f86ace commit 23ee899
Showing 2 changed files with 18 additions and 11 deletions.
21 changes: 16 additions & 5 deletions src/ctypes.pxd
Original file line number Diff line number Diff line change
@@ -11,6 +11,8 @@ from libc.stddef cimport wchar_t
from libcpp.list cimport list
from libcpp.map cimport map
from libcpp.string cimport string
from cpython.mem cimport PyMem_Free
from cpython.object cimport PyObject


cdef extern from 'taglib/tstring.h' namespace 'TagLib::String':
@@ -60,12 +62,21 @@ cdef extern from 'taglib/tfile.h' namespace 'TagLib':
void removeUnsupportedProperties(StringList&)


cdef extern from 'taglib/fileref.h' namespace 'TagLib::FileRef':
IF UNAME_SYSNAME == "Windows":
cdef File* create(const Py_UNICODE*) except +
ELSE:
IF UNAME_SYSNAME == "Windows":
cdef extern from 'taglib/fileref.h' namespace 'TagLib::FileRef':
cdef File * create(const wchar_t *) except +
cdef extern from "Python.h":
cdef wchar_t *PyUnicode_AsWideCharString(PyObject *path, Py_ssize_t *size)
cdef inline File* create_wrapper(object path):
cdef wchar_t *wchar_path = PyUnicode_AsWideCharString(path, NULL)
cdef File * file = create(wchar_path)
PyMem_Free(wchar_path)
return file
ELSE:
cdef extern from 'taglib/fileref.h' namespace 'TagLib::FileRef':
cdef File* create(const char*) except +

cdef inline File* create_wrapper(unicode path):
return create(path.encode('utf-8'))

cdef extern from 'taglib/taglib.h':
int TAGLIB_MAJOR_VERSION
8 changes: 2 additions & 6 deletions src/taglib.pyx
Original file line number Diff line number Diff line change
@@ -40,6 +40,7 @@ cdef dict propertyMapToDict(ctypes.PropertyMap map):
return dct



cdef class File:
"""Class representing an audio file with metadata ("tags").
@@ -80,12 +81,7 @@ cdef class File:
path = path.decode('utf8')
path = Path(path)
self.path = path
IF UNAME_SYSNAME == "Windows":
# create on windows takes wchar_t* which Cython automatically converts to
# from unicode strings
self.cFile = ctypes.create(str(self.path))
ELSE:
self.cFile = ctypes.create(str(self.path).encode('utf8'))
self.cFile = ctypes.create_wrapper(str(self.path))
if not self.cFile or not self.cFile.isValid():
raise OSError(f'Could not read file {path}')

0 comments on commit 23ee899

Please sign in to comment.