From 23e0d9689e9e5297bd78f4dc0bf0aa679122ce95 Mon Sep 17 00:00:00 2001 From: "M. Dietrich" Date: Tue, 14 Aug 2012 15:36:42 +0200 Subject: [PATCH] add _destroy code for created objects via _new --- TODO | 2 + examples/backup.py | 6 ++- examples/createplaylist.py | 18 ++++----- libmtp.pxd | 76 +++++++++++++++++++------------------- mtp.pyx | 23 ++++++++++-- 5 files changed, 73 insertions(+), 52 deletions(-) diff --git a/TODO b/TODO index 2984da3..31ed9c5 100644 --- a/TODO +++ b/TODO @@ -7,3 +7,5 @@ Missing: - shell - test more devices + + - fix filenames and unicode... diff --git a/examples/backup.py b/examples/backup.py index bfa60a6..63888af 100755 --- a/examples/backup.py +++ b/examples/backup.py @@ -39,13 +39,17 @@ def main(root='.'): for object_id, _object in objects.items(): if (_object['filetype'] != 'FOLDER' # here you could filter files, i.e. by name: - #and _object['name'].startswith('IMG_') + and '20120813' in _object['name'] + and _object['filetype'] == 'JPEG' + # and 'mp4' in _object['name'] ): name = base + '/' + determine_name(objects, **_object) print('{} {} {filetype}'.format(object_id, name, **_object)) try: makedirs(dirname(name)) except: pass mtp.get_file_to_file(object_id, name) + else: + pass # print('{}: {}'.format(object_id, _object)) except: for n in mtp.get_errorstack(): print('{errornumber}: {error_text}'.format(**n)) diff --git a/examples/createplaylist.py b/examples/createplaylist.py index 138f7a7..732f292 100755 --- a/examples/createplaylist.py +++ b/examples/createplaylist.py @@ -18,16 +18,14 @@ def upload_track(mtp, parent_id, source): def main(name, *files): with MediaTransfer() as mtp: try: - parent_id = mtp.get_deviceinfo()['default_music_folder'] or 0xffffffff - if 1: - tracks = 3605, 3606, - else: - tracks = list() - for track in files: - track = upload_track(mtp, parent_id, track) - tracks.append(track) - parent_id = mtp.get_deviceinfo()['default_playlist_folder'] or 0 - object_id = mtp.create_playlist(name, tracks, parent_id) +# parent_id = mtp.get_deviceinfo()['default_music_folder'] or 0xffffffff +# tracks = list() +# for track in files: +# track = upload_track(mtp, parent_id, track) +# tracks.append(track) +# parent_id = mtp.get_deviceinfo()['default_playlist_folder'] or 0 +# object_id = mtp.create_playlist(name, tracks, parent_id) + object_id = mtp.create_playlist(name, [4265, ]) print("Created new playlist with ID: {object_id}".format(object_id=object_id)) except Exception, e: for n in mtp.get_errorstack(): diff --git a/libmtp.pxd b/libmtp.pxd index 4a5ae2c..44d6452 100644 --- a/libmtp.pxd +++ b/libmtp.pxd @@ -2,40 +2,8 @@ # Generated by command /home/mdt/Source/oss/cython-codegen/scripts/xml2cython.py -o libmtp.pxd -l libmtp libmtp.h libmtp.xml # Codegenlib version 0.3dev cdef extern from 'libmtp.h': - ctypedef unsigned int uint32_t - ctypedef unsigned int uint32_t - cdef struct LIBMTP_folder_struct: - uint32_t folder_id - uint32_t parent_id - uint32_t storage_id - char * name - LIBMTP_folder_struct * sibling - LIBMTP_folder_struct * child - ctypedef unsigned int uint32_t - ctypedef unsigned int uint32_t - cdef struct LIBMTP_folder_struct: - uint32_t folder_id - uint32_t parent_id - uint32_t storage_id - char * name - LIBMTP_folder_struct * sibling - LIBMTP_folder_struct * child - cdef struct LIBMTP_folder_struct: - uint32_t folder_id - uint32_t parent_id - uint32_t storage_id - char * name - LIBMTP_folder_struct * sibling - LIBMTP_folder_struct * child - cdef struct LIBMTP_folder_struct: - uint32_t folder_id - uint32_t parent_id - uint32_t storage_id - char * name - LIBMTP_folder_struct * sibling - LIBMTP_folder_struct * child - ctypedef LIBMTP_folder_struct LIBMTP_folder_t ctypedef unsigned char uint8_t + ctypedef unsigned int uint32_t ctypedef short unsigned int uint16_t ctypedef long unsigned int uint64_t ctypedef unsigned int uint32_t @@ -349,6 +317,38 @@ cdef extern from 'libmtp.h': int cached LIBMTP_mtpdevice_struct * next ctypedef LIBMTP_mtpdevice_struct LIBMTP_mtpdevice_t + ctypedef unsigned int uint32_t + cdef struct LIBMTP_folder_struct: + uint32_t folder_id + uint32_t parent_id + uint32_t storage_id + char * name + LIBMTP_folder_struct * sibling + LIBMTP_folder_struct * child + ctypedef unsigned int uint32_t + ctypedef unsigned int uint32_t + cdef struct LIBMTP_folder_struct: + uint32_t folder_id + uint32_t parent_id + uint32_t storage_id + char * name + LIBMTP_folder_struct * sibling + LIBMTP_folder_struct * child + cdef struct LIBMTP_folder_struct: + uint32_t folder_id + uint32_t parent_id + uint32_t storage_id + char * name + LIBMTP_folder_struct * sibling + LIBMTP_folder_struct * child + cdef struct LIBMTP_folder_struct: + uint32_t folder_id + uint32_t parent_id + uint32_t storage_id + char * name + LIBMTP_folder_struct * sibling + LIBMTP_folder_struct * child + ctypedef LIBMTP_folder_struct LIBMTP_folder_t int LIBMTP_Set_Folder_Name(LIBMTP_mtpdevice_t *, LIBMTP_folder_t *, char *) cdef enum: LIBMTP_FILETYPE_FOLDER = 0 @@ -884,7 +884,6 @@ cdef extern from 'libmtp.h': int LIBMTP_Get_Secure_Time(LIBMTP_mtpdevice_t *, char * *) ctypedef int(*LIBMTP_progressfunc_t)(uint64_t, uint64_t, void *) int LIBMTP_Get_File_To_File(LIBMTP_mtpdevice_t *, uint32_t, char *, LIBMTP_progressfunc_t, void *) - int LIBMTP_Set_File_Name(LIBMTP_mtpdevice_t *, LIBMTP_file_t *, char *) ctypedef unsigned int uint32_t cdef struct LIBMTP_playlist_struct: uint32_t playlist_id @@ -1940,6 +1939,7 @@ cdef extern from 'libmtp.h': LIBMTP_PROPERTY_UNKNOWN = 167 int LIBMTP_Set_Object_u16(LIBMTP_mtpdevice_t *, uint32_t, int, uint16_t) int LIBMTP_Set_Syncpartner(LIBMTP_mtpdevice_t *, char *) + LIBMTP_mtpdevice_t * LIBMTP_Get_First_Device() char * LIBMTP_Get_Friendlyname(LIBMTP_mtpdevice_t *) int LIBMTP_Set_Album_Name(LIBMTP_mtpdevice_t *, LIBMTP_album_t *, char *) cdef enum: @@ -2492,7 +2492,7 @@ cdef extern from 'libmtp.h': void LIBMTP_Dump_Errorstack(LIBMTP_mtpdevice_t *) void LIBMTP_Set_Debug(int) LIBMTP_folder_t * LIBMTP_Get_Folder_List(LIBMTP_mtpdevice_t *) - int LIBMTP_Get_Storage(LIBMTP_mtpdevice_t *, int) + int LIBMTP_Send_Track_From_File_Descriptor(LIBMTP_mtpdevice_t *, int, LIBMTP_track_t *, LIBMTP_progressfunc_t, void *) LIBMTP_file_t * LIBMTP_new_file_t() char * LIBMTP_Get_Filetype_Description(LIBMTP_filetype_t) LIBMTP_file_t * LIBMTP_Get_Filelisting(LIBMTP_mtpdevice_t *) @@ -3541,7 +3541,7 @@ cdef extern from 'libmtp.h': LIBMTP_PROPERTY_UNKNOWN = 167 char * LIBMTP_Get_Property_Description(int) int LIBMTP_Set_Object_Filename(LIBMTP_mtpdevice_t *, uint32_t, char *) - int LIBMTP_Delete_Object(LIBMTP_mtpdevice_t *, uint32_t) + int LIBMTP_Set_File_Name(LIBMTP_mtpdevice_t *, LIBMTP_file_t *, char *) void LIBMTP_destroy_album_t(LIBMTP_album_t *) int LIBMTP_Send_File_From_File(LIBMTP_mtpdevice_t *, char *, LIBMTP_file_t *, LIBMTP_progressfunc_t, void *) int LIBMTP_Format_Storage(LIBMTP_mtpdevice_t *, LIBMTP_devicestorage_t *) @@ -5160,7 +5160,7 @@ cdef extern from 'libmtp.h': LIBMTP_folder_t * LIBMTP_Find_Folder(LIBMTP_folder_t *, uint32_t) LIBMTP_playlist_t * LIBMTP_Get_Playlist(LIBMTP_mtpdevice_t *, uint32_t) LIBMTP_playlist_t * LIBMTP_new_playlist_t() - int LIBMTP_Send_Track_From_File_Descriptor(LIBMTP_mtpdevice_t *, int, LIBMTP_track_t *, LIBMTP_progressfunc_t, void *) + int LIBMTP_Get_Storage(LIBMTP_mtpdevice_t *, int) cdef enum: LIBMTP_PROPERTY_StorageID = 0 cdef enum: @@ -5669,7 +5669,7 @@ cdef extern from 'libmtp.h': int LIBMTP_Get_Allowed_Property_Values(LIBMTP_mtpdevice_t *, int, LIBMTP_filetype_t, LIBMTP_allowed_values_t *) int LIBMTP_Get_Supported_Filetypes(LIBMTP_mtpdevice_t *, uint16_t * *, uint16_t *) int LIBMTP_Send_File_From_File_Descriptor(LIBMTP_mtpdevice_t *, int, LIBMTP_file_t *, LIBMTP_progressfunc_t, void *) - LIBMTP_mtpdevice_t * LIBMTP_Get_First_Device() + int LIBMTP_Delete_Object(LIBMTP_mtpdevice_t *, uint32_t) cdef enum: LIBMTP_PROPERTY_StorageID = 0 cdef enum: diff --git a/mtp.pyx b/mtp.pyx index ea92a46..47a3900 100644 --- a/mtp.pyx +++ b/mtp.pyx @@ -21,6 +21,7 @@ cdef extern from 'stdlib.h': void* malloc(int) void free(void*) ctypedef char* const_char_ptr 'const char*' + char* strdup(const_char_ptr) from libmtp cimport * @@ -423,8 +424,9 @@ cdef class MediaTransfer(object): current.parent_id = parent_id current.filetype = self.find_filetype(source) current.filesize = stat(source).st_size - print('sending starts') r = LIBMTP_Send_File_From_File(self.device, source, current, NULL, NULL) + current.filename = NULL + LIBMTP_destroy_file_t(current) if r != 0: raise Exception('LIBMTP_Send_File_From_File error={}'.format(r)) return dict( @@ -441,7 +443,7 @@ cdef class MediaTransfer(object): album=None, artist=None, bitrate=None, bitratetype=None, composer=None, date=None, duration=None, filename=None, genre=None, name=None, nochannels=None, rating=None, samplerate=None, - title=None, tracknumber=None, usecount=None, wavecodec=None, ): + title=None, tracknumber=None, usecount=None, wavecodec=None, **unused): cdef LIBMTP_track_t* current = NULL cdef int r = 0 if not self.device: @@ -476,6 +478,14 @@ cdef class MediaTransfer(object): if usecount : current.usecount = int(usecount) if wavecodec : current.wavecodec = int(wavecodec) r = LIBMTP_Send_Track_From_File(self.device, source, current, NULL, NULL) + current.album = NULL + current.artist = NULL + current.composer = NULL + current.date = NULL + current.filename = NULL + current.genre = NULL + current.title = NULL + LIBMTP_destroy_track_t(current) if r != 0: raise Exception('LIBMTP_Send_Track_From_File error={}'.format(r)) return dict( @@ -535,6 +545,7 @@ cdef class MediaTransfer(object): current.parent_id = int(parent_id) current.storage_id = int(storage_id) current.name = name + current.next = NULL current.tracks = NULL current.no_tracks = int(len(tracks)) if current.no_tracks > 0: @@ -544,9 +555,13 @@ cdef class MediaTransfer(object): r = LIBMTP_Create_New_Playlist(self.device, current) if current.tracks != NULL: free(current.tracks) + current.tracks = NULL # libmtp will free() this otherwise + current.name = NULL # libmtp will free() this otherwise + object_id = current.playlist_id + LIBMTP_destroy_playlist_t(current) if r < 0: raise Exception('LIBMTP_Create_New_Playlist error={}'.format(r)) - return current.playlist_id + return object_id def update_playlist(self, **metadata): cdef LIBMTP_playlist_t* current = NULL @@ -557,6 +572,8 @@ cdef class MediaTransfer(object): if current == NULL: raise Exception('LIBMTP_new_playlist_t failed') r = LIBMTP_Update_Playlist(self.device, current) + current.name = NULL # libmtp will free() this otherwise + LIBMTP_destroy_playlist_t(current) if r < 0: raise Exception('LIBMTP_Update_Playlist error={}'.format(r)) return current.playlist_id